Linux内核设计

一、加载操作系统内核程序

   1.引导程序(bootsect)

    对于操作系统,设计者必须把最开始执行的程序“定位”在启动扇区(软盘中的0盘面0磁道1扇区)。对于BIOS而言,接到启动操作系统的命令后,从启动扇区把代码加载到0x07C00(BOOTSEG位置)。BIOS已经把bootsect载入内存,bootsect作用为将第二批第三批的程序陆续加载到内存。

    2.setup

    bootsect对内存规划的参数:

            SETUPLEN            要加载到setup程序的扇区数

            SETUPSEG            被加载的位置

            BOOTSEG             启动扇区被BIOS加载的位置

            INITSEG                启动扇区将要移动到的新位置   

            SYSSEG                 内核被加载的位置

            ENDSEG                内核的末尾位置

    1.将bootsect复制到新地方,通过指令 jmpi go,INITSEG在跳转之后的新位置接着执行后面的指令。通过CS寄存器的值把数据段寄存器DS,附加段寄存器ES,栈基址寄存器SS设置成与代码段寄存器CS相同的位置,并设置栈顶指针sp的偏移地址。

    2.bootsect将setup程序加载到内存中:借助BIOS提供的int 0x13中断向量所指向的中断服务程序(磁盘服务程序),使用0x13中断时,需要事先将扇区和加载的内存位置信息传递给服务程序,setup程序紧挨着bottsect尾端

    3.加载system模块

    通过0x13中断,将第三批程序——系统模块载入内存,然后检测根设备,把根设备号保存在root_dev中。

二、实模式向保护模式的转换(32位)

    1.关中断并将system移动到内存地址起始位置0x00000

    setup程序将位于0x10000的内核程序拷贝至内存起始位置0x00000,该动作将BIOS中断向量表和BIOS数据区完全覆盖。


猜你喜欢

转载自blog.csdn.net/qianli2333/article/details/80545930