操作系统真象还原:编写MBR主引导记录,让我们开始掌权

news2024/11/17 13:28:11

第2章-编写MBR主引导记录,让我们开始掌权

这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件

在开机的一瞬间,也就是接电的一瞬间, CPU 的 CS: ip 寄存器被强制初始化为 0XF000: 0XFFF0。由于开机的时候处于实模式,再重复一遍加深印象,在实模式下的段基址要乘以 16,也就是左移位,于是0XF000: 0XFFF0的等效地址将是 0XFFFF0

BIOS 最后一项工作校验启动盘中位于 0 盘。道 1 扇区的内容。 如果此扇区末尾的两个字节分别是魔数 0x550xaa, BIOS 便认为此扇区中确实存在可执行的程序(在此先剧透一下,此程序便是久闻大名的主引导记录 MBR),便加载到物理地址 0x7c00,随后跳转到此地址,继续执行 。

0xfe05b 处,这是 BIOS 代码真正开始的地方 ,BIOS 跳转到 0x7c00 是用 jmp 0: 0x7c00 实现的,这是 jmp 指令的直接绝对远转移用法,段寄存器 cs 会被替换,这里的段基址是 0,即 cs 由之前的 0xf000 变成了0

$$$是编译器 NASM 预留的关键字,用来表示当前行和本 section 的地址,起到了标号的作用,它是 NASM 提供的,并不是 CPU 原生支持的 。

用8086汇编语言编写显示字符的程序。该程序共512字节(不足部分补0),且最后两个字节是0x55与0xaa。该程序用NASM编译后,用dd命令写入bochs启动硬盘的0盘0道1扇区,BIOS会自动加载程序到内存中,然后自动跳转执行该程序。

                                ;主引导程序 
                                ;------------------------------------------------------------
SECTION MBR vstart=0x7c00         
    mov ax,cs                   ;此时cs寄存器为0,自然可以用来将ax寄存器置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               ;ah中输入功能号
    mov bx, 0x700               ;设置上卷行属性,0x70表示用黑底白字的属性填充空白行
    mov cx, 0                   ;左上角: (0, 0)
    mov dx, 0x184f	            ;右下角: (80,25),
			                    ;VGA文本模式中,一行只能容纳80个字符,共25行。
			                    ;下标从0开始,所以0x18=24,0x4f=79
    int 0x10                    ;int 0x10

                                ;;;;;;;;;    下面这三行代码是获取光标位置    ;;;;;;;;;
    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,07是黑底白字)
    int 0x10		            ; 执行BIOS 0x10 号中断
                                ;;;;;;;;;      打字字符串结束	 ;;;;;;;;;;;;;;;

    jmp $		                ; 使程序悬停在此

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

vstart:主要是把地址编译为0x7c00

vstartorg ,它们的功能是告诉编译器:“嘿,老兄,你帮我把后面所有数据〈指令和变量 )的地址以 xxxx 为起始开始编吧”

mbr 用 vstart=0x7c00 来修饰的原因,是因为开发人员知道 mbr 要被加载器( BIOS )加载到物理地址0x7c00, mbr 中后续的物理地址都是 0x7c00+。另外,因为 BIOS 进入 mbr 是通过 jmp 0: 7c00 来实现的,故此时 cs 己经变成 0,相当于“平坦模型”了,只不过此“平坦模型”大小只是 65536 字节,而不是 4GB 。
所以 mbr 中各数据编译出来的地址(大于等于 0x7c00 )实际上都成了偏移地址,这样“俨 16:偏移地址。0x7c00+”来访问被加载到 0x7c00 的 mbr 是正确无误的。所以说,用 vstart 的时机是:我预先知道我的程序将来被加载到某地址处。程序只有加载到非 0 地址时 vstart 才是有用的,程序默认起始地址是 0 。

此时的一个内存结构图为:
在这里插入图片描述

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

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

相关文章

第一课、Power BI 集成Python

1,下载安装python Python软件地址:Welcome to Python.org 双击自定义安装指定位置并勾选配置环境变量。 后续一直往下,安装完成。 检验是否成功,在cmd命令窗口下输入python 即可看到版本。 安装 pip install pandas 和 pip…

win10双网卡如何同时上内网和外网?

win10双网卡如何同时上内网和外网? Chapter1 win10双网卡如何同时上内网和外网?Chapter2 网络基础--win10双网卡设置成访问不同的网络 Chapter1 win10双网卡如何同时上内网和外网? 原文链接:https://www.jb51.net/os/win10/806585.html 场景:很多办…

使用递归形式以及迭代形式实现树的前中后序遍历

相信大家对于二叉树的遍历并不陌生,对于二叉树的递归遍历我们也可以信手拈来。但是如果让我们将二叉树修改成为非递归的形式呢?是不是有点疑惑了?那么本次博客我们就来梳理一下二叉树的非递归遍历。 由于递归遍历二叉树的代码以及逻辑都很简单…

