动手学操作系统(二、编写MBR主引导记录)

动手学操作系统(二、编写MBR主引导记录)

文章目录

  • 动手学操作系统(二、编写MBR主引导记录)
    • 1. 实模式和保护模式
    • 2. BIOS与MBR
    • 3. MBR程序
    • Reference

在之前的学习内容中,我们已经实现了基本的仿真环境bochs的搭建,还首次使用硬盘引导启动了bochs,虽然我们只卡在了启动的界面,但是我们已经顺利的搭建起整个流程了。

1. 实模式和保护模式

实模式(Real Mode)和保护模式(Protected Mode)是 x86 架构的两种不同的工作模式,主要用于管理内存和处理器的功能。实模式是 x86 处理器在启动时默认的运行模式。
它最初是为 8086 处理器设计的,在这种模式下,处理器可以直接访问所有内存、I/O 设备和硬件中断。实模式提供了一种简单的内存管理机制,适用于早期的操作系统,如 MS-DOS。保护模式是 80286 及其后续处理器引入的一种高级工作模式,提供了更强的内存管理和保护机制。
它支持现代操作系统的许多功能,如虚拟内存、多任务处理和内存保护。

Image

实模式和保护的模式的寻址也存在着区别,如下图所示

Image

2. BIOS与MBR

BIOS(Base Input & Output System)是基本输入输出系统,是计算机启动时执行的固件,用于初始化和测试硬件组件,并引导操作系统。BIOS 是计算机最基本的固件之一,通常存储在主板上的只读存储器(ROM)芯片中。

UEFI BIOS(Unified Extensible Firmware Interface),UEFI 是 BIOS 的现代替代品,提供更多功能和更好的用户界面。支持大容量硬盘(超过 2 TB)、安全启动、图形用户界面等。UEFI 具有更灵活的引导管理功能和更好的安全性。

BIOS 是计算机启动时执行的固件,负责硬件初始化和引导操作系统。虽然传统 BIOS 已经使用多年,但随着计算机硬件和软件的发展,UEFI 逐渐取代了传统 BIOS,提供了更多的功能和更好的用户体验。但是我们在这个教程中还是关注于BIOS本身。

MBR(Main Boot Record)是主引导记录,它存在于整个硬盘最开始的扇区,即0盘0道1扇区,这个扇区被称为MBR引导扇区。MBR的功能有

引导加载:当计算机启动时,BIOS/UEFI 读取硬盘的第一个扇区(MBR),并执行主引导程序。主引导程序随后根据分区表信息找到并加载操作系统的引导程序。
管理分区:MBR 包含硬盘分区表的信息,定义了硬盘上最多四个主分区或三个主分区加一个扩展分区(扩展分区可以进一步包含多个逻辑分区)。

我们需要了解的是,在实模式下的1MB内存布局

Image

顶部0xF0000~0xFFFFF这部分64KB的内存就是ROM(Read Only Memory),里面存放的就算BIOS代码。这块ROM内存是掉电不会清除的,所以当系统被启动的时候,ROM里存放的BIOS首先被加载执行。

BIOS的运行过程是这样的,在开机的一瞬间,CPU的cs:ip寄存器被强制初始化为0xF000: 0xFFF0,由于开机的时候处于实模式,按照实模式的寻址方式段基地址要乘以16,也就是右移4位,然后再加上段内偏移地址,则计算得这个实际的物理地址为0xFFFF0,这个地址便是BIOS程序的入口地址了。从地址0xFFFF0~0xFFFFF只有16B的空间,这说明BIOS真正的执行脚本并不存储在这里,开机后执行的第一条语句一定是跳转语句jmp,其实执行的第一条语句是

jmp far f000:e05b

跳转到了0xfe05b出,说明这里才是BIOS代码真正开始的地方。接下来就是BIOS不断进行检测内存,显卡等外设信息,然后初始化硬件的过程了。

最后的一点任务,校验启动盘中位于0盘0道1扇区(也就是LBA地址为0的扇区)的内容,如果此扇区末尾的两个字节分别是魔数0x550xaa,BIOS便认为此扇区中确实存在可执行的程序,并把这个扇区的内容加载到物理地址0x7c00的内存中,一个扇区的大小我们在上一节中设置硬盘扇区大小中设置过了,是512B。然后通过命令

jmp 0:0x7c00

跳转到0x7c00继续执行MBR程序了。

1.为什么魔数必须是0x550xaa?
因为这是按照统一的标准设定的,大家都遵守这个BIOS标准。
2.为什么最后一定跳转到0x7c00?
这也是大家默认的一个规定

MBR的大小必须是512B,这是为了保证0x550xaa这两个魔数恰好出现在该扇区的最后两个字节处,即510511字节处,我们使用bochs模拟的是x86平台是小端字节序,所以最后两个字节的内容是0xaa55,其实就是这两个魔数合起来。

3. MBR程序

我的工程管理路径如下

Image

其中src用于存放脚本文件,bin用于存放编译的结果,test用于存放一些别的测试脚本和结果。

在路径~/d2los/src中,编写程序mbr.S

