linux内核学习笔记(一)_系统启动过程

本文详细介绍了Linux内核从BIOS启动到startup_kernel()函数完成的整个过程,包括BIOS初始化、引导装入程序、setup()、startup_32()和startup_kernel()的功能和执行细节,特别强调了实模式到保护模式的转变以及硬件设备的初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         之前很少看到系统启动过程的资料,翻完一遍《深入理解Linux内核》第三版,看到附录1中专门介绍了系统启动的流程,感觉又涨了不少知识,特别是增强了对操作系统和硬件适配工作的理解。

         《深入理解Linux内核》第三版主要以x86结构为基础来介绍内核,因此系统启动也是根据x86的结构体系描述的。分为以下5部分:BIOS、引导装入程序、setup()函数、startup_32()函数、startup_kernel()函数。

其中1-2节是linux内核启动前的准备工作,包括cpu的自启动、必要设备驱动的初始化、引导到linux内核开始执行。第3节是linux设置驱动。第4节是linux初始化页表、数据段、堆栈等。第五节就是初始化内核其他重要模块,主要是“内存管理”模块、也包括了“时间日期”、“中断、异常”等模块,并创建内核线程1。cpu直到setup()函数完成时都地址寻址工作在“实模式”,之后才工作在“保护模式”。

1-BIOS

CPU 加电后,是无法从内存开始执行指令的,因为此时内存没有任何数据,同时内存控制器可能也没进行初始化。因此CPU是从ROM里面读取指令进行执行的,这块ROM在x86架构里存放的程序集就是BIOS。BIOS除了包含部分初始化过程外还包括一些函数例程,供后续步骤中的函数调用。

BIOS过程中重要的一点是,此时寻址方式是“实模式”,顾名思义,就是微指令中引用的地址是寻址总线上的实际地址,而不是平时使用的逻辑地址或者线性地址。这种地址是未经MMU转换的物理地址,这也好理解,因为此时没有多少资源可用,像用于地址映射的GDT\页表等东东也来不及初始化,所以只能是物理地址。如前所述,在完成基本的初始化后,系统基本上就是“保护模式”,所有微指令中的地址都是逻辑或线性地址,不能直接对内存寻址。x86架构中,“实模式”到“保护模式”的转换是通过CR0寄存器的PE(Protection Enable)字段实现的,如图所示。

BIOS中第一个条执行的指令就固定位于物理地址0xFFFFFFF0处,也是CPU加电后执行的第一条指令。此后执行的操作主要包括以下几个方面:1.加电自检;2.初始化硬件设备;3.此时BIOS会自动搜索光盘、U盘或者硬盘的第一个扇区(一般是引导扇区)。这样做的目的是将CPU的执行路径逐步引导到操作系统的代码上。4.如果找到有效引导扇区,就把引导扇区的内容(一个扇区大小一般是512字节)拷贝到物理地址0x00007c00开始的位置,同时程序从此处开始执行(PC=0x00007c00).。

2-引导装入程序

从此节开始,启动程序开始在ram中执行。

引导装入程序就是常说的“bootloader”。不同结构体下有不同的bootloader,x86有LILO、GRUB,arm等架构是uboot。前面说过引导扇区只有512字节,怎么可能装下bootloader的所有代码?其实很简单,引导程序分成了2部分,一部分在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值