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

第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 $


内存结构分布图:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【注册表删除】Navicat Premium 16的试用期已过期的解决方案

文章目录 【问题】【解决方式】 【问题】 使用Navicat Premium 16提示试用期已过期,如下图所示情况: 【解决方式】 1、关闭Navicat Premium 16 确保Navicat Premium 16处于关闭状态。 2、Win R,输入 regedit 回车 3、删除Data文件夹 在注…

硬盘监控,保障硬盘性能

硬盘驱动器是个人计算机和服务器中用于存储数字数据的硬件部件,硬盘突然故障可能导致永久数据丢失,大多数硬盘驱动器使用自我监控、分析和报告技术(SMART)来跟踪各种性能指标并分析其自身的运行状况。然而,并不是所有的…

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法,有需要的小伙伴可以移步史上最全排序算法整理(1)查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两…

FFMPEG+ANativeWinodow渲染播放视频

前言 学习音视频开发,入门基本都得学FFMPEG,按照目前互联网上流传的学习路线,FFMPEGANativeWinodow渲染播放视频属于是第一关卡的Boss,简单但是关键。这几天写了个简单的demo,可以比较稳定进行渲染播放,便…

软件系统测试的类型和方法介绍

测试是软件开发过程中至关重要的一环,负责验证和确认软件系统是否符合预期的需求,并帮助开发团队消除潜在的缺陷。系统测试作为软件测试中不可缺少的过程,是根据预先制定的测试计划和测试用例,以检查软件系统功能、性能、安全性和…

LED显示屏模组七大参数

LED模组是LED显示屏的核心组件,它包含LED线路板和外壳,将LED灯珠按照特定规则排列并封装,通常还会进行防水处理。随着LED显示屏行业的发展及其广泛应用,LED模组的功能和作用变得愈加重要。那么,LED模组的七大参数是什么…

开抖店必须要办理营业执照吗?不用营业执照开店的个人店能用吗?

大家好,我是电商花花。 可能大家都发现了,抖音小店个人店不用营业执照,只凭借身份证就能开店。 但是这个个人店花花并不建议大家去开,虽然说用用身份证也能开店,有效的帮我们减少了开店的成本,但是个人店…

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程

【RLHF个人笔记】RLHF:Reinforcement Learning from Human Feedback具体过程 RLHF训练的三个步骤步骤1:收集数据与有监督训练策略步骤2:收集数据训练奖励模型步骤3:结合奖励模型利用强化学习算法如PPO算法来优化策略 参考内容 RLHF训练的三个…

jeecgboot 同一账号只允许一个人登录

1.需求分析 jeecgboot 框架要实现同一个账号只允许一个人登录,就跟游戏账号类似,“我登录了就把你踢下去,你登录了就把我踢下去”;jwt 原理是生成 token 后一段时间内登录都有效,jeecgboot 中 jwt 和 redis 联合使用后…

易备数据备份软件:快速恢复 VMware ESXi 虚拟机

易备数据备份软件为 VMware ESXi 虚拟机提供完整的保护和备份功能。软件同时支持从 ESXi 或 vCenter 虚拟机的增量和差异备份中进行自动恢复。支持精细化的恢复,可将虚拟机恢复到某个特定的日期。 通过易备数据备份软件,可以实现虚拟机的异机恢复&#…

深入理解JVM:内存结构、垃圾收集与性能调优

目录 JDK、JRE、JVM关系? 启动程序如何查看加载了哪些类,以及加载顺序? class字节码文件10个主要组成部分? JVM结构 画一下JVM内存结构图 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池? 什么时候抛出StackOverflowError? 例如&…

元宇宙对于品牌营销有哪些影响?品牌如何加入?

元宇宙对于品牌营销带来了许多新的营销方式和策略,这些方式在传统营销中是无法实现的。以下是元宇宙对于品牌营销的主要营销方式: 1、虚拟展示: 利用元宇宙技术,品牌可以将产品或服务在虚拟世界中进行展示,用户可以通…

Leetcode - 131双周赛

一,3158. 求出出现两次数字的 XOR 值 本题是一道纯模拟题,直接暴力。 代码如下: class Solution {public int duplicateNumbersXOR(int[] nums) {int ans 0;long t 0;for(int x : nums){if(((t>>x)&1) 1){ans ^ x;}else{t | (…

深度神经网络——什么是迁移学习?

1.概述 在练习机器学习时,训练模型可能需要很长时间。从头开始创建模型架构、训练模型,然后调整模型需要大量的时间和精力。训练机器学习模型的一种更有效的方法是使用已经定义的架构,可能具有已经计算出的权重。这是背后的主要思想 迁移学习…

适合多种苛刻环境的惯性测量单元M-G370PDS

全球IMU市场d在汽车和机器人技术进步和不断增长的应用需求,保持着高速增长的趋势,其中航空航天、国防和汽车等行业对高精度、稳定和紧凑的IMU需求尤为强烈,这些行业对精度和可靠性的高要求直接影响了相关技术的发展方向。 爱普生惯性测量单…

现场辩论赛活动策划方案

活动目的: 技能竞赛中的辩论环节既可以考核员工的知识点,同时也可以考核员工业务办事能力,表达能力,是一种比较全面且较有深度的竞赛方式。 辩论赛细则: 1、时间提示 : 自由辩论阶段,每方使用时间剩…

如何将md文件精确的转换成docx文件

如何将md文件转换成docx? 文章目录 如何将md文件转换成docx?一、如何将MD文件比较完美的转换成word呢?二、方法3 步骤1、下载一个可用的MarkDown编辑器2、下载Pandoc安装 三、来进行转化了 一、如何将MD文件比较完美的转换成word呢&#xff1…

基于51单片机智能蓝牙台灯

基于51单片机智能蓝牙台灯 (仿真+程序+原理图PCB) 功能介绍 具体功能: 1.分为手动/自动两种模式,自动模式下对应LED指示灯亮; 2.手动模式下,可用按键调节亮度; 3.自动…

AI 画图真刺激,手把手教你如何用 ComfyUI 来画出刺激的图

目前 AI 绘画领域的产品非常多,比如 Midjourney、Dalle3、Stability AI 等等,这些产品大体上可以分为两类: 模型与产品深度融合:比如 Midjourney、Dalle3 等等。模型与产品分离:比如 SD Web UI、ComfyUI 等等。 对于…

使用jdk自带jhat工具排查OOM问题

使用jdk自带jhat工具排查OOM问题 OOM java.lang.OutOfMemoryError: Java heap space排查步骤 编写一个测试类 public class TestJVM {Testpublic void test1() throws InstantiationException, IllegalAccessException {List<A> list new ArrayList<>();for (i…