操作系统真象还原:完善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=0x7c00mov ax,csmov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00	;栈顶,开辟栈往下开辟,上面是BIOSmov ax,0xb800	;这个0xb800指向的是用于文本模式显示适配器的地址,用来输出文字mov gs,axmov ax,0600h	;利用0x06号中断清屏mov bx,0700hmov cx,0		;左上角: (0, 0)mov dx,184fh	;右下角: (80,25),int 10hmov byte [gs:0x00],'1'	;这是值mov byte [gs:0x01],0xA4	;这是属性,A表示绿色背景闪烁,4表示前景色为红色mov byte [gs:0x02],' 'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'M'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'B'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'R'mov byte [gs:0x09],0xA4mov eax,LOADER_START_SECTOR	;起始扇区lba地质mov bx,LOADER_BASE_ADDR		;写入的地质mov cx,1			;待读入的扇区数call rd_disk_m_16jmp LOADER_BASE_ADDR;------------------------------------------------
;功能:在16位模式下读取硬盘的n个扇区
rd_disk_m_16:
;--------------------------------------------------;eax=LBA扇区号;bx=将数据写入的内存地质;cx=读入的扇区数mov esi,eax		;备份eaxmov di,cx		;备份cx
;读写硬盘
;第一布:设置要读取的扇区数mov dx,0x1f2 mov al,clout dx,al	;读取的扇区数mov eax,esi	;恢复ax;第二步:将LBA地址存入0x1f3~0x1f6;LBA地址7-0位写入端口0x1f3mov dx,0x1f3out dx,al	;LBA地址15-8位写入端口0x1f4mov cl,8shr eax,cl	;逻辑右移指令mov dx,0x1f4out dx,al;LBA地址23-16位写入端口0x1f5shr eax,clmov dx,0x1f5out dx,alshr eax,cland al,0x0f	;lba第24-27位	or al,0xe0	;设置7-4位为1110,表示lba模式mov dx,0x1f6out dx,al;第3步:向0x1f7端口写入读命令,0x20mov dx,0x1f7mov al,0x20out dx,al;第4步:检测硬盘的状态.not_ready:;同一端口,写时表示写入命令字,读时表示读入硬盘状态nopin al,dxand al,0x88	;第 3 位为 1 表示硬盘控制器已准备好数据传输;第 7 位为 1 表示硬盘忙	cmp al,0x08jnz .not_ready	;若未准备号,继续等待;第 5 步:从 OxlfO 端口读数据mov ax,di	;di里是扇区数mov dx,256mul dxmov cx,ax
;di 为要读取的扇区数,一个扇区有 512 字节,每次读入一个字,共需 di*512/2 次,所以 di*256	mov dx,0x1f0.go_on_read:in ax,dxmov [bx],axadd bx,2loop .go_on_readret times 510-($-$$) db 0db 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],0xA4mov byte [gs:0x02],' 'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'L'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'O'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'A'mov byte [gs:0x09],0xA4mov byte [gs:0x0A],'D'mov byte [gs:0x0B],0xA4mov byte [gs:0x0C],'E'mov byte [gs:0x0D],0xA4mov byte [gs:0x0E],'R'mov byte [gs:0x0F],0xA4jmp $

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

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

相关文章

STM32的时钟介绍

目录 前言1. 简介1.1 时钟是用来做什么的1.2 时钟产生的方式 2. 时钟树的组成2.1 时钟源2.1.1 内部时钟2.1.2 外部时钟 2.2 PLL锁相环2.3 SYSCLK2.4 AHB和HCLK2.5 APB和PCLK2.6 总结 3. STM32时钟的如何进行工作4.我的疑问4.1 使用MSI和HSI有什么区别吗?4.2 MSI的频…

Linux系统编程(五)多线程

目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建2. 线程的退出3. 线程的等待补充 四、综合举例 一、基本知识点 线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个标准…

【4.vi编辑器使用(下)】

一、vi编辑器的光标移动 二、vi编辑器查找命令 1、命令::/string 查找字符串 n:继续查找 N:反向继续查找 /^the 查找以the开头的行 /end 查找以 查找以 查找以结尾的行 三、vi编辑器替换命令 1、语法: : s[范围,范围]str1/str2[g] g表示全…

可视化大屏:随意堆数据,错!要主次分明、重点突出,动静结合。

可视化大屏是一种展示数据的方式,它的设计应该遵循一些原则,以确保信息的传递和理解效果最佳。以下是一些关键点,可以帮助设计出主次分明、重点突出、动静结合的可视化大屏: 定义目标和重点: 在开始设计可视化大屏之前…

NumPy 泊松分布模拟与 Seaborn 可视化技巧

