《linux内核完全剖析》第六章 引导启动程序 笔记

1、简介

引导启动程序部分主要在boot/子目录下,该目录包含三个汇编代码文件bootsect.S、head.S和setup.S。由于目前没有对汇编进行系统的学习,所以本文不对代码细节实现做讲解,主要描述代码的功能。

2、操作系统启动执行流程

PC电源打开后,80x86结构CPU进入实模式,从地址0xFFFF0执行程序代码,这个地址通常是BIOS中的地址。随后BIOS开始执行系统检测,在物理地址0处开始初始化中断向量,然后BIOS将启动设备的第一个扇区读入内存绝对地址0x7C00处,并跳转到此处。

                                                                               从系统加电起所执行程序的顺序

3、bootsect.S程序功能描述

bootsect.S代码是磁盘引导块程序,驻留在磁盘的第一个扇区中,bootsect代码执行期间,它会将自己移动到内存绝对地址0x90000开始处并继续执行。该程序把从磁盘的第二个扇区开始的四个扇区的setup模块(setup.S编译而成)加载到内存紧接着bootsect后面位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,在屏幕上显示“Loading system...”字符串。再把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方。随后确定根文件系统的设备号,如果没有指定,则根据所保存的引导盘的每磁道扇区数判别出盘的类型和种类并保存设备号于root_dev(引导块的508地址处)中最后长跳转到setup程序开始处(0x90200)去执行setup程序。磁盘上,引导块、setup模块和system模块的扇区位置如下。

                                                                    Linux 0.12 内核在 1.44MB 磁盘上的分布情况

4、setup.S程序功能描述

setup是一个操作系统加载程序,它利用BIOS中断读取机器系统数据并把数据保存到0x90000开始的位置(覆盖了bootsect程序的位置)。然后setup程序把system模块从0x10000~0x8ffff整块下移到内存绝对地址0x00000处。接下来加载中断描述符标寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新设置两个中断控制芯片8259A,把硬件中断号重新设置为0x20~0x2f。最后设置cpu的控制寄存器CR0,进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s程序继续运行。

5、head.s程序功能描述

head.s程序在被编译生成目标文件后会与内核其他程序一起被链接成system模块,位于system模块的最前面开始部分。从这里开始,内核完全都是在保护模式下运行了。这段程序位于内存绝对地址0处开始的地方。head.s程序功能单一,首先加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项都指向一个只报错误的哑中断子程序ignore_int。然后重新设置全局段描述符表gdt,只是修改gdt的段限长。接着使用物理地址0与1MB开始处的字节内容相比较的方法,检测A20地址线是否开启。接着设置管理内存的分页处理机制,把页目录表放在绝对物理地址0开始处,紧随后面放置共可寻址16MB内存的4个页表并设置它们的表项。最后head.s程序利用返回指令把预先放置在堆栈中的/init/main.c程序的入口地址弹出,去运行main()程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值