linux在arm上启动过程分析
*内容主要来源于阅读linux-4.4.1/Documentation/arm中和链接: Boot Sequence。
启动过程
从大的方面来讲主要包含四个步骤:
Boot sequence (in order)
- Boot ROM
- X-loader
- U-boot
- Linux
不去细说其中的细节,主要找找u-boot和linux内核在源代码中的具体位置
u-boot
u-boot,也就是bootloader,需要完成以下几个功能:
- Setup and initialise the RAM.
- Initialise one serial port.
- Detect the machine type.
- Setup the kernel tagged list.
- Load initramfs.(可选的)
- Call the kernel image.
在linux源码中,u-boot对应 linux-4.4.1/arch/arm/boot/bootp/init.S
在同一个目录下的bootp.lds文件制定了生成的u-boot文件的格式。
bootp.lds文件如下所示:
第一行:OUTPUT_ARCH(arm)指定了cpu的类型,这正是u-boot的功能3。
第二行:ENTRY(_start) 指定了u-boot的开始执行的位置,其中的 _start可以在init.S之中找到,也就是说init.S就是u-boot的执行部分。
linux kernel的启动
在执行完u-boot,做好了所有为kernel启动准备的工作,就会执行一条语句:
b kernel_start @ call kernel
这可以在init.S的taglist之中找到

从这时候开始,kernel正式启动。
现在关键点是找到启动的位置kernel_start。
kernel_start可以在init.S的同一个目录下的kernel.S文件中找到,kernel.S的内容如下:
文件中定义了一个标记kernel_start,然后发现启动位置正是zImage的第一条代码;
而kernel的真正启动的第一个代码在文件 kernel/head.S之中。
从这里开始,kernel就开始真正的运行了。
版权声明:本文为jundlg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。