天天看点

Linux操作系统的BIOS启动流程

       要理解大致的启动流程现需要了解几组常用的寄存器:

       1,CS + IP:其中CS是段寄存器,或者是CODE段寄存器,存储的是段的基地址。IP是程序段寄存器的偏移量。两者结合,确定下一条CPU指令的执行地址。

       2,SS + SP:其实,SS是堆栈寄存器,而SP是堆栈寄存器偏移。前者存储的是堆栈的基地址,后者存储的是栈的栈顶。另外,如果使用到了BP,默认的基地址也是SS,通过BP可以访问的不仅仅是栈顶,通过SS和BP可以访问整个堆栈。

       3,DS/ES + 有效地址,这一组寄存器决定是附加数据的。

       上面就是常用的几组寄存器,其中Linux启动阶段关系比较大的还是第一组。

       当电脑启动或者复位的按钮按下的时候,CPU会把CS寄存器设置为0xFFF0,段基地址设置为0xFFFF0000,段长度设置为64KB。而IP被设置为0xFFF0。因此此时CPU的代码指向0xFFFFFFF0,也就是4GB最后64KB的最后64B处。

       上面这段基本上是来自于别人的书籍,但是从理解来看,最初的CS寄存器赋值为0xFFF0我还是没有弄明白什么含义。是完全没有用还是赋值为0xFFF0之后其段基地址的数值就是0xFFFF0000?总体的程序执行位置还是把握住基地址加IP偏移量计算出来应该问题就不大了。

       程序的运行位置正好是现在的系统BIOS的存放位置,而这里会存放一条JMP的指令。跳转到BIOS的程序中的某个位置开始执行。

继续阅读