启动过程!!!

启动过程

开发板启动过程

在这里插入图片描述

开发板上电后首先运行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)**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值