cd ~/d2los/src
gedit ./mbr.S

然后写入以下内容

; ~/d2los/src/mbr.S
; MBR主引导程序
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs      
   mov ds,ax
   mov es,ax
   mov ss,ax
   mov fs,ax
   mov sp,0x7c00

; 清屏利用 0x06号功能, 上卷全部行, 实现清屏
; -----------------------------------------------------------
; INT 0x10 功能号: 0x06 功能描述: 上卷窗口
; ------------------------------------------------------
; 输入:
; AH = 功能号 0x06
; AL = 上卷的行数(如果为0, 表示全部)
; BH = 上卷行属性
; (CL, CH) = 窗口左上角的(X, Y)位置
; (DL, DH) = 窗口右下角的(X, Y)位置
; 无返回值
   mov     ax, 0x600
   mov     bx, 0x700
   mov     cx, 0           ; 左上角: (0, 0)
   mov     dx, 0x184f      ; 右下角: (80, 25),
                           ; VGA文本模式中, 一行只能容纳80个字符,25.
                           ; 下标从0开始, 所以0x18=24, 0x4f=79
   int     0x10            ; int 0x10

; 获取光标位置
; -----------------------------------------------------------
; .get_cursor 获取当前光标位置, 在光标位置处打印字符.
   mov ah, 3                ; 输入: 3号子功能是获取光标位置, 需要存入ah寄存器
   mov bh, 0                ; bh寄存器存储的是要获取光标的页号

   int 0x10                 ; 输出: ch=光标起始行, cl=光标结束行
                            ; dh=光标所在行号, dl=光标所在列号

; 获取光标位置结束
; -----------------------------------------------------------

; 打印字符串
; -----------------------------------------------------------
; 还是用10h中断, 不过这次是调用13号子功能打印字符串
   mov ax, message 
   mov bp, ax               ; es:bp 为字符串起始地址, es此时同cs一致,
                            ; 开始时已经为sreg初始化

   ; 光标位置要用到dx寄存器中的内容, cx中的光标位置可忽略
   mov cx, 5                ; cx 为字符串长度, 不包括结束符0的字符个数
   mov ax, 0x1301           ; 子功能号13是显示字符串及属性, 要存入ah寄存器,
                            ; al设置显示字符方式 ah=01: 显示字符串,光标跟随移动
   mov bx, 0x2              ; bh存储要显示的页号, 此时是第0,
                            ; bl中是字符属性, 属性黑底绿字(bl = 02h)
   int 0x10                 ; 执行BIOS 0x10 号中断

; 打印字符串结束
; -----------------------------------------------------------

   jmp $                    ; 使程序停在此处

   message db "1 MBR"
   times 510-($-$$) db 0
   db 0x55,0xaa

然后编译

cd ~/d2los
nasm -o bin/mbr.bin src/mbr.S 

我们就在目录~/d2los/bin中生成了编译文件mbr.bin,然后我们需要将这个二进制文件装在到我们为bochs虚拟机指定的虚拟硬盘hardisk60MB.img(上一节创建的)中,使用dd命令

cd ~/d2los
dd if=./bin/mbr.bin of=~/bochs/bin/hardisk60MB.img bs=512 count=1 conv=notrunc 

然后运行bochs

~/bochs/bin/bochs -f ~/bochs/bin/bochsrc.disk

然后出现了我们的打印结果

Image

Reference

[1]《一个64位操作系统的设计与实现》
[2]《操作系统真象还原》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653722.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】数据链路层协议+ICMP协议+NAT技术

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻数据链路层👉🏻以太网以太网帧格式网卡Mac地址对比ip地址 👉🏻MTUMTU…

员工管理和激励怎么做?试试场景化激励解决方案!

截止到2020年底,中国企业主体数量达3858.3万,同比增速达11.1%。如何留住人才、激励人才以强化人才与企业“黏性”,最大化提升员工的忠诚度与敬业度,成为企业未来人才发展战略的主要方向之一。 一、传统激励方式存在哪些不足 传统的…

【NumPy】权威指南:使用NumPy的percentile函数进行百分位数计算

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

计算机找不到msvcr110.dll如何解决,总结5种简单靠谱的方法

在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是“msvcr110.dll丢失”。这个错误通常会导致某些程序无法正常运行,为了解决这个问题,下面我将介绍5种有效的解决方法。 一,了解msvcr110.dll是什么 ms…

网络之再谈体系结构

大家都知道的是网络的体系结构,现代软件常用的体系结构无非是TCP/IP协议栈,OSI因为实现复杂并且效率没有TCP/IP协议栈好,所以不用OSI,但是,最近在复习网络知识的时候,发现了一些奇怪的地方,那就…

TinyEngine 低代码引擎:带你5分钟高效构建游戏登录界面

本文由体验技术团队 TinyEngine 项目成员李旭宏创作,欢迎大家实操体验,本体验项目基于 TinyEngine 低代码引擎提供的环境,通过体验简单拖、拉、拽的形式帮助开发者快速了解低代码引擎的使用流程,达到快速开发游戏登录界面的效果。…

