bochs下启动自己的MBR
Bochs
Bochs是一个x86硬件平台的开源模拟器。你可以当它是一台虚拟的x86的计算机。
本文环境:
- OS: Ubuntu 20.04.4 LTS
- Bochs: 2.6.9
安装Bochs
这个网上教程很多了,先去下载,然后configure:
|
|
这里会出点问题,一般是缺少库了:
|
|
configure通过就可以编译安装了:
|
|
配置
当我们在终端输入bochs后,
Bochs会自己在当前目录顺序寻找以下文件作为默认配置文件:
.bochsrc
bochsrc
bochsrc.txt
bochsrc.bxrc(仅对Windows有效)
我们可以自己创建一个名为.bochsrc的文件,来指定Bochs配置我们想要的虚拟机。
|
|
测试开机
按c
继续运行,弹出新的窗口。
MBR
MBR:Master Boot Record,主分区引导记录,它是整个硬盘最开始的扇区,即0柱面0磁头1扇区(CHS表示方法,如果是LBA的话,那就是0扇区)。
扇区是什么?那就涉及到硬盘基本知识了,对于机械硬盘,有以下概念:
- 盘片(platter)
- 磁头(head)
- 磁道(track)
- 扇区(sector)
- 柱面(cylinder)
盘片 片面 和 磁头(Head)
硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。
扇区(Sector)和 磁道(Track)
下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇区的大小是4096字节)
磁头(Head)和 柱面(Cylinder) 硬盘通常由重叠的一组盘片构成,每个盘面都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。由于每个盘面都有自己的磁头,因此,盘面数等于总的磁头数。 如下图
图3
所谓CHS即柱面(cylinder),磁头(header),扇区(sector),通过这三个变量描述磁盘地址(先定位柱面,然后选定磁头,然后确定扇区),需要明白的是,这里表示的已不是物理地址而是逻辑地址了。这种方法也称作是LARGE寻址方式。该方法下:
硬盘容量=磁头数×柱面数×扇区数×扇区大小(一般为512byte)。
后来,人们通过为每个扇区分配逻辑地址,以扇区为单位进行寻址,也就有了LBA寻址方式。但是为了保持与CHS模式的兼容,通过逻辑变换算法,可以转换为磁头/柱面/扇区三种参数来表示,和 LARGE寻址模式一样,这里的地址也是逻辑地址了。(固态硬盘的存储原理虽然与机械硬盘不同,采用的是flash存储,但仍然使用LBA进行管理,此处不再详述。)
好了,再回来说MBR,MBR(Master Boot Record)是传统的分区机制,应用于绝大多数使用BIOS引导的PC设备(苹果使用EFI的方式),很多Server服务器即支持BIOS也支持EFI的引导方式。它的结构如下:
MBR结构:占用硬盘最开头的512字节
* 前446字节为:引导代码(Bootstrap Code Area)(引导不同的操作系统;不同操作系统,引导代码是不一样的)
- 接下来的为4个16字节:分别对应4个主分区表信息(Primary Partition Table)
- 最后2个字节:为启动标示(Boot Signature),永远都是
55
和AA
;55和AA是个永久性的标示,代表这个硬盘是可启动的。
主引导代码
BIOS在完成一些简单的检测工作或初始化工作后,会把处理器使用权交出去,下一棒就是MBR程序。BIOS会把MBR加载到0x7c00的位置,然后执行里头代码(jmp 0:0x7c00
)。
mbr.S文件:
|
|
用nasm编译成纯二进制文件nasm -o mbr.bin mbr.S
,可以查看mbr.bin文件大小,正好512个字节。
然后利用dd
命令把bin文件写进磁盘的0柱面0磁头1扇区:
|
|
增加磁盘读写
mbr.S
|
|
boot.inc文件
|
|
最后CPU会调到0x900的地址,还得有个loader
|
|
参考: