探讨Linux内核启动之BIOS启动阶段
Linux内核启动有很多值得学习的地方,这里我们主要介绍BIOS启动阶段,包括介绍指令寄存器CS:EIP等方面。
Linux内核启动代码复杂、庞大,让人感觉难以入手,正是因为它的复杂性,任何一本教材都会把相关的内容进行分类讲解,例如中断处理,文件系统,等等。然而在阅读相关章节时,你是不是常常想弄明白某个相关的数据结构是在什么时候建立的?是在什么时候初始化的?本章讲解BIOS启动阶段。
Linux内核启动之BIOS启动阶段
CPU在上电初始化时,指令寄存器CS:EIP总是被初始化为固定的值,这就是CPU复位后的第一条指令的地址。断电后内存中的内容就丢失了,所以这一条指令必须保存在“非易失”的存储器中。此类存储器包括ROM,PROM,EPROM,Nor Flash等。早期的BIOS存放在只读存储器中,非常不方便修改。现在EPROM和Nor Flash都能够通过电的方式来进行擦除和编程写入,所以通常升级BIOS就是利用BIOS芯片的电可擦除编程特性。
对于32位地址总线的系统来说,4GB的物理地址空间至少被划分为两个部分,一部分是内存的地址空间,另外一部分地址空间用于对BIOS芯片存储单元进行寻址。除此之外,随着系统外部设备的增加以及设备本身的板载存储空间的增加,16位8086处理器拥有的64KB的IO地址空间早已不够(通过in/out汇编指令来访问的I/O端口。),实际上4GB的物理内存地址空间还有一部分用于外部设备的板载存储空间的寻址。x86复位后工作在实模式下,该模式下CPU的寻址空间为1MB。 CS:IP的复位值是FFFF:0000,物理为FFFF0。主板的设计者必须保证把这个物理地址映射到BIOS芯片上,而不是RAM上。