泊松分布 简介 泊松分布是一种离散概率分布,用于描述在给定时间间隔内随机事件发生的次数。它常用于模拟诸如客户到达商店、电话呼叫接入中心等事件。 参数 泊松分布用一个参数来定义: λ:事件发生的平均速率,表示在单位时间…

哈希表练习题(2024/5/29)

1有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输…

C语言数据结构堆排序、向上调整和向下调整的时间复杂度的计算、TopK问题等的介绍

文章目录 前言一、堆排序1. 排升序(1). 建堆(2). 排序 2. 拍降序(1). 建堆(2). 排序 二、建堆时间复杂度的计算1. 向上调整时间复杂度2. 向下调整时间复杂度 三、TopK问题总结 前言 …

Java事务入门:从基础概念到初步实践

Java事务入门:从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务?1.2 为什么需要事务? 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…

Vue项目中使用router

Vite项目中使用router的步骤: 1.安装路由器库: npm install vue-router4 2.创建路由配置:通常命名为 router.js 或者 router/index.js import { createRouter, createWebHashHistory } from vue-router;import Login from ../views/Login.vu…

Jpg与png图片区别

Jpg与png图片有什么区别? JPG(或JPEG)和PNG是两种广泛使用的图像文件格式,它们在压缩技术、文件大小、图像质量、透明度支持等方面有显著的不同: 压缩技术: JPG: 使用有损压缩技术。这意味着在压缩过程中,一…

43-3 应急响应 - WebShell查杀工具

一、WebShell 简介 WebShell是一种以asp、php、jsp等网页文件形式存在的代码执行环境,通常用于网站管理、服务器管理和权限管理等操作。然而,如果被入侵者利用,它也可以用于控制网站服务器。具有完整功能的WebShell通常被称为"大马",而功能简单的则称为"小马…

20240529训练题目(西安交通大学 2024年程序设计竞赛校赛)

题目 D题 欢迎来到瑟莉姆大人的享乐宴会! 宴会中一共有n个访客,编号1∼n。为了更好地控制影的力量,瑟莉姆要求有n−1个访客都恰好受 到另一个访客的支配,而剩下的那个人成为总支配者,支配其他n−1名访客。访客间的直…

监控易军队信息化运维:支持网闸隔离技术,实现多安全域的统一监控

随着信息技术的迅猛发展,军队的信息化建设也在不断推进,信息化运维成为了保障军队正常运作的关键环节。然而,军队的信息化运维现状仍面临诸多挑战,如设备种类多、数据处理量大、专业技术要求高以及信息安全隐患等。针对这些问题&a…

海外仓能用什么系统?一篇文章给你讲明白

海外仓作为跨境电商物流的重要组成部分,越来越受到国内企业的关注。对于中小型海外仓来说,怎么选择一个合适的海外仓系统,成为了一个亟待解决的问题。 今天我们就用一篇文章给大家讲清楚,怎么根据自己海外仓的特点,选…

MySQL sum后再计算percentage的多种解决办法

over() 函数,最简单的一种 以下是SQL片段,在外面嵌套一个Select是因为over 不会SQL语句所有的data sum,而不是 limit 之后的数据,所以需要先limit 在over() SELECT b.*,ROUND(b.amount*100 / SUM(b.amount…

将IP添加到基础设计

将IP添加到基础设计 本节介绍将AXI IP添加到设计中。 添加低速外设(AXI4 Lite) 1.将等效IP添加到框图中。例如,对于AXI GPIO: a.右键单击方框图中的任意位置,然后选择“添加IP”。 b.搜索并双击AXI GPIO以添加IP。 2.双…

如何自己搭建一个简单的web api 环境 主流语言C# 编译器推荐VS2022

标题如何自己搭建一个简单的web api 环境 主流语言C# 编译器推荐VS2022 搭建一个简单的Web API环境,可以使用C#和Visual Studio 2022来实现。这里我们将使用ASP.NET Core来创建一个基本的Web API项目。以下是详细步骤: 安装必要的软件 Visual Studio 2…

[数据集]EEG数据集汇总

目录 1. EEG简介 2. 可用数据集 2.1. A large and rich EEG dataset for modeling human visual object recognition 2.2. A multi-modal open dataset for mental-disorder analysis 2.3. An EEG motor imagery dataset for brain computer interface in acute stroke pa…

双指针+前缀和,蓝桥云课 近似gcd

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 0近似gcd - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 考虑近似gcd的子数组的特点:不为g的倍数的数字个数小于等于1 我们用前缀和pre[]来存储不为g的倍数的数字个数 那么枚举左端点l&a…

数据结构(八)二叉树、哈希查找

文章目录 一、树(一)概念1. 前序遍历:根左右2. 中序遍历:左根右3. 后序遍历:左右根4. 层序遍历:需要借助队列实现 (二)代码实现:二叉树1. 结构体定义2. 创建二叉树1. 注意…