心细的读者可能猜到,该boot_params.hdr.code32_start就是在x86/boot/header.S中的code32_start变量,对,前面提到的main函数会将boot/header.S中从hdr标号处开始的变量拷贝的boot_params.hdr中,不过这个值不再是0,因为在内核被boot loader加载入内存后,boot_loader会将该值修改为被压缩内核真正所在的内存位置。 ...
arch/x86/boot/header.S:启动代码的汇编部分,定义了内核入口点。 arch/x86/boot/compressed/head_64.S 和 arch/x86/boot/compressed/misc.c:解压缩代码。 arch/x86/kernel/head_64.S 和 arch/x86/kernel/head.c:解压后的内核启动代码。 3.2.2 主要步骤 3.2.2.1 启动加载程序跳转到内核入口点: BootLoader根...
start_kernel函数是在__mmap_switched函数内调用的。 上图的line 146指示将__mmap_switched的地址赋给R13,在line 158的__enable_mmu函数内的__turn_mmu_on函数内执行R13,成功进入start_kernel. __INIT__mmap_switched:movr7,r1movr8,r2movr10,r0adrr4,__mmap_switched_datamovfp,#0#ifdefined(CONFIG_XIP_...
还需要执行mount /boot命令: [root@rocky08-host ~]# mount /boot 挂载/boot后,执行一些管理任务,例如删除在 GRUB 中使用的 systemd.unit=emergency.target 参数: [root@rocky08-host ~]# grubby --remove-args="systemd.unit=emergency.target" --update-kernel=$(grubby --default-kernel) 系统又能正常启...
1 kernel运行的史前时期 在arm平台下,zImage.bin压缩镜像是由bootloader加载到物理内存,然后跳到zImage.bin里一段程序,它专门用于将被压缩的kernel解压缩到KERNEL_RAM_PADDR开始的一段内存中,接着跳进真正的kernel去执行。该kernel的执行起点是stext函数,定义于arch/arm/kernel/head.S。 ARM Linux kernel将SDRAM的...
stext 是 Linux 内核的入口地址,在文件 arch/arm/kernel/head.S 中有如下所示提示内容 如图可知:如果要启动Linux,启动要求如下: 关闭MMU。 关闭D-cache。 I-Cache 无所谓。 r0=0。 r1=machine nr(也就是机器 ID)。 r2=atags 或者设备树(dtb)首地址。
有关boot_params的创建及其hdr的初始化,我们在 linux内核启动流程分析 - efi_pe_entry 中有讲到,这里就不再赘述。 继续看该函数的其余部分。 该部分主要讲在某些情况下,加载到内存的kernel需要被移动到合适的位置。 710行通过将bzimage_addr和image_offset相减,计算出kernel被加载到内存时的起始地址。
start_kernel涉及大量初始化工作,只例举重要的初始化工作。 asmlinkage void __init start_kernel(void) { …… //类型判断 smp_setup_processor_id(); //smp相关,返回启动CPU号 …… local_irq_disable(); //关闭当前CPU中断 early_boot_irqs_disabled = true; ...
handle指向的是运行时的kernel,sys_table_arg指向的是uefi的system table(有了system table,就可以使用uefi的各种服务,比如输入输出、boot service、runtime service等)。 接下来该函数验证了system table中的signature是否等于uefi specification中定义的signature,以此来判断该次启动是否用的是uefi方式。