第五回-MBR加载Bootloader

上回在加载MBR实验中我们认识到计算机启动起来后BIOS确实会读取硬盘的第一个分区,并将相关内容加载到内存0x07C00[1]并执行。由于硬盘一个分区的容量有限,导致MBR程序比较小,也就限制了它的具体功能。因此操作系统内核的加载一般是由操作系统加载器(俗称Bootloader)加载进行内存。本系列会按照下图1所示的顺序加载操作系统Bootloader、操作系统内核到物理内存相应的地址处,也就是说Bootloader与Kernel会从图中的地址处开始执行。本回主要话说MBR程序如何加载操作系统Bootloader到内存地址0x07E00,这个地址你可以根据具体情况进行选择,我这里是因为MBR在0x07C00,长度为512字节,MBR程序在内存的结束地址刚好为0x07E00-1。所以为了不浪费内存,所以选择了0x07E00。操作系统Bootloader为简易版,能够说明问题即可。随着Kernel的加载会逐渐丰富。MBR程序与Bootloader都为x86汇编编写,因此本回会穿插讲解一下x86实模式下汇编语言,后面还会讲解对应保护模式、IA-32e模式(即64位模式)下的汇编语言。

图1

首先更改上一回的MBR程序,让其能够读取硬盘数据,而不是仅仅的向显卡缓存输入数据从而显示数据。新MBR程序利用BIOS提供的软中断INT 13读取硬盘数据,中断INT 10在屏幕上显示字符串,具体程序如下:

图2

到这里,本回的MBR程序就描述完了,需要按照《第四回》所述的方法将改MBR程序编译并写进虚拟机硬盘。接下来给出简易版Bootloader程序代码,这里只是简单显示字符串,证明Bootloader被MBR正常加载。下回讲解Bootloader加载内核程序的时候会丰富起来,我们现在假定Bootloader在硬盘上的从2扇区开始占据5个磁盘扇区(实际没有这么多)。Bootloader程序具体代码如下:

本回MBR与Bootloader程序最终的运行结果如图3所示, MBR与Bootloader分别显示不同的信息。

图 3

本回中的所有读取硬盘和显示字符串可以不使用BIOS的中断,自己编写相关例程通过读写硬盘端口与显存来实现,但是这些涉及不少汇编细节,会偏离我们的主干,有兴趣的可以这这样去试试。下回我们开始丰富Bootloader程序,处理器实模式下只能访问物理机内存低端1M字节空间,即使你机器装有2G的内存条也是一样。我们将在Bootloader中让处理器进入保护模式,这样就可以访问整个4G内存空间,并将内核程序先加载到高于1M内存以上的地址,然后解释内核程序的ELF文件(内核程序用C编写)并将其中的代码段、数据段移到内存地址0x10000处。

[1]. 这个Legacy BIOS的行为,现在流行的UEFI会有不同。

======================================================================

各位看官如果对本系列有兴趣,大家一起学习交流,可以加一下该系列微信公众号,鼓励继续写的动力。声明此公众号是个人申请用于交流学习底层技术,不会涉及其他商业行为。

微信公众号链接: 第五回-MBR加载Bootloader (qq.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值