操作系统真象还原:完善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.rhkb.cn/news/335477.html

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

相关文章

做视频号小店和达人对接的好,爆单少不了!

大家好,我是喷火龙。 目前,视频号是没有什么自然流量的,所以,想要出单、爆单的话,靠达人带货的方式才是最可靠的,靠达人带货是肯定要对接达人,并和达人沟通带货的。 下面给大家讲一讲应该怎么…

【Python】解决Python报错:TypeError: unsupported operand type(s) for ...

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略

文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况,不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况,轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…

前端应用开发实验:表单控件绑定

目录 实验目的相关知识点实验内容代码实现效果 实验目的 (1)熟练掌握应用v-model指令实现双向数据绑定的方法,学会使用 v-model指令绑定文本框、复选框、单选按钮、下拉菜单; (2)学会值绑定(将…

Java枚举

引入: 当有一些类,希望它的成员的值是具体的有限的值,且只读不需要修改,不希望用户去自定义其他的值。 比如季节类,它的成员只能是春夏秋冬,不希望用户构造其他的值。 枚举enum: 枚举是一组的特…

SQL数据库多层嵌套 json转sql建表语句,SQL数据库里数组里对象数据怎么创建

1. uniapp sqlite 一个数组包含对象嵌套对象通过主外键方式插入数据库: // 假设有一个对象数组,对象中包含嵌套对象 const objectsArray [{parentObject: {id: 1,name: Parent 1,// 其他父对象属性},childObject: {id: 11,parentId: 1,name: Child 1 o…

字符串操作:写一个方法,实现字符串的反转,如:输入abc,输出cba

import java.util.Scanner; public class Test_A15 {public static void main(String[] args){String strA"";System.out.println("请输入一串字符串:");Scanner scannernew Scanner(System.in);strAscanner.next();Test_A15 T15new Test_A15();String re…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

AI Agent智能体概述及原理

AI Agent概述 AI Agent旨在理解、分析和响应人类输入,像人类一样执行任务、做出决策并与环境互动。它们可以是遵循预定义规则的简单系统,也可以是根据经验学习和适应的复杂、自主的实体;可以是基于软件的实体,也可以是物理实体。…

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是:在操作中定义算法的框架,将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…

【YOLOv5/v7改进系列】引入AKConv——即插即用的卷积块

一、导言 介绍了一种名为AKConv(Alterable Kernel Convolution)的新型卷积操作,旨在解决标准卷积操作存在的两个根本性问题。首先,标准卷积操作受限于局部窗口,无法捕获来自其他位置的信息,且其采样形状固…

Facebook隐私保护:数据安全的前沿挑战

在数字化时代,随着社交媒体的普及和应用,个人数据的隐私保护问题日益受到关注。作为全球最大的社交平台之一,Facebook承载了数十亿用户的社交活动和信息交流,但与此同时,也面临着来自内外部的数据安全挑战。本文将深入…

玄机平台应急响应—Linux入侵排查

1、前言 这篇文章主要说一下linux的入侵排查,也就是说当你的服务器已经被入侵的时候,该如何去排查使其恢复正常。下面是排查的步骤,但是实际情况往往更为复杂,需要进一步来分析,而不是无脑的按照步骤来敲就完事了。 …

【FPGA】Verilog语言从零到精通

接触fpga一段时间,也能写点跑点吧……试试系统地康康呢~这个需要耐心但是回报巨大的工作。正原子&&小梅哥 15_语法篇:Verilog高级知识点_哔哩哔哩_bilibili 1Verilog基础 Verilog程序框架:模块的结构 类比:c语言的基础…

07 FreeRTOS 事件组(event group)

1、事件组概念 1.1 基本概念 使用事件组可以等待某个事件、若干事件中的任意一个事件、若干事件中的所有事件,但是不能指定若干事件中的某些事件。 事件组可以简单地认为就是一个整数:这个整数的每一位表示一个事件;每一位事件的含义由程序员…

常用的优化器汇总及keras实现

1.SGD(Stochastic Gradient Descent) 2.RMSprop(Root Mean Square Propagation) 3.Adadelta 4.Adam(Adaptive Moment Estimation) 5.Nadam 6.代码实现 from sklearn.compose import make_column_transforme…

外企如何有效面对日益严格的跨境数据传输法律?

在当今这个数据驱动的时代,随着全球化步伐的加快,企业跨国界的数据交流已成为常态。但随之而来的,是各国政府对跨境数据传输日益严格的规定和监管,这让众多外资企业(简称“外企”)在享受全球市场红利的同时…

区块链技术和应用

文章目录 前言 一、区块链是什么? 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…

大模型智力升级:AI的未来之路

大模型的发展引领了人工智能的新时代,其强大的数据处理和学习能力在医疗、金融、教育等众多领域取得了令人瞩目的成就。然而,随之而来的挑战也不容忽视。尽管大模型在特定任务上展现出了卓越的性能,但它们在理解复杂语境、处理未见情况的能力…

项目日记(1): boost搜索引擎

目录 1. 项目相关背景 2. 搜索引擎的相关宏原理 3. 搜索引擎的技术栈和项目环境 4. 正排索引, 倒排索引, 搜索引擎具体原理 5. 编写数据去标签化和数据清洗的模块parser(解析器). 1.项目相关背景 百度, 搜狗, 360等都有搜索引擎, 但是都是全网的搜索; boost是进行站内搜索…