《操作系统真象还原》学习笔记:第2章——编写MBR主引导记录

2.1 计算机的启动过程

载入内存:

(1) 程序被加载器(软件或硬件)加载到内存某个区域
(2)CPU 的 cs:ip 寄存器被指向这个程序的起始地址

2.2 软件接力第一棒,BIOS

2.2.1 实模式下的 1MB 内存布局

Intel 8086 有 20 条地址线,故其可以访问 1MB 的内存空间,即2的20次方=1048576=1MB。
实模式下的内存布局如下:
在这里插入图片描述
(1)在电脑未开机前,BIOS就被事先写入到内存的F0000~FFFFF中,此区域为ROM,这里面存的是 BIOS 的代码。BIOS的主要工作是检测、初始化硬件,建立中断向量表。
(2)除了内存条,还有一些外设同样是需要通过地址总线来访问。

2.2.2 BIOS 是如何苏醒的

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

jmp far f000:e05b

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

2.2.3 为什么是 0x7c00

BIOS 最后一项工作校验启动盘中位于0盘0道1扇区的内容。如果此扇区末尾的两个字节分别是魔数0x550xaa,BIOS便认为此扇区中确实存在可执行的程序,并把这个扇区的内容加载到物理地址0x7c00的内存中。

2.3 实验

任务:
(1)完成mbr主引导记录的代码编写,并完成编译,完成的代码编译并非真正的MBR主引导程序,而是为了测试mbr程序是否会被加载到0x07c00处被正确执行。
(2)将编译生成的主引导记录内容刻录到我们的创建的启动硬盘中。
创建mbr.s文件:
(1)文件功能:在屏幕上打印字符串“1 MBR”,背景色为黑色,前景色(字体颜色)为绿色.
(2)功能实现方式:借助BIOS建立好的例程0x10号中断,可将0x10号中断看做一个函数,这个函数不同的输入可实现不同的功能,因此要有一个参数表示要实现的功能,也就是接下来要说的功能号参数。
代码:

; ~/d2los/src/mbr.S
; MBR主引导程序
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         mov ax,cs      mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00; 清屏利用 0x06号功能, 上卷全部行, 实现清屏
; -----------------------------------------------------------
; INT 0x10 功能号: 0x06 功能描述: 上卷窗口
; ------------------------------------------------------
; 输入:
; AH = 功能号 0x06
; AL = 上卷的行数(如果为0, 表示全部)
; BH = 上卷行属性
; (CL, CH) = 窗口左上角的(X, Y)位置
; (DL, DH) = 窗口右下角的(X, Y)位置
; 无返回值mov     ax, 0x600mov     bx, 0x700mov     cx, 0           ; 左上角: (0, 0)mov     dx, 0x184f      ; 右下角: (80, 25),; VGA文本模式中, 一行只能容纳80个字符, 共25行.; 下标从0开始, 所以0x18=24, 0x4f=79int     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 0db 0x55,0xaa

编译mrb.S文件:

nasm -o test mbr.s

将文件内容写入0盘0道1扇区:

dd if=/home/abc/Desktop/Bochs/mbr.bin of=/home/abc/Desktop/Bochs/Seven.img bs=512 count=1 seek=0 conv=notrunc

启动bochs查看结果:

bin/bochs -f bochsrc.disk

在这里插入图片描述

0x7c00处打断点,可以看到将0x0000的值移入cs中:
在这里插入图片描述
查看段寄存器:
在这里插入图片描述

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

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

相关文章

Jenkins 使用 Publish over SSH进行远程访问

Publish over SSH 是 Jenkins 的一个插件,可以让你通过 SSH 将构建产物分发到远程服务器。以下是如何开启 Publish over SSH 的步骤: 一、安装 Publish over SSH 插件 在 Jenkins 中,进入 "Manage Jenkins" > "Manage Plugins"。选择 "Availab…

怎么用AI合成PPT?这5款风靡全球的AIPPT软件一定要知道!

当下我们已进入信息过载的时代,每天有无数的信息试图争夺我们的注意力,与此同时,我们也需要向别人展示和呈现信息,这就要求我们能够以最低的成本,在短时间内引起对方的注意,这其中最常用到的工具非PPT莫属。…

简易电阻、电容和电感测量仪-FPGA

通过VHDL语言编写程序用于设计电阻、电容和电感测量仪,通过使用试验箱进行验证是否设计正确,资料获取到咸🐟:xy591215295250 \\\或者联系wechat 号:comprehensivable 设计并制作--台数字显示的电阻、电容和电感参数测试…

C++ 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

这里函数采用两个参数n和k,并返回二项式系数 C(n, k) 的值。 例子: 输入: n 4 和 k 2 输出: 6 解释: 4 C 2 等于 4!/(2!*2!) 6 输入: n 5 和 k 2 输出: 10 解释: 5 C …

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

