Loader

Boot将代码的位置放置到0x7c00这个位置后,BIOS上电自检后就会跳转到这个位置执行Boot程序。Boot程序要做的就是在文件系统里一个目录项一个目录项的检索出loader.bin代码,放置到指定位置进行执行。之后的执行权都转交到了Loader上。

Loader会检测一下几部分:

  • 检测硬件信息。
内核运行在非实模式下,然而很多的硬件信息需要在实模式下的BIOS中断服务中获取。
  • 处理器模式切换
引导加载必经过三个模式:实模式(16位)->保护模式(32位)->长模式(64位)。CPU在三个模式间的跳转需要遵循一定的流程规范。
  • 向内核传递参数
传递两类数据,一类是控制信息,另一类是硬件数据信息。这些数据一方面是内核程序的执行流程,一方面是内核程序的初始化信息。

在编写操作系统时约定起始地址位于0x100000(1MB)处,内存地址0x7E00是内核程序的临时转存空间。因为内核的读取操作是通过BIOS的中断服务程序int 13h实现的,BIOS在实模式下只支持上线为1MB的物理空间寻址(16位)。

最初的处理器只有20根地址线,所以只能寻址1MB内的物理地址空间,若超过 1MB也只有低20位有效。只有开启了A20地址功能才能进行1MB以上4GB以下的寻址。

在实模式下,程序可以操作任何地址空间。有利有弊,一旦程序出错,很可能导致整个系统崩溃。进而演化出保护模式。

保护模式按照执行级别0、1、2、3四个等级。最高级0,由内核使用。一般来说3留给应用使用,介于0和3之间的通常作为系统服务程序来使用。一些特殊的汇编指令必须得在0级运行。保护模式还增加了分页功能。

如何切换处理器模式

为了进入保护模式,必须在内存中先创建一段可以在保护模式下执行的代码以及必要的数据结构。相关数据结构有IDT/GDT/LDT描述符表各一个(LDT表可选)、任务状态段TSS结构,至少一个页目录和页表和至少一个异常/中断处理模块。

在进入保护模式前,还必须初始化GDTR、IDTR寄存器(也可推迟到进入保护模式后,使能中断前)、控制寄存器CR1~4、MTTRs内存范围类型寄存器。

  • 系统数据结构。系统在进入保护模式前,必须创建一个拥有代码段描述符和数据段描述符的GDT(Globad Descriptor Table,全局描述符表)(第一项必须是NULL描述符),并且一定要使用LGDT汇编指令将其加载到GDTR寄存器。保护模式的栈寄存器SS,使用可读写的数据段即可。对于多段式操作系统,可采用LDT(Local Descriptor Table,局部描述符表,必须保存在GDT表的描述符中)。如果希望开启分页

内核执行头程序

内核执行头程序,其实是内核程序中的一小段汇编代码。当Loader引导加载程序移交控制权后,处理器便会执行Kernel内核程序的这段代码。内核执行头程序负责为操作系统创建段结构和页表结构、设置某些结构的默·认处理函数、配置 关键寄存器等工作。在上述工作完成后,其中BootLoader引导启动程序占用了0~1MB的物理地址空间,而内核程序使用1MB以上的物理地址空间。

内核主程序

主程序在正常情况下是不会返回的。因为内核执行头程序没有给内核主程序提供返回地址,而且关机、重启等功能也并非是在内核主程序返回的过程实现的,没必要给主程序返回。

必须了解帧缓存的格式,一个像素点能够显示的颜色值位宽。Loader引导加载程序设置的显示模式可支持32位颜色深度的像素点,其中07位代表蓝色,815位代表绿色,1623位代表红色,2431位为保留位。

若要设置屏幕上某个像素点的位置,那么必须知道这个点在屏幕的位置,并计算出该点距屏幕远点的偏移值,,随后才可在偏移出设置像素点的颜色值。屏幕的坐标原点位于屏幕的左上角,以本系统目前配置的显示模式为例,其屏幕坐标的示意图

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值