继续看efi_stub_entry。 在efi_main函数返回后,第四行代码把之前保存在rbx里的boot_params的地址,拷贝到了rsi里。 第五行代码将startup_64函数的编译时地址,加到了rax寄存器里,也就是加到了startup_32函数运行时的地址上,这样rax里存放的地址,就是运行时的startup_64函数的地址了。 为什么这样相加就是startup...
在历史上(Linux版本<=2.4,那时候还在用软盘),直接由这一部分对内核进行内核的信息收集(如显示信息,内存信息等,通过BIOS的变量boot_params获取),以及把内核加载进内存里。 现今 但后来人们制定了32位启动协议(32-bit boot protocol),bo...
A.先获得bootargs的地址,uboot传进来的参数是放在30000100的地方的 //一般默认为0x30000100位置//boot_params如果为0则表示bootloader没有传参数 if (mdesc->boot_params) tags = phys_to_virt(mdesc->boot_params); B.是通过标签ATAG来辨别的,uboot中有相应的标签字,将相应的uboot参数放置到相应的全局变量中...
kexec可从当前正在运行的内核直接跳转到新内核,kexec整体思路如下 新的kernel镜像和initrd镜像连续存储在内存中,initrd的位置记录在boot_params中 切换到新内核就是跳转到新的kernel镜像所在内存位置,CPU执行其entry的代码即可,新的内核通过boot_params记录的initrd位置完成根文件系统内容的加载 术语 生产内核(production ker...
我们可以看出这个结构体大概是存储硬件信息。nr存放机器ID,name存放单板名称,phys_io存放输入输出口,io_pg_offst存放IO的偏移地址,boot_params存放uboot传给内核的启动参数(TAG),init_irq存放的是中断初始化信息,map_io为IO的映射表,init_machine存放的是单板的初始化信息,timer存放的是单板的定时器信息。
copy_boot_params copy_boot_params是main函数调用的第一个函数,它完成了两个工作: 把header.S中的hdr拷贝到boot_params中。 如果kernel用的是旧式命令行协议,就更新为kernel的命令行。 console_init 初始化console。 init_heap 初始化堆。还是在实模式中建立,堆的上限不能超过栈的下限。
A. 先获得bootargs的地址,uboot传进来的参数是放在30000100的地方的 //一般默认为0x30000100位置//boot_params 如果为0则表示bootloader没有传参数 if (mdesc->boot_params) tags = phys_to_virt(mdesc->boot_params); B. 是通过标签ATAG来辨别的, uboot中有相应的标签字,将相应的uboot参数放置到相应的全局...
main() 中的几个函数调用都有比较详细的注释,主要作用是初始化 boot_params,将来会经常被用到。 include/asm/bootparam.h 中定义的 boot_params 结构体 (即 zeropage) 在此完成初始化: copy_boot_params() 初始化 boot_params.hdr (将 hdr 复制过来) ...
我们可以看出这个结构体大概是存储硬件信息。nr存放机器ID,name存放单板名称,phys_io存放输入输出口,io_pg_offst存放IO的偏移地址,boot_params存放uboot传给内核的启动参数(TAG),init_irq存放的是中断初始化信息,map_io为IO的映射表,init_machine存放的是单板的初始化信息,timer存放的是单板的定时器信息。
boot_params又被称为zeropage,该结构体用来存放各种启动参数,供后续启动kernel使用,其具体结构如下: 接下来pe_efi_entry又调用memcpy,将加载到内存的bzImage的第二个sector的内容,拷贝到boot_params里的setup_header里,拷贝的起始位置为setup_header里的jump字段。