操作系统真象还原:完善MBR

news2024/11/17 22:02:42

第3章-完善MBR

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

编译器给程序中各符号(变量名或函数名等)分配的地址,就是各符号相对于文件开头的偏移量 。

section 称为节,在有的编译器中,同时支持 segment 和 section 这两个关键字,它们的功能都是在程序中宣称一个区域。

关键字 section 并没有对程序中的地址产生任何影响,即在默认情况下,有没有 section 都一个样, section 中数据的地址依然是相对于整个文件的顺延,仅仅是在逻辑上让开发人员梳理程序之用 。

实模式是指 8086 CPU 的寻址方式、寄存器大小、指令用法等,是用来反应 CPU 在该环境下如何工作的概念 。

在这里插入图片描述

段基址在实模式下要乘以 16,在保护模式下只是个选择子(保护模式中会讲〉,但其作用就是指定一片内存的起始地址 。

代码段寄存器 cs 就是用来指向内存中这段指令区域的起始地址。

数据段和代码段类似,只是这段区域中的内容不是指令,而是纯粹的数据,也就是说里面存储的是程序运行所需要的数据,属于指令的操作数 。数据段寄存器 DS 便是用来指向此数据区域的起始地址。

栈段寄存器 SS 就是用来指向此区域的起始地址。

访问内存就要用“段:段内偏移”的形式,所以 cs 寄存器用来存代码段段基址, IP寄存器用来存储代码段段内偏移地址,同 cs 寄存器一样都是 16 位宽。

实模式,还是保护模式,通用寄存器有 8 个,分别是 AX 、 BX 、 CX、DX 、 SI 、 DI 、 BP 、 SP 这些都是16为寄存器,可以扩展为32位寄存器,就是在前面加上e
在这里插入图片描述
在这里插入图片描述

call 指令用来执行一段新的代码,让 CPU 踏上新的征途

ret (return 指令的功能是在栈顶(寄存器 SS: Sp 所指向的地址)弹出2字节的内容来替换IP寄存器,ret指令使得sp+2

retf ( return far)是从战顶取得4字节,栈顶出的2字节用来替换IP寄存器,另外两个字节用来替换CS寄存器,retf指令使得sp+4

ret 和 retf 的区别便是 ret 用于近返回, retf 用于远返回。
在这里插入图片描述

接下来我们要用MBR做点实事了,MBR只有510B,能做的事情非常少,所以不能指望它做完所有事情。所以,我们用它把操作系统的loader加载到指定位置,然后跳转到loader执行,loader由于大小可以比MBR大得多,所以能做的就很多了。所以,MBR要加载loader,就必须要和磁盘打交道。打交道的方式很简单,就是通过in与out指令与磁盘暴露在外的寄存器交互。
在这里插入图片描述

磁盘端口寄存器对应的用途:
在这里插入图片描述

在我们的系统中主要使用三个命令:

  1. identify: 0XEC,即硬盘识别
  2. read sector: 0x20,即读磁盘
  3. write sector : 0x30,即写磁盘

操作的步骤:
在这里插入图片描述

所以当前要写的MBR.s的作用是从磁盘中加载操作系统的loader,该loaer由我们自己写入磁盘

                   ;-------------	 loader和kernel   ----------
LOADER_BASE_ADDR equ 0x900 
LOADER_START_SECTOR equ 0x2
;这里起始的loader在磁盘:0道2扇区,MBR在0道1扇区
;主引导程序
%include "boot.inc"
SECTION MBR vstart=0x7c00
	mov ax,cs
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov fs,ax
	mov sp,0x7c00	;栈顶,开辟栈往下开辟,上面是BIOS
	mov ax,0xb800	;这个0xb800指向的是用于文本模式显示适配器的地址,用来输出文字
	mov gs,ax
	
	
	mov ax,0600h	;利用0x06号中断清屏
	mov bx,0700h
	mov cx,0		;左上角: (0, 0)
	mov dx,184fh	;右下角: (80,25),
	
	int 10h
	
	mov byte [gs:0x00],'1'	;这是值
	mov byte [gs:0x01],0xA4	;这是属性,A表示绿色背景闪烁,4表示前景色为红色
	
	mov byte [gs:0x02],' '
	mov byte [gs:0x03],0xA4
	
	mov byte [gs:0x04],'M'
	mov byte [gs:0x05],0xA4
	
	mov byte [gs:0x06],'B'
	mov byte [gs:0x07],0xA4
	
	mov byte [gs:0x08],'R'
	mov byte [gs:0x09],0xA4
	
	mov eax,LOADER_START_SECTOR	;起始扇区lba地质
	mov bx,LOADER_BASE_ADDR		;写入的地质
	mov cx,1			;待读入的扇区数
	call rd_disk_m_16
	
	jmp LOADER_BASE_ADDR
	
;------------------------------------------------
;功能:在16位模式下读取硬盘的n个扇区
rd_disk_m_16:
;--------------------------------------------------
					;eax=LBA扇区号
					;bx=将数据写入的内存地质
					;cx=读入的扇区数
	mov esi,eax		;备份eax
	mov di,cx		;备份cx
;读写硬盘
;第一布:设置要读取的扇区数
	mov dx,0x1f2 
	mov al,cl
	out dx,al	;读取的扇区数
	
	mov eax,esi	;恢复ax
	
;第二步:将LBA地址存入0x1f3~0x1f6
	
	;LBA地址7-0位写入端口0x1f3
	mov dx,0x1f3
	out dx,al	
	
	;LBA地址15-8位写入端口0x1f4
	mov cl,8
	shr eax,cl	;逻辑右移指令
	mov dx,0x1f4
	out dx,al
	
	;LBA地址23-16位写入端口0x1f5
	shr eax,cl
	mov dx,0x1f5
	out dx,al
	
	shr eax,cl
	and al,0x0f	;lba第24-27位	
	or al,0xe0	;设置7-4位为1110,表示lba模式
	mov dx,0x1f6
	out dx,al
	
;第3步:向0x1f7端口写入读命令,0x20
	mov dx,0x1f7
	mov al,0x20
	out dx,al

;第4步:检测硬盘的状态
   .not_ready:
   	;同一端口,写时表示写入命令字,读时表示读入硬盘状态
   	nop
   	in al,dx
   	and al,0x88	;第 3 位为 1 表示硬盘控制器已准备好数据传输
			;第 7 位为 1 表示硬盘忙	
	cmp al,0x08
	jnz .not_ready	;若未准备号,继续等待

;第 5 步:从 OxlfO 端口读数据
	mov ax,di	;di里是扇区数
	mov dx,256
	mul dx
	mov cx,ax
;di 为要读取的扇区数,一个扇区有 512 字节,每次读入一个字,共需 di*512/2 次,所以 di*256	
	mov dx,0x1f0
    .go_on_read:
    	in ax,dx
    	mov [bx],ax
    	add bx,2
    	loop .go_on_read
    	ret 
	
	times 510-($-$$) db 0
	db 0x55,0xaa

加载的loader.s调试代码如下,主要是为了测试当前mbr.s是否成功加载到loader.s

%include "boot.inc"

section loader vstart=LOADER_BASE_ADDR
;输出背景色绿色,前景色红色,并且跳动的字符"1 MBR"
	mov byte [gs:0x00],'2'
	mov byte [gs:0x01],0xA4
	
	mov byte [gs:0x02],' '
	mov byte [gs:0x03],0xA4
	
	mov byte [gs:0x04],'L'
	mov byte [gs:0x05],0xA4
	
	mov byte [gs:0x06],'O'
	mov byte [gs:0x07],0xA4
	
	mov byte [gs:0x08],'A'
	mov byte [gs:0x09],0xA4
	
	mov byte [gs:0x0A],'D'
	mov byte [gs:0x0B],0xA4
	
	mov byte [gs:0x0C],'E'
	mov byte [gs:0x0D],0xA4
	
	mov byte [gs:0x0E],'R'
	mov byte [gs:0x0F],0xA4
	
	jmp $


内存结构分布图:

在这里插入图片描述

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

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

相关文章

MSMG Toolkit深度Windows系统镜像文件个性定制!

MSMG Toolkit,这个听起来略显神秘的名字,在DIY电脑爱好者和系统管理员的圈子中却是大名鼎鼎。这是一款免费的系统定制工具,专为Windows操作系统量身定做,旨在帮助用户轻松移除不必要的系统组件、集成更新、添加驱动程序,以及实现无人值守安装等功能,让每一次系统安装都更…

raid配置与实战10

一、raid理论 1、raid概述 raid(磁盘阵列):是用不同的硬盘分区,组成一个逻辑上的硬盘,高可用(冗余)。 2、raid级别 2.1、raid0条带化存储 数据分散在多个物理磁盘上的存储方式,…

layui实现表格根据数据来勾选已保存的数据

示例图 勾选一次保存后,每次进到查询都会看到被勾选的数据,代码如下: done: function(res, curr, count) {var groupId "[[${groupId}]]";$.ajax({url: //写后端获取数据的接口type: GET,success: function(data) {console.log(d…

登录安全分析报告:小米官网注册

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

创建特定结构的二维数组:技巧与示例

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:二维数组的奇妙世界 二、方法一:直接初始化 1. 初始化一个…

Chromium源码学习(1)—— 拉取源码,编译

阅读建议:先简单过一下整个文章目录结构,大致了解一下各个步骤在干什么,然后在上手操作可能会事半功倍。也许你遇到的有些问题文章中已经提及到了,但是由于你没有往下看导致卡进度。 Chromium简介 Chromium项目于2008年发布&…

CSS学习笔记:vw、vh实现移动端适配

移动端适配 移动端即手机端,也称M端 移动端适配:同一套移动端页面在不同屏幕尺寸的手机上可以实现宽度和高度的自适应,也就是页面中元素的宽度和高度可以根据屏幕尺寸的变化等比缩放 之前我在一篇博客中介绍了rem实现移动端适配&#xff0…

Linux内核编译流程3.10

一、内核源代码编译流程 编译环境: cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) Linux内核版本: uname -r 3.10.0-693.el7.x86_64 编译内核源代码版本:linux-4.19.90-all-arch-master cp /boot/config-xxx到内核源…

九章云极DataCanvas公司DingoDB完成中国信通院权威多模数据库测试

2024年5月16日,九章云极DataCanvas公司自主研发和设计的开源多模向量数据库DingoDB顺利完成中国信息通信研究院(以下简称中国信通院)多模数据库产品测试。本次测试的成功标志着DingoDB在技术能力、性能表现和产品稳定性方面得到了权威机构的高…

交互设计如何助力传统技艺在当代复兴?

背景介绍 榫卯是中国传统木工中一种独特的接合技术,它通过构件间的凸凹部分相互配合来实现两个或多个构件的紧密结合。这种结构方式不依赖于钉子或其他金属连接件,而是利用木材自身的特性,通过精巧的设计和工艺,实现构件间的稳定…

数据大屏方案 : 实现数据可视化的关键一环_光点科技

在数字时代的浪潮中,数据已经成为企业决策和操作的重要基础。因此,“数据大屏方案”逐渐成为业界关注的焦点。这类方案通过将复杂的数据集合以直观的形式展现出来,帮助决策者快速把握信息,做出更加明智的决策。 数据大屏的定义及作…

一年收入大几十个的副业兼职,闲鱼新玩法,新手小白可做,无门槛

在开始分享之前,我想先了解一下,大家是否曾在各大公众号上参与过各种打卡活动?比如减肥打卡、英语阅读打卡、考研考公打卡等等。如今,打卡已经成为现代人生活中不可或缺的一部分。无论是学习、健身还是工作,打卡都能有…

socks5 如何让dns不被污染

问题 发现firefox浏览器代理设置成socks5后,查看ip是成功了,但是谷歌等海外的还是无法正常访问。 原因 主要原因是socks5连接虽然是成功了,但是dns还是走国内的,国内的dns解析都被污染了导致没法正常访问 解决 把设置里的 使…

香橙派Kunpeng Pro评测

有幸受邀评测香橙派与华为鲲鹏在2024年5月12刚刚联合发布的新品香橙派Kunpeng Pro。 本文将从软硬件、AI算法测试等角度简单分享一下博主拿到板子以来感受与所做的评测。 一、硬件 香橙派Kunpeng Pro实物图 处理器方面,香橙派Kunpeng Pro采用了4核64位armv8架构处…

EthernetiP转modbusTCP网关在加氢催化中的应用

在现代工业控制系统中,Ethernet/IP和ModbusTCP是两种常见的通信协议。它们在各种设备和系统间传输数据,实现设备的监控和控制,尤其在催化加氢装置这类关键工业过程中发挥着不可或缺的作用。本文将深入探讨开疆智能KJ-EIP-206型Ethernet/IP转M…

探寻数据处理的高效之道:从Python内置方法到NumPy的飞跃

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为什么要学习NumPy? 二、案例展示:创建整数序列…

【Java】/*继承和组合*/

目录 一、继承 1.1 为什么需要继承 1.2 继承的概念 1.3 继承的语法 1.4 访问父类的成员 1.4.1 在子类方法中访问父类的成员 1.4.2 在子类外的方法中访问父类的成员 1.5 super关键字 1.6 子类和父类的构造方法 1.7 super 和 this异同点(待改进)…

常见webshell工具及特征分析

前言 在工作中经常会遇到各种websehll,黑客通常要通过各种方式获取 webshell,从而获得企业网站的控制权,识别出webshell文件或通信流量可以有效地阻止黑客进一步的攻击行为,下面以常见的四款webshell进行分析,对工具连…

深度学习之语义分割概念

深度学习之语义分割概念 文章目录 深度学习之语义分割概念前言一、语义分割任务常见数据集格式1.PASCAL VOC2.MS COCO 二、语义分割结果的具体形式三、语义分割常见的评价指标四、语义分割标注工具1.Labelme2.EISeg3.X-Anylabeling 总结 前言 常见的分割任务: 语义分…

大模型“1元购”?AI公司加速奔向应用端“大航海时代”

自字节跳动发布豆包大模型,互联网大厂纷纷就位,击穿“地板价”的打法从C端向B端拓展。这也成为今年“618”最亮眼的价格战。 5月15日,字节跳动率先宣布豆包大模型已通过火山引擎开放给企业客户,大模型定价降至0.0008元/千Tokens&…