首页 > 其他分享 >自己动手从零写桌面操作系统GrapeOS系列教程——11.MBR介绍

自己动手从零写桌面操作系统GrapeOS系列教程——11.MBR介绍

时间:2023-03-08 22:14:33浏览次数:46  
标签:11 文件 字节 img GrapeOS 桌面操作系统 mbr MBR

学习操作系统原理最好的方法是自己写一个简单的操作系统。


前面我们介绍过电脑的启动过程:

上电->BIOS->MBR(boot)->loader->kernel->交互界面(图形/命令行)

本讲我们要介绍的是MBR(Master Boot Record,主引导记录)。在电脑中对磁盘的读写是按扇区为基本单位的,一般每个扇区为512个字节。也就是说每读一次磁盘,读取的字节数是512字节的整数倍。同样每写一次磁盘,写入的字节数也是512字节的整数倍。MBR是磁盘的第一个扇区,又叫做主引导扇区,特点是最后2个字节的内容必须是0x55和0xAA。

下面我们来做几个实验来加深对MBR的了解。

1.不加载虚拟磁盘启动QEMU

Windows键+R键打开运行窗口,输入cmd并回车打开命令行窗口。

在命令行中输入qemu-system-i386并回车:

此时会打开QEMU窗口:

注意最后会输出一行话“No bootable device.”,意思是没有可引导启动的设备。

2.创建空虚拟硬盘

在CentOS中我们输入如下一行命令:

dd if=/dev/zero of=/media/VMShare/GrapeOS.img bs=1M count=4

dd命令简单来说是一个复制命令。参数if是指input file输入文件,参数of是指output file输出文件,意思就是将输入文件复制到输出文件中。这里的输入文件/dev/zero是Linux中的一个特殊文件,它可以提供无限的零。参数bs表示一次复制多少字节数据,也就是一个数据块的大小,count表示复制多少个块。bs乘以count表示总共复制多少数据,我们这里总共复制1M✖4=4M数据。运行上面这行命令的结果就是生成了一个4M大小的文件GrapeOS.img,该文件中每个字节都是0。截图如下:

由于GrapeOS.img是在Windows和CentOS的共享文件夹中,所以我们在Windows也能看到:

每个字节都是0的文件也叫空白文件,我们下面用hexdump命令来验证一下:

hexdump GrapeOS.img -C

从上面的截图可以看到GrapeOS.img这个文件中每个字节都是0。

3.加载空虚拟硬盘启动QEMU

在cmd命令行中输入如下命令:

qemu-system-i386 d:\GrapeOS\VMShare\GrapeOS.img

上面这行命令是为QEMU指定虚拟硬盘文件并启动QEMU。截图如下:

从上面截图可以看到,虽然给QEMU指定了虚拟硬盘,但最后的提示还是“No bootable device.”

4.将虚拟硬盘的第一个扇区变为MBR

我们在Lesson11文件夹下新建文件mbr.asm,并输入如下代码:

;生成一个空的MBR
times 510 db 0 ;前510个字节全为0
db 0x55,0xaa   ;最后两个字节是0x55和0xaa。

在VSCode中的截图如下:

使用nasm汇编器汇编:

nasm mbr.asm -o mbr.bin

从上面的截图我们看到,生成了一个叫mbr.bin的文件,大小为512字节。下面来看一下mbr.bin文件中的数据:

hexdump mbr.bin -C

从上图可以看到mbr.bin文件中共512字节,除最后2个字节是0x55和0xaa,其它字节都是0。
下面我们将mbr.bin写入到虚拟硬盘文件的头512个字节中:

dd conv=notrunc if=mbr.bin of=/media/VMShare/GrapeOS.img

上面这里命令中多了个参数conv=notrunc,表示不截断。如果不写该参数,执行完命令,GrapeOS.img就只剩512字节了。
执行完上面这行命令,我们验证一下是否写入成功:

hexdump /media/VMShare/GrapeOS.img -C

从上面截图可以看到总共4MB的文件,其中第511个字节为0x55,第512个字节0xaa,其它字节都为0。此时虚拟硬盘GrapeOS.img中第一个扇区已经是MBR了。

5.加载带MBR的虚拟硬盘启动QEMU

在cmd命令行中输入和刚才一样的命令:

qemu-system-i386 d:\GrapeOS\VMShare\GrapeOS.img

截图如下:

从上面的截图中可以看到,在QEMU中的提示信息已经和刚才不一样了。最后一行显示的是“Booting from Hard Disk...”,意思是从硬盘启动中,也就是说程序已经从BIOS跳转到MBR了。

通过上面的实验我们证明只要磁盘第一个扇区中的最后两个字节是0x55和0xaa,BIOS就会认为该扇区是一个有效的MBR,同时认为该磁盘是一个有效的启动项。
如果大家的实验做到这里会发现CPU占用率高,如果是笔记本电脑能听到CPU风扇呼呼的转。这是因为CPU跑飞了,我们后面会解决这个问题。

本讲小结:BIOS将电脑的控制权交棒给了MBR,我们可以在MBR中写程序,MBR是我们程序的起点,之后电脑的运行都由我们来控制。


本讲对应的视频版地址:https://www.bilibili.com/video/BV1pe4y1w7Co/
GrapeOS操作系统交流QQ群:643474045

标签:11,文件,字节,img,GrapeOS,桌面操作系统,mbr,MBR
From: https://www.cnblogs.com/chengyujia/p/17196418.html

相关文章

  • 每日一题11
    每日一题11题目:121.买卖股票的最佳时机思路:找出最低值,然后再找出其后的最高值即可!classSolution{publicintmaxProfit(int[]prices){intmax=0;......
  • ES6-ES11 class中getter和setter设置
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>get和......
  • ES6-ES11 class静态成员
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>静态成......
  • ES6-ES11 ES5构造函数继承
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>对象继......
  • 力扣中116 填充每个节点的下一个右侧节点指针
    题解1:  也就是一下就把队列里所有的元素移除了移除的同时添加左右节点队列中每次放的都是一层 题解2:找到next可以利用next找下一节点用pre标记每层第一个tmp......
  • ES6-ES11 Map的介绍与API
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Map</t......
  • 11_Session域监听器
    ​ Session域共有四个监听器接口,分别是HttpSessionListenerHttpSessionAttributeListenerHttpSessionBindingListenerHttpSessionActivationListener接下来我们就......
  • 11_Session域监听器
    ​ Session域共有四个监听器接口,分别是HttpSessionListenerHttpSessionAttributeListenerHttpSessionBindingListenerHttpSessionActivationListener接下来我们就......
  • C++ JSON库json11的使用方法
    提纲1、下载并集成到自己的项目2、基本用法1下载并集成到自己的项目json11是一个轻量级的C++11库,提供JSON的序列化和反序列化功能。首先用gitclonehttps://gith......
  • 链表指针指迷了我(UVA 11988 STL deque)
    BrokenKeyboard(a.k.a.BeijuText)You'retypingalongtextwithabrokenkeyboard.Wellit'snotsobadlybroken.Theonlyproblemwiththekeyboardisthats......