BIOS
从加电开始,硬件电路在CPU引脚上产生reset,设置处理的一些寄存器值。
从物理地址0xfffffff0处找到代码,硬件将此地址映射到一个ROM中,即BIOS存放位置。
- 对硬件执行一些测试,检测设备以及是否正常
- 初始化硬件设备,显示PCI设备列表
- 搜索一个操作系统来启动,从硬件的第一个扇区(引导扇区)
- 找到一个有效设备,就把第一个扇区的内容拷贝到RAM中从物理地址0x00007c00开始的位置,然后执行这部分代码
Boot loader
由BIOS用来把操作系统的内核影像装载到RAM中所调用的一个程序
硬盘的第一个扇区称为主引导记录(master boot record,MBR)该扇区包括分区表和一个小程序,这个小程序用来装载被启动的操作系统所在分区的第一个扇区的。
setup() 函数
初始化计算机中的硬件设备,为内核程序的执行建立环境,Linux是要自己重新初始化设备的,即使有BIOS。
e.g: 键盘,视频卡,磁盘控制器,鼠标,电源管理等,以及临时中断描述表,全局描述表,浮点单元,中断控制器,cr0状态寄存器,把CPU从实模式切换到保护模式
setup_32() 函数
- 初始化段寄存器和一个临时堆栈
- 加压内核影像
- 跳转
为进程0建立执行环境 - 段寄存器
- 内核的bss段填充0
- 内核页表初始化
- 页全局目录的地址存放在cr3寄存器,启动分页
- 识别处理器型号
- 跳转到start_kernel()函数
start_kernel()函数
完成初始化Linux内核的初始化工作
- 调用sched_init()函数来初始化调度函数
- 调用 build_all_zonelists()函数来初始化内存管理区
- 调用page_alloc_init()来初始化伙伴系统分配系统
- 调用trap_init()来初始化IDT(??)
- 调用softtirg_init()初始化软中断
- 初始化系统时间
- 调用kmem_cache_init()初始化slab分配器
- 确定CPU时钟的速度
-
调用kernel_thread() 为进程1创建内核进程
此时init程序和内核线程都运行起来了,可以通知用户Linux内核已经启动,正在运行