LeetCode 63.不同路径Ⅱ

思路&#xff1a; 在有障碍物的地方增加一个判断即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

拓数派与浙江平数举行「政务数据服务产品合作开发」签约仪式

3月14日&#xff0c;杭州拓数派科技发展有限公司&#xff08;以下简称“拓数派”&#xff09;与浙江平数科技有限公司&#xff08;以下简称“浙江平数”&#xff09;举行了关于政务数据服务产品合作开发的签约仪式。在嘉兴平湖市政务服务管理办公室党委副书记、主任&#xff0c…

移动硬盘未格式化数据恢复及预防策略

随着数字化时代的到来&#xff0c;移动硬盘作为数据存储的重要载体&#xff0c;被广泛应用于个人和企业中。然而&#xff0c;当移动硬盘遭遇“未格式化”的困境时&#xff0c;其中的数据便岌岌可危。本文将深入探讨移动硬盘未格式化的现象、原因、数据恢复方案以及预防措施&…

linux开放某一个端口具体步骤

场景&#xff1a;当服务器防火墙不能直接关闭&#xff0c;但是客户端必须要访问服务器某一个端口时。 处理&#xff1a;对服务器端进行处理&#xff0c;只将该端口开放出来让客户端访问 本地使用vm安装了一个centos服务器&#xff0c;ip地址是 192.168.200.130。在这里充当服…

Python-3.12.0文档解读-内置函数bytes()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 详细说明 概述 构造函数 参数说明 示例 字节串字面值 操作与方法 相关类型 记…

富凡行是什么软件,来具体聊一聊它的详情,感兴趣的不要错过了

目前做网络项目的人很多&#xff0c;也就衍生出了很多的软件、项目、平台。接触过了很多的产品&#xff0c;感触颇深&#xff0c;确实市面上的东西差别都很大&#xff0c;有好的&#xff0c;有不好的。 我也是喜欢在网上做点副业&#xff0c;自己捣鼓一下&#xff0c;毕竟互联网…

基于51单片机的温湿度控制系统

一.硬件方案 本设计采用51单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度&#xff0c;在液晶屏上即时显示。液晶屏上同时显示温湿度上限值&#xff0c;该上限值保存外外部EEPROM存储器中&#xff0c;掉电不失&#xff0c;并且可以通过四只按键上调或下调。当温度或湿度值超…

Linux驱动开发笔记(二) 基于字符设备驱动的GPIO操作

文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…

小红书图文笔记怎么做?纯干货!

小红书图文笔记的制作是一门艺术&#xff0c;它需要结合精美的图片和有价值的内容&#xff0c;以吸引和留住用户的注意力。伯乐网络传媒给大家分享制作小红书图文笔记的干货指南&#xff0c;包括准备、制作、发布和优化的各个环节。 一、准备阶段 确定目标受众&#xff1a;找到…

kubernetes-PV与PVC、存储卷

一、PV和PVC详解 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…

uniapp登录成功后跳回原有页面+无感刷新token

uniapp登录成功后跳回原有页面 引言 在C端的页面场景中&#xff0c;我们经常会有几种情况到登录页&#xff1a; 区分需要登录和不用登录的页面&#xff0c;点击需要登录才能查看的页面 已经登录但是超时&#xff0c;用户凭证失效等原因 以上情况可以细分为两种&#xff0c;一…

自动化测试实践:揭秘WebSocket在接口测试中的应用

如何写接口自动化&#xff1f;这个问题&#xff0c;但凡涉足过自动化测试的人员都能娓娓道来。Requests、urlib、jmeter、curl等等&#xff0c;不在话下。那么&#xff0c;如何获取接口的url、参数、响应等信息呢&#xff1f;&#xff01;答案就更是随口而出&#xff1a;看接口…

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)

1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…

利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

检索增强生成 (Retrieval Augmented Generation&#xff0c;RAG) 可将存储在外部数据库中的新鲜领域知识纳入大语言模型以增强其文本生成能力。其提供了一种将公司数据与训练期间语言模型学到的知识分开的方式&#xff0c;有助于我们在性能、准确性及安全隐私之间进行有效折衷。…

计算机网络-Traffic-Filter流量过滤策略

一、概述 为提高网络安全性&#xff0c;管理人员需要控制进入网络的流量&#xff0c;将不信任的报文丢弃在网络边界。所谓的不信任报文是指对用户来说存在安全隐患或者不愿意接收的报文。同时保证数据访问安全性&#xff0c;企业网络中经常会要求一些部门之间不能相互访问。 背…

金融行业专题|超融合对国密卡和国产加密技术的支持能力如何?

目前&#xff0c;不少金融机构都使用国密卡&#xff08;满足国密算法要求的加密卡&#xff09;和国产密码解决方案保障金融信息安全。而在传统虚拟化架构下&#xff0c;单块加密卡通常只能服务一个系统&#xff0c;经常会出现资源利用率低、加密处理性能不足等问题&#xff0c;…