编写 MBR 主引导记录

news2024/9/25 11:19:49

文章目录

  • 前言
  • mbs.S代码
  • 实验操作

前言

本博客记录《操作系统真象还原》第二章最后一节的实验操作~

实验需要安装Bochs软件,具体可食用Bochs下载安装博客。

实验环境:ubuntu18.04+VMware

实验内容:在屏幕上打印字符串“1 MBR”,背景为黑色,前景为绿色。

实验原理(重点):计算机开机后,首先运行BIOS软件(计算机系统的控制权 [CPU的使用权] 交接的第一棒就是BIOS啦!),BIOS会检查各种设备的情况,并且建立中断向量表。然后MBR找机会想把处理器使用权交出去。下一个接棒选手就是 主引导记录(MBR,Master Boot Record),BIOS知道MBR在0盘0道1扇区,因此它会将0盘0道1扇区中的MBR引导程序加载到物理地址0x7c00,然后继而跳去执行。这样BIOS就将处理器的使用权交给MBR。

本人理解:这样的话,我们只需要把想运行的代码放到0x7c00地址,这样程序成为了MBR程序,就会执行我们编写的代码并输出想要的内容。

mbs.S代码

mbr.S

;主引导程序 
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
   mov ax,cs   ;由于BIOS是通过jmp 0:0x7c00跳转到MBR,故cs为0   
   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  ; 填充剩下的空间,使生成的二进制代码恰好为512字节
   db 0x55,0xaa           ; 结束标志

代码说明:

  1. 第 3 行 vstart=0x7c00 :表示本程序在编译时,告诉编译器,把我的起始地址编译为 0x7c00。
  2. 第4~8行是用cs寄存器的值去初始化其他寄存器 ,由于 BIOS 是通过jmp 0: 0x7c00跳转到 MBR 的,故cs的值为0。
  3. 第9 行是初始化栈指针。查<实模式下内存布局>表格可知,这部分区域可以使用。
  4. 第11~28 行的功能是清屏。
  5. 第30~35 行是做打印前的工作,先获取光标位置,目的是避免打印字符混乱,覆盖别人的输出 。
  6. 第38~52 行是往光标处打印字符。
  7. 第55 行执行了个死循环,$是本行指令的地址,这属于伪指令,是汇编器在编译期间分配的地址。
  8. 第57行是定义打印字符。
  9. 第58行是 填充剩下的空间,使生成的二进制代码恰好为512字节。

【补充】nasm中的$$$的含义

$表示"此处的地址"。
$$表示"当前段的起始地址"。
因此$-$$表示"当前节的大小"

实验操作

操作思路

  • 首先我们先创建汇编文件并将其编译成bin后缀的文件
  • 创建一个硬盘,接着将编译后的文件(bin后缀)存储到0盘0道1扇区中成为MBR
  • 最后启动Bochs

开始动手操作 ( ^ _ ^ )

  1. 创建编译mbr.S文件
