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

news2024/10/6 8:26:05

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,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

编译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.coloradmin.cn/o/1895577.html

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

相关文章

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号,软件将编译生成的雷达信号任意波数据下载到信号发生器中,主要是1466-V矢量信号发生器,可实现雷达信号模拟产生。软件可模…

结构方程模型-验证性因子分析模型

初级 第7讲 验证性因子分析模_哔哩哔哩_bilibili

【matlab】【python】爬虫实战

目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代,数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…

7.Android逆向协议-抓取安卓http和https数据包(设备需要root权限)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:6.Android逆向协议-配置FD抓包环境 root: 现在的安卓手机不好搞,有很多坑&am…

ECSNet: Spatio-Temporal Feature Learning for Event Camera

标题:ECSNet:事件相机的空间时间特征学习 源文:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656 源码:GitHub - zhiwen-xdu/ECSNet…

AIGC为设计师解决了什么问题?

在当今数字化时代,设计师们面临着前所未有的挑战和压力。他们不仅要不断创新以满足市场和客户的需求,还要紧跟快速变化的设计趋势和技术发展的步伐。幸运的是,随着生成式人工智能(AIGC)的兴起,设计师们找到…

Prometheus安装部署

1 常见部署方式 包安装 RHEL系统: https://packagecloud.io/app/prometheus-rpm/release/search 二进制安装 https://prometheus.io/download/ 基于 Docker 运行 https://prometheus.io/docs/prometheus/latest/installation/ 1.1 Docker 镜像直接启动 [root120 ~]# d…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 (Windows 系统日志) 七牛Logkit (Windows&Linux&Mac 等) -…

深度学习图像生成与分割模型详解:从StyleGAN到PSPNet

文章目录 Style GANDeeplab-v3FCNAdversarial AutoencodersHigh-Resolution Image Synthesis with Latent Diffusion ModelsNeRF: Representing Scenes as Neural Radiance Fields for View SynthesisPyramid Scene Parsing Network Style GAN 输入是一个潜在向量 (z)&#xff…

SPI四种模式--极性与相位

SPI的四种模式:相位和极性 极性 定义时钟空闲状态: CPOL0:时钟线在空闲状态为低电平 CPOL1:时钟线在空闲状态为高电平 这个设置决定了设备不进行通信时时钟线的状态。 兼容性: 不同的SPI设备可能需要不同的时钟极性…

Elasticsearch:Ingest architectures - 摄取架构

我们提供各种采集架构,以满足各种用例和网络配置的需求。 要将数据采集到 Elasticsearch,请使用最符合你的需求和用例的选项。对于许多用户和用例来说,最简单的方法是使用 Elastic Agent 采集数据并将其发送到 Elasticsearch。Elastic Agent…

Rhino 犀牛三维建模工具下载安装,Rhino 适用于机械设计广泛领域

Rhinoceros,这款软件小巧而强大,无论是机械设计、科学工业还是三维动画等多元化领域,它都能展现出其惊人的建模能力。 Rhinoceros所包含的NURBS建模功能,堪称业界翘楚。NURBS,即非均匀有理B样条,是计算机图…

PTrade量化软件常见问题整理系列2

一、研究界面使用get_fundamentals函数报错:error_info:获取token失败? 研究界面使用get_fundamentals函数报错:error_info:获取token失败? 1、测试版本202202.01.052,升级202202.01.051版本后,为了解决不…

卡尔曼滤波Q和R怎么调

卡尔曼滤波器是一种有效的估计算法,主要用于在存在噪声的环境中估计动态系统的状态。它通过结合预测模型(系统动态)和观测数据(包括噪声)来实现这一点。在卡尔曼滤波中,调整过程噪声协方差矩阵 ( Q ) 和测量…

idea删除分支并同步到gitLab以及gitLab上的分支删除

目录 idea删除分支并同步到gitLab 方法一(推荐) 方法二(命令行) gitLab上的分支删除 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&…

5.opencv深浅拷贝

图像处理的复制操作 深浅拷贝 图像复制分成两种,第一种假复制,从原图片选择一部分图片拿出来观察,此时新生成的图片和原图实际上是同一张图片,即浅拷贝 将图片的一部分复制下来,放到新的内存中,即两张完全…

ActiveAnno3D采用主动学习实现领域自适应,实现大规模数据集的快速标注(代码开源)

Abstract 大规模数据集的策划仍然成本高昂且需要大量时间和资源。数据通常需要手动标注,创建高质量数据集的挑战依然存在。在这项工作中,我们使用主动学习填补了多模态3D目标检测研究的空白。我们提出了ActiveAnno3D,这是一种主动学习框架&a…

基于香橙派AIpro搭建的车牌识别系统

引言 本人正有学习嵌入式的想法,正好碰到机会让我搞了块OrangePi AIpro(香橙派AIpro)开发板,正合我意,直接上手进行体验,顺便给大家分享下我的实践过程。 开发板介绍与初次启动 OrangePiAIPro开发板是香…

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法(SPWM)是将每一正弦周期内的多个脉冲作自然或规则的宽度调制,使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列,形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…