Linux 0.11 Boot

在这里插入图片描述
在这里插入图片描述
当PC上电后,80x86结构的CPU将自动进入实模式,并从地址0xFFFF0开始自动执行程序代码,这个地址通常时ROM-BIOS中的地址。
PC机的BIOS将执行某些系统的检测,并在物理地址0处开始初始化中断向量。然后,它将启动设备的第一个扇区(磁盘引导扇区,512字节)读入内存绝对地址0x7C00处,并跳转到这个地方。

bootsect的代码为什么不把系统模块直接加载到物理地址0x0000开始处而要在setup程序中再进行移动呢?这是因为在随后执行的setup代码开始部分还需要利用ROM BIOS中的中断调用来获
取机器的一些参数(例如显卡模式、硬盘参数表等)。当BIOS初始化时会在物理内存开始处放置一个大小为0x400字节(1KB)的中断向量表,因此需要在使用完BIOS的中断调用后才能将这个区域覆盖掉。

bootsect.s

bootsect.s代码是磁盘引导快程序,驻留在磁盘的第一个扇区中。
PC加电ROM BIOS自检后,将引导区代码bootsect加载到内存0x7c00开始处并执行。
在bootsect执行过程中,将自己西东到内存绝对地址0x90000开始处并继续运行。
该程序的主要作用时首先把从磁盘的第2个扇区开始的4个扇区的setup模块加载到内存紧接着bootsect后面的位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数

ljmp $INITSEG, $go
段间跳转,这里INITSEG指出跳转到的短地址,标号go是段内偏移地址。

setup.s

setup.s是一个操作系统加载程序,它的主要作用是利用ROM BIOS中读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖掉了bootsect程序所在的地方),所获得的参数和保留的内存位置如下图,这些参数将被内核中相关程序使用

然后setup程序将system模块从0x10000-0x8ffff(当时认为内核系统模块的长度不会超过此值:512KB)整体向下移动到内存绝对地址0x00000处。接下来加载中断描述符寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新这只两个中断控制芯片259A,将硬件中断号重新设置为0x20-0x2f。最后设置CPU的控制寄存器CR0(也称机器状态字),从而进入32位保护模式运行,并跳转到位于system模块的最前面部分的head.s程序继续运行。
为了能让head.s在32位保护模式下运行,在本程序中临时设置了中断描述表(IDT)和全局描述表(GDT),并在GDT中设置了当前内核代码段的描述符接数据段的描述符。在head.s程序中会根据内核的需要重新设置这些描述符表。

在进入保护模式中操作之前,我们需要首先设置好需要使用的段描述符表。这里需要设置全局描述符表和中断描述符表。
.

head.s

加载各个数据段寄存器,重新设置中断描述符表idt,共256项,并使各个表项均指向一个只报错误的中断子程序
ignore_init.
在设置号中断描述符后,本程序又重新设置了全局描述符表gdt。
检测A20地址线是否已真的开启,测试PC是否含有数学协处理器芯片。
设置管理内存的分页处理机制,将页目录表放在绝对地址0开始处(也是本程序所处的物理内存位置,因此这段程
序将被覆盖掉),紧随后面放置共可寻址16MB内存的4个页表,并分别设置它们的表项。

CPU在实模式运行方式时,段寄存器用来放置一个内存段地址,而此时在该段内可以寻址64KB的内存。
但当进入保护模式运行时,此时段寄存器中放置的并不是内存中的某个地址值,而是制定描述符表中某个
描述符项相对于该描述符表基址的一个偏移量。en
针对不同的使用方面,描述符表分为三种:全局描述符表(GDT)、中断描述符表(IDT)和局部描述符表(LDT)。
当CPU运行在保护模式下,某一时刻GDT和IDT分别只能有一个,分别由寄存器GDTR和IDTR制定它们的表基地址。
局部表可以有0个或最多8191个,这由GDT表中未用项数和所设计的具体系统确定。一个任务有一个LDT。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值