(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo vim mbr.S
(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo nasm -o mbr.bin mbr.S
(base) user@ubuntu:/home/cooiboi/bochs/bin$ ls -lb mbr.bin
-rw-r--r-- 1 root root 512 Jan  4 05:56 mbr.bin
  1. 创建硬盘
sudo ./bximage 
(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo ./bximage 
========================================================================
                                bximage
  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs
         $Id: bximage.cc 12690 2015-03-20 18:01:52Z vruppert $
========================================================================

1. Create new floppy or hard disk image
2. Convert hard disk image to other format (mode)
3. Resize hard disk image
4. Commit 'undoable' redolog to base image
5. Disk image info

0. Quit

Please choose one [0] 1

Create image

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] hd

What kind of image should I create?
Please type flat, sparse, growing, vpc or vmware4. [flat] flat

Enter the hard disk size in megabytes, between 10 and 8257535
[10] 60

What should be the name of the image?
[c.img] hd60M.img

Creating hard disk image 'hd60M.img' with CHS=121/16/63

The following line should appear in your bochsrc:
  ata0-master: type=disk, path="hd60M.img", mode=flat
dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
  1. 将bin文件(mbr.bin)写入硬盘(hd60M.img)中

输入文件是刚刚编译出来的 mbr.bin ,输出是我们虚拟出来的硬盘 hd60M.img ,块大小指定为 512 字节,只操作 1 块,即总共 1*512=512 字节。

(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo dd if=mbr.bin of=hd60M.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes copied, 0.000325151 s, 1.6 MB/s

mbr.bin 己经写进 hd60M.img 的第 0 块了

  1. 启动Bochs
(base) user@ubuntu:/home/cooiboi/bochs/bin$ sudo ./bochs -f bochsrc.disk

输入6,然后再输入c。紧接着,屏幕上显示绿色的1 MBR.

在这里插入图片描述

【注意】:这里需要编写bochsrc.disk文件

megs : 512

#注意路径 必须是你安装的路径 别弄错了
romimage: file=/home/cooiboi/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/cooiboi/bochs/share/bochs/VGABIOS-lgpl-latest

boot: disk

log: bochs.out

mouse:enabled=0
keyboard:keymap=/home/cooiboi/bochs/share/bochs/keymaps/x11-pc-us.map

ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14

ata0-master: type=disk, path="hd60M.img", mode=flat,cylinders=121,heads=16,spt=63
#ata0-master: type=disk, path="/home/cooiboi/bochs/bin/./hd60M.img", mode=flat, cylinders=121, heads=16, spt=63

#gdbstub:enabled=1,port=1234,text_base=0,data_base=0,bss_base=0

具体可以食用Bochs下载安装

参考资料

  • 《操作系统真象还原》
  • Bochs下载安装
  • 《操作系统真象还原》第二章 ---- 编写MBR主引导记录 初尝编写的快乐 雏形已显!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C进阶_C语言_指针进阶_C语言指针进阶

除了自己的无知&#xff0c;我什么都不懂。 ——苏格拉底 *此博客为进阶指针详解&#xff0c;需要有一定的初阶指针基础。 我们知道&#xff0c;指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 指针的大小是固定的4/8个字节。在32位平台上是…

003-Ensp-实验-配置DHCP

实验要求 1. 根据网络结构开DHCP服务&#xff0c;使PC1 / PC2 自动获取IP地址并可以互Ping 网络结构 实验步骤 1. 配置AR2路由器g0/0/0接口IP&#xff0c;开启DHCP <Huawei>system-view [Huawei]dhcp enable [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]…

公司变更名称很麻烦吗?来来来,心周小编教你小技巧

我们都知道&#xff0c;公司如果拥有一个好的名字&#xff0c;对公司的推广会带来很大的便利&#xff0c;让客户更容易记住公司&#xff0c;记住公司的产品及相关性能&#xff0c;比如奥迪汽车公司&#xff0c;大家能一下子想到奥迪车&#xff0c;想到奥迪车的设计&#xff0c;…

UG/NX二开Siemens官方实例解析 4.3 EX_Curve_CreateSpline(创建样条曲线)

前言本系列文章主要讲解NXOpen UF API&#xff08;简称ufun函数&#xff09;的使用&#xff0c;之前看教学视频大都建议用ufun进行开发&#xff0c;这里西门子官方还专门给了一套系列文章来讲&#xff0c;说明官方也是特别推崇ufun。本人从事二开也有一段时间了&#xff0c;我的…

EasyCRM V5客户关系管理系统源码,全功能全插件带手机版无加密开源版,集成OA系统

这个是Easycrm v5最新版本&#xff0c;程序代码全部大量重写&#xff0c;运行效率提升100倍。轻松负载500w以上数据量。 代码全部明文开源&#xff0c;便于二次开发和部署。 网上其他地方的版本都是很遗憾的告诉你&#xff0c;没有手机版&#xff0c;没有财务管理等功能插件。…

【Unity3D编辑器扩展】Unity3D中实现UI界面控制,UI界面的显示和隐藏实现

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;可能遇到管理…

EMP v2.5三级共享深度定制对ESM 的支持

版本背景 1 Module Federation 共享逻辑CDN复用性不高2 ESM兼容性日益成熟&#xff0c;性能表现越来越好3 市面上针对 ESM 的模块共享实现不完善4 开发、正式环境结合共享的开发体验不佳 ESM 概念 ESM - ES modules 是 JavaScript 官方的标准化模块系统。相比于 CommonJS 和 …

mysql知识点总结(网安必备)

目录 数据库介绍 数据库基本概念 数据库类型 MySql数据库管理系统 SQL语言 概述 常见操作 表的完整性约束 非外键约束 外键约束 单表查询 函数 多表查询 事务 事务隔离级别 视图 数据库介绍 数据库基本概念 数据&#xff1a;所谓数据&#xff08;Data&#xf…

什么是融合通信?

近年来融合通信概念被广泛提起&#xff0c;那么&#xff0c;什么是融合通信&#xff1f;融合通信可以融合哪些设备或者系统呢&#xff1f; 近代通信技术得益于电话网的出现&#xff0c;人们通过电话实现了跨越式的通信。随着计算机和互联网的出现&#xff0c;人们可以利用互联网…

谷粒学院——十三章、登录与注册

用户登陆业务介绍 单一服务器模式 早期单一服务器&#xff0c;用户认证。 缺点&#xff1a;单点性能压力&#xff0c;无法扩展。 SSO 模式&#xff08;单点登陆&#xff09; 分布式&#xff0c;SSO(single sign on)模式&#xff0c;也叫单点登陆模式。 优点: 用户身份信…

【C++高阶数据结构】图

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

代码随想录拓展day7 649. Dota2 参议院;1221. 分割平衡字符串;5.最长回文子串;132. 分割回文串 II;673.最长递增子序列的个数

代码随想录拓展day7 649. Dota2 参议院&#xff1b;1221. 分割平衡字符串&#xff1b;5.最长回文子串&#xff1b;132. 分割回文串 II&#xff1b;673.最长递增子序列的个数 贪心和动态规划的题目。因为贪心其实没什么规律&#xff0c;所以就简要记录了。 649. Dota2 参议院 …

数据可视化系列-04数据大屏基础知识

文章目录5.销售数据看板5.1 了解数据大屏基础知识1.数据大屏简介&#xff1a;2.数据大屏使用场景3.数据大屏分类5.2 数据大屏的设计&#xff1a;1.大屏前端设计流程2.数据大屏设计尺寸解析3.可视化视觉设计5.3 大屏开发工具DataV&#xff1a;1.DataV数据可视化简介2.优势3.Data…

植物大战僵尸:遍历向日葵的生产速度

找到向日葵的吐出阳光的速度&#xff0c;向日葵生产阳光是一个周期性的,所以其内部是有一个计时器控制的,我们只要找到这个计时器并改写它的定时时间即可完成无限吐阳光的作用 向日葵的遍历技巧: 首先种下一个向日葵 -> 然后CE马上搜索->未知初始化回到游戏->然后在…

关于单相智能多用户远程预付费控系统的优化设计研究

摘要&#xff1a;由于现有系统仅对电表数据进行读取操作&#xff0c;存在成本较高和耗时较长的问题&#xff0c;为此对单相智能多用户远程预付费控系统优化设计进行研究。选择电能表子系统作为优化对象&#xff0c;选取78KO527A微控制器作为电能表子系统的控制核心&#xff0c;…

Java 并发编程 (三)Phaser

#Phaser 功能介绍 CyclicBarrier 解决了 CountDownLatch的缺点&#xff0c;但是其本身也仍然具备一定的缺陷&#xff0c;比如不可以动态添加parties 调用一次await 仅占用1个parties public class MyPhaser {private Phaser phaser new Phaser(3);public void testA(){System…

微信过期文件怎么找回?2个方法,轻松解决

现在很多小伙伴都喜欢使用微信发送文字、图片、语音、照片、文件等内容给对方。可是在其中&#xff0c;文件内容比较特殊。如果没有及时进行查看&#xff0c;过了一段时间就会变成过期文件&#xff0c;无法再进行查看了。微信过期文件怎么找回&#xff1f;今天小编分享2个简单好…

微型消防站一体化指挥作战解决方案

一、政策要求 近年政府对社区微型消防站提出了新的建设要求&#xff1a; 1、 大力发展多种形式消防队伍&#xff0c;逐步加强现役消防力量建设&#xff0c;发展政府专职消防队&#xff0c;企业事业单位专职消防队和志愿消防队。 2、 明确城市消防安全布局和公共消防设施的消…

vue 可视化表单设计器 自定义组件

有一款基于vue的可视化表单编辑器&#xff0c;直接双击或者拖拽组件&#xff0c;便可以创建一个表单&#xff0c;非常方便。今天为大家介绍这款编辑器&#xff1a; 官方地址&#xff1a;Variant Form - 可视化低代码表单 github地址&#xff1a;https://github.com/vform666/…

Redshift渲染器为什么这么受欢迎?

Redshift是用于高质量制作工作的渲染器 。它是很快的渲染引擎&#xff0c;并且可以很好地与许多第三方插件配合使用。在本文中&#xff0c;让我们深入了解Redshift的更多细节。什么是 Redshift 及其工作原理&#xff1f;Redshift 是一种有偏见的 GPU 渲染引擎&#xff0c;它支持…