linux中 nginx+tomcat 部署方式 tomcat挂掉设置自动启动

在Linux环境下,要实现当Tomcat挂掉后自动重启,可以通过编写Shell脚本结合cron定时任务或者使用系统守护进程(如Systemd、Upstart或SysVinit)来完成。 使用Shell脚本和cron定时任务 编写检查并重启Tomcat的Shell脚本:首…

取证与数据恢复:冷系统分析,实时系统分析与镜像分析之间的过渡办法

天津鸿萌科贸发展有限公司是 ElcomSoft 系列取证软件的授权代理商。 ElcomSoft 系列取证软件 ElcomSoft 系列取证软件支持从计算机和移动设备进行数据提取、解锁文档、解密压缩文件、破解加密容器、查看和分析证据。 计算机和手机取证的完整集合硬件加速解密最多支持10,000计…

MMSC物料库位扩充

MMSC物料库位扩充 输入事务码MMSC: 回车后添加新的库位即可: 代码实现,使用BDC *&------------------------------------------------* *&BDC的定义 *&------------------------------------------------* DATA gt_bdcdata T…

ggrcs包4.0版本发布—重新对密度图宽度进行了设计

目前本人写的ggrcs包新的4.0版本已经在CRAN上线,目前支持逻辑回归(logistic回归)、cox回归和多元线性回归。 需要的可以使用代码安装 install.packages("ggrcs")如果原来安装了旧版本,重新在安装一次就可以升级到新版…

如何选择小红书矩阵系统

在内容营销领域,小红书已成为一个不可忽视的平台,尤其是对于品牌和个人创作者来说。小红书矩阵系统,指的是一系列策略和工具,它们可以帮助用户在小红书上高效地管理和分发内容。本文将探讨如何选择适合自己需求的小红书矩阵系统&a…

YOLOv8数据集可视化[目标检测实践篇]

先贴代码,后面再补充解析。 这个篇章主要是对标注好的标签进行可视化,虽然比较简单,但是可以从可视化代码中学习到YOLOv8是如何对标签进行解析的。 下面直接贴代码: import cv2 import numpy as np import osdef read_det_labels(label_file_path):with open(labe…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——完成第一个小项目点灯

一、配置LED引脚(注意引脚都配置为高电平) 二、新建两个任务,一个为动态创建,一个静态创建(以后大多数情况进行动态创建)//将两个优先级设置成一样 补充: 1.FreeRTOS创建静态任务和动态任务的各自优缺点 静态任务和动…

react框架,使用vite和nextjs构建react项目

react框架 React 是一个用于构建用户界面(UI)的 JavaScript 库,它的本质作用是使用js动态的构建html页面,react的设计初衷就是为了更方便快捷的构建页面,官方并没有规定如何进行路由和数据获取,要构建一个完整的react项目,我们需要…

3D技术赋能电商行业:“人-货-场”视角下的新变革!

在当今数字化时代,3D技术正以前所未有的方式赋能电商行业,在提升用户体验,优化商品展示,以及打造沉浸式的购。物场景上,重塑了电商行业的面貌,深刻改变着消费者的购物体验和商家的营销策略。 51建模网作为专…

视图库对接系列(GA-T 1400)九、视图库对接系列(本级)机动车数据推送

背景 在上几章中,我们已经可以将视图库的平台写到我们的数据库中了。 换句话说就已经接入我们的平台了,这几期的话,我们就对接设备, 将设备的数据接入到我们平台来。 机动车数据推送 接入机动车数据推送相对比较简单,我们只需要实现对应的接口就ok了。 具体如图: 有增…

RRStudio 下载及安装(详尽版)

R语言来自S语言,是S语言的一个变种。S语言、C语言、Unix系统都是贝尔实验室的研究成果。R 语言是一种解释型的面向数学理论研究工作者的语言,主要用于统计分析、绘图、数据挖掘。 R 语言自由软件,免费、开放源代码,支持各个主要计…

Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?

Emacs 是一个功能强大的文本编辑器,它在开发者和程序员中非常受欢迎,主要优点包括: 可定制性:Emacs 允许用户通过 Lisp 编程语言来自定义编辑器的行为和界面,几乎可以修改任何方面。扩展性:拥有大量的扩展…

C++:类型转换

目录 一、C语言中的类型转换 二、为什么C要新的转换格式 三、 C强制类型转换 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast 一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配&…

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树,广泛应用于数据库和 文件系统中,以保持数据…

等保2.0的具体技术要求有哪些重点?

在数字化浪潮汹涌澎湃的当下,网络安全犹如一座守护智慧之城的巍峨城墙,不可或缺。等级保护制度(等保)作为我国网络安全战略的基石,历经岁月沉淀,已演进至2.0时代,即《网络安全等级保护基本要求》…