继续看efi_stub_entry。 在efi_main函数返回后,第四行代码把之前保存在rbx里的boot_params的地址,拷贝到了rsi里。 第五行代码将startup_64函数的编译时地址,加到了rax寄存器里,也就是加到了startup_32函数运行时的地址上,这样rax里存放的地址,就是运行时的startup_64函数的地址了。 为什么这样相加就是startup...
接下来调用efi_allocate_pages函数,创建了一个boot_params实例,并将各字段初始化为0。 boot_params又被称为zeropage,该结构体用来存放各种启动参数,供后续启动kernel使用,其具体结构如下: 接下来pe_efi_entry又调用memcpy,将加载到内存的bzImage的第二个sector的内容,拷贝到boot_params里的setup_header里,拷贝的起始...
//一般默认为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...
在历史上(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参数放置到相应的全局...
解压缩后的内核文件 vmlinux 的入口函数是arch/x86/kernel/head_32.S::startup_32中的startup_32(32位内核的入口函数),在这个函数中会拷贝boot_params结构体变量以及boot_command_line,初始化页表,开启分页机制。startup_32() 汇编代码会接着调用init/main.c:start_kernel()函数,这是Linux 内核的启动函数。in...
main() 中的几个函数调用都有比较详细的注释,主要作用是初始化 boot_params,将来会经常被用到。 include/asm/bootparam.h 中定义的 boot_params 结构体 (即 zeropage) 在此完成初始化: copy_boot_params() 初始化 boot_params.hdr (将 hdr 复制过来) ...
setup_start_tag (bd); //设置ATAG_CORE,这里面有params = (struct tag *) bd->bi_boot_params; 参数地址 kernel_entry(0, machid, bd->bi_boot_params); r0 = 0 r1 = machid r2 = bd->bi_boot_params) bd->bi_boot_params在board下对应的板子目录下 ...
2、参数if (mdesc->boot_params)tags = phys_to_virt(mdesc->boot_params);b.是通过标签atag来辨别的,uboot中有相应的标签字,将相应的uboot 参数放置到相应的全局变量中。讦(tags->hdr.tag = atag_core) 已经被fix叩函数修改,则将atag中的mem段置为noneif (meminfo.nr_banks != 0) squash_mem_tag...