yolox-何为混合精度计算AMP?

何为AMP? 全称:Automatic mixed precision自动混合精度。 功能:在神经网络推理过程中,实现针对不同层采用不同的数据精度进行计算,从而实现节省显存和加速训练的目的。 此处提到的不同数据精度包括:32位浮…

每日两题 / 131. 分割回文串 42. 接雨水(LeetCode热题100)

131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 数据量较小&#xff0c;考虑直接暴力&#xff0c;每次dfs&#xff1a;以bg作为左区间&#xff0c;往右遍历&#xff0c;找到一段回文串区间后&#xff0c;将回文串插入vector<string>&#xff0c;并以下一个下标…

适合下班做的副业兼职、1天挣300,7天涨粉2万

最近小红书上有类视频火了&#xff01; 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 利用AI制作的漫画解说历史小说视频。视频以《明朝那些事儿》为蓝本&#xff0c;一上线就疯狂吸粉&#xff0c;多条视频内容都大爆了。 就是这个账号&#xff0c;仅仅…

POLARDB:新零售用户MySQL上云最佳选择

什么是云数据库POLARDB&#xff1f; POLARDB是阿里云自主研发的最新一代RDS关系型数据库&#xff0c;是特别针对互联网场景设计的Cloud-Native 云原生数据库。POLARDB for MySQL版本&#xff0c;在提供100%兼容MySQL5.6/8.0的关系型事务处理ACID特性之上&#xff0c;能够提供完…

MySQL:CRUD初阶(有图有实操)

文章目录 &#x1f4d1;1. 数据库的操作&#x1f324;️1.1 显示当前的数据库&#x1f324;️1.2 创建数据库&#x1f324;️1.3 选中数据库&#x1f324;️1.4 删除数据库 &#x1f4d1;2. 表的操作&#x1f324;️2.1 查看表结构&#x1f324;️2.2 创建表&#x1f324;️2.3…

实战指南:Vue 2基座 + Vue 3 + Vite + TypeScript微前端架构实现动态菜单与登录共享

实战指南&#xff1a;Vue 2基座 Vue 3 Vite TypeScript子应用vue2微前端架构实现动态菜单与登录共享 导读&#xff1a; 在当今的前端开发中&#xff0c;微前端架构已经成为了一种流行的架构模式。本文将介绍如何结合Vue 2基座、Vue 3子应用、Vite构建工具和TypeScript语言…

【IC】partial good

假设单core良率80%&#xff0c;core pass 数量分布呈二项分布。 16个core全pass的概率为&#xff1a; 有n个core pass的概率为&#xff1a; 分布如下&#xff1a; 当np>5且nq>5时&#xff0c;二项分布近似服从正态分布

Python魔法之旅-魔法方法(01)

目录 一、概述 1、定义 2、作用 二、主要应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类…

Postman入门 - 环境变量和全局变量

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、发送请求 二、设置并引用环境变量 比如&#xff1a;我建的这个生产环境 使用环境有两个方式&…

怎么做图片海报二维码?扫码查看图片内容

现在很多的宣传推广海报会放入二维码中&#xff0c;然后将二维码分享给用户后&#xff0c;通过扫码的方式来查看图片内容&#xff0c;从而获取自己需要的信息&#xff0c;经常在活动宣传、商品推广、旅游攻略等场景下使用。二维码可以提供更加便捷的内容获取方式&#xff0c;让…

Vivado打开之前项目仿真过的波形文件

第一步&#xff1a;顶部菜单 点击&#xff1a;Open Static Simulation 然后在弹出的窗口找到.sim结尾的文件夹&#xff0c;在里面找到wdb结尾的文件&#xff0c;点击ok 第二步&#xff1a;依次点击下方红圈 找到wcfg结尾的文件&#xff0c;点击ok即可

echart图表legend每列固定宽度

修改前&#xff1a; 修改后&#xff1a; 关键代码&#xff1a; 设置一个背景并使之透明&#xff0c;否则宽度不生效&#xff0c;配合formatter使用 formatter: {a|{name}},rich:{a: {width: 48,fontSize: 12,backgroundColor: "rgba(11, 39, 52, 0)" // 关键代码&a…

多张图片上传、图片回显、url路径转成File文件

1. 实现 背景&#xff1a;在表单中使用element-plus实现多张图片上传(限制最多10张)&#xff0c;因为还要与其他参数一起上传&#xff0c;所以使用formData格式。 编辑表单回显时得到的是图片路径数组&#xff0c;上传的格式是File&#xff0c;所以要进行一次转换。 <tem…

Pytorch环境配置2.0.1+ Cuda11.7

查找cuda、cudnn、Pytorch(GPU)及cuda和NVIDIA显卡驱动对应关系 查询可支持的最高cuda版本 nvidia-smi查看支持的cuda的版本 CUDA版本对应表 我的显卡驱动是Driver Version&#xff1a;535.40.&#xff0c;那么左边对应的CUDA都可以兼容 右上角为CUDA 版本&#xff0c;可以看…