[自制操作系统] 第02回 初识MBR
一、前景回顾
上回说到,开机的启动过程就是当时Intel和BIOS等硬件厂商所制定的规则,现在我们来回顾一下有如下三点:
1、按下开机键后,CPU将cs:ip寄存器初始化为0xf000:0xfff0,这个位置是BIOS程序的入口处,这个位置存放的代码是jmp far f000:e05b,通过这行代码CPU又将cs:ip寄存器初始化为0xf000:0xe05b,这里才是BIOS真正开始执行的地方。
2、BIOS执行了一系列的硬件检测工作和创建中断向量表IVT后,将MBR(主引导记录)加载到内存0x7c00处,并且跳转到该位置,也就是将cs:ip寄存器初始化为0x0000:0x7c00。
3、MBR的工作是加载操作系统内核,最后跳转到操作系统内核中,随后便是熟悉的启动动画,也就完成了开机过程。
二、写一个粗略的MBR
新建一个mbr.S的文件,键入如下代码:


1 SECTION MBR vstart=0x7c00
2 mov ax,cs
3 mov ds,ax
4 mov es,ax
5 mov ss,ax
6 mov fs,ax
7 mov sp,0x7c00
8 mov ax,0xb800
9 mov gs,ax
10
11 ;利用int 0x10 的0x06号功能实现清屏
12 mov ax,0x600
13 mov bx,0x700
14 mov cx,0
15 mov dx,0x184f
16
17 int 0x10
18
19 ;获取当前光标位置
20 mov ah,3
21 mov bh,0
22
23 int 0x10
24 ;输出字符串“HELLO MBR”
25 mov ax, message
26 mov bp, ax
27 mov cx, 9
28 mov ax, 0x1301
29 mov bx, 0x2
30 int 0x10
31
32 jmp $ ;使CPU悬停在此
33
34 message db "HELLO MBR"
35 times 510-($-$$) db 0
36 db 0x55,0xaa
mbr.S
第1行的“vstart = 0x7c00”表示该程序在编译的时候,告诉编译器将我的起始地址编译为0x7c00。
第2~6行,因为BIOS是通过jmp 0:0x7c00的方式跳转到MBR中的,所以此时cs为0。而CPU中的段寄存器不能通过立即数来对它们赋值,因此只能通过其他寄存器来对它们初始化,这里先将cs寄存器的值赋给ax,再使用ax来初始化其他段寄存器。
MBR也是程序,是程序就需要栈,而我们的程序被加载到0x7c00处,0x7c00以下的区域暂时没被使用,所以先将栈顶设为0x7c00。
第11~30行中的代码便是清屏和打印字符,这里只是为了测试使用,没有什么实际意义。
第32行,我们通过jmp $指令让CPU一直跳转执行该行,也就是c语言中的“while(1);”作用,因为后面的区域没有可供CPU执行的代码,所以为了避免CPU跑偏,现在先让它一直在此死循环。
第34~36行,我们现在构建的MBR,最终的目的是希望被BIOS访问并且加载到地址0x7c00处。因此回顾前面的内容,要想让BIOS相信这就是它苦苦寻找的东西,那我们就要让我们的MBR符合要求,也就是代码最后两个字节是0x55和0xaa,并且整个MBR的大小必须是512字节。所以这里使用“times 510 - ($ - $$)db 0”来将前510个地址中为空的地址处全部填为0,随后再单独给最后的两个字节设置为0x55和0xaa。
一切就绪工作完成后,使用nasm来编译汇编代码,输入如下代码,便可以在当前目录下得到mbr.bin文件。
nasm mbr.S -o mbr.bin
使用ls命令来查看一下生成的bin文件的大小。
ls -lb mbr.bin
结果如下:
可以看到mbr.bin的大小的确是512字节,那么接下来就通过dd命令来将mbr.bin文件写入到我们前面创建的磁盘hd60M.img中:
dd if=./mbr.bin of=./hd60M.img bs=512 count=1 conv=notrunc
写入成功后会有如下输出:
这一步过后,我们便可以开始准备运行测试。
三、运行测试
启动bochs测试一下,我是在bochs的安装目录下启动的,输入 ./bin/bochs -f bochsrc.disk 回车,默认[6]开始模拟,再按回车。随后在出现的控制台中按下c,bochs便开始运行起来了。
当MBR成功被加载并且运行起来后,在屏幕上我们会看到预先设置的字符串“HELLO MBR”在不停的闪烁,到此也就说明我们编写的MBR没有问题。
现在我们已经初步实现了一个简单的MBR,只不过这个MBR没有什么实质性作用。下面我们将会完善这个MBR,只是在完善MBR之前,我们还需要做一件更重要的事。欲知后事如何,请看下回分解。
[自制操作系统] 第02回 初识MBR的更多相关文章
- [自制操作系统] 第04回 完善MBR
目录 一.前景回顾 二.改写MBR 三.实现loader 一.前景回顾 在之前我们说到,MBR的作用便是加载操作系统内核到指定位置.而MBR需要通过读取硬盘来获得操作系统内核.在上一回我们已经讲解了硬 ...
- [自制操作系统] 第05回 CPU的三种模式
目录 一.前景回顾 二.实模式和保护模式 一.前景回顾 在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader. ...
- 《30天自制操作系统》笔记(02)——导入C语言
<30天自制操作系统>笔记(02)——导入C语言 进度回顾 在上一篇,记录了计算机开机时加载IPL程序(initial program loader,一个nas汇编程序)的情况,包括IPL ...
- 【自制操作系统06】终于开始用 C 语言了,第一行内核代码!
一.整理下到目前为止的流程图 写到这,终于才把一些苦力活都干完了,也终于到了我们的内核代码部分,也终于开始第一次用 c 语言写代码了!为了这个阶段性的胜利,以及更好地进入内核部分,下图贴一张到目前为止 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!
<30天自制操作系统>笔记(01)——hello bitzhuwei's OS! 最初的OS代码 ; hello-os ; TAB=4 ORG 0x7c00 ; 指明程序的装载地址 ; 以 ...
- 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】
转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...
- 30天自制操作系统-day1
30天自制操作系统(linux环境)--第一天 我是在CentOS的环境上面实现的,使用ubuntu的环境也是类似的 第一步:因为要对二进制文件进行编辑,所以安装二进制编辑器hexedit(当然其他的 ...
- 《30天自制操作系统》笔记(06)——CPU的32位模式
<30天自制操作系统>笔记(06)——CPU的32位模式 进度回顾 上一篇中实现了启用鼠标.键盘的功能.屏幕上会显示出用户按键.点击鼠标的情况.这是通过设置硬件的中断函数实现的,可以说硬件 ...
- 《30天自制操作系统》笔记(03)——使用Vmware
<30天自制操作系统>笔记(03)——使用Vmware 进度回顾 在上一篇,实现了用IPL加载OS程序到内存,然后JMP到OS程序这一功能:并且总结出下一步的OS开发结构.但是遇到了真机测 ...
随机推荐
- EbitenCookBook中文教程 第一课:安装 Ebiten
本文实时更新原址:https://ebitencookbook.vercel.app/docs/CookBook_Start/class1 第一课 安装 Ebiten 欢迎大家来到 Ebiten 中文 ...
- 学习Java必用的9个网站,最后一个最好用!
Java语言已经成为IT编程界中一种持久的语言,从主要开放源码网站中统计的每月编程语言排名来看,Java一直位居榜首.因此,我们的程序员不能放弃学习Java呀!今日小编为大家整理了几个关于Java学习 ...
- webpack打包学习
从上图我们可以看出,webpack 可以将多种静态资源 js.css.sass文件等转换成一个静态文件,以此可以减少页面的请求,从而提高浏览器响应速度 1.安装开发依赖包 npm install we ...
- 帝国CMS实现栏目批量修改:是否生成
帝国cms实现栏目批量修改 是否生成:不生成栏目页, 不生成内容页, 不生成JS调用, 标签不调用的修改方本文关键字词:栏目批量设置第一步./e/admin/SetMoreClass.php中查找: ...
- 4.Java开发环境的搭建
Java开发环境搭建 一.JDK下载与安装 JDK8下载地址 选择目录,点击下一步 二.配置环境变量 变量名:JAVA_HOME 变量值:JDK安装路径 变量值:CLASSPATH 变量值:.;%JA ...
- Linux curl遇到错误curl: (3) Illegal characters found in URL
服务器上执行一个脚本,在linux新建的sh,把本地编辑器的内容粘贴到文件里. 结果执行的时候报错了. 问题就是 curl:(3)Illegal characters found in URL 看着一 ...
- Java学习day33
线程池: 背景:经常创建和销毁.使用量特别大的资源,比如并发情况下的线程,对性能影响很大 思路:提前创建好多个线程.实现重复利用. 好处:提高响应速度,减少了创建新线程的时间:降低资源消耗,重复利用线 ...
- jquery版本的ajax请求
首先引入 <script src="https://code.jquery.com/jquery-3.6.0.js"></script> $ 和 jqu ...
- Linux下安装并使用jumpserver跳板机
堡垒机介绍: 官方网站:https://www.jumpserver.org/ 在一个特定网络环境下,为了保障网络和数据不受外界入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系 ...
- ThreadLocal的原理及产生的问题
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. ThreadLocal的原理 特点 ThreadLocal和Sychro ...