启动过程
开发板启动过程
开发板上电后首先运行SOC内部iROM中固化的代码(BL0),BL0这段代码会对基本的软硬件环境(时钟和内存做一些初始化),然后再检测启动方式,将对应存储器中的uboot搬移到内存,然后跳转到uboot运行
uboot开始运行后先对开发板上的软硬件环境做进一步初始化,然后将Linux内核、设备树(dtb)、根文件系统(rootfs)从外部存储器(或者是网络)搬移到内存,然后跳转到Linux运行
linux开始运行后对系统环境做初始化,当系统启动完成后,Linux再从内存中(或网络)挂载根文件系统
内核启动之前bootloader会作什么操作?
ARM 启动协议 Documentation/arm/Booting
1. Setup and initialise the RAM. //设置并初始化RAM
2. Initialise one serial port. //初始化一个串口
3. Detect the machine type. //检测机器类型
4. Setup boot data. //设置启动数据
setup the kernel tagged list
ATAG_CORE 2个字节
ATAG_NONE 0个字节
5. Load initramfs. //initramfs放在内核解压缩覆盖不到的地方
6. Call the kernel image.
关闭DMA
设置cpu寄存器
r0 = 0
r1 = 机器类型码(基本不用了)
r2 = 标记列表在RAM的地址或设备树在RAM中的地址(设备树将命令行参数传入了内核)
失能中断和快速中断
让cpu处于svc模式
cpu支持虚拟化
关闭MMU
关闭cache
Linux启动过程
1.自解压程序
2.执行汇编函数stext
3.执行cpu初始化
4.执行start_kernel函数
5.创建1号进程:kernel_init函数
6.执行run_init_process
内核自解压流程
在执行完.start这个节之后,将自己往高地址搬移,将解压后的内核放在入口
从start_kernel到init进程
内核入口
内核有两个链接脚本
arch/arm/kernel/vmlinux.lds
//未压缩的内核
arch/arm/boot/compressed/vmlinux.lds
//压缩内核
未压缩的内核执行的第一个汇编函数是stext
arm/boot/compressed/vmlinux.lds
//压缩内核
**未压缩的内核执行的第一个汇编函数是stext**
**内核第一个c语言函数:start_kernel(void)**