第三章-完善MBR

news2025/1/19 14:28:10
为什么mbr编译时设置数据的起始地址vstart=0x7c00,就可以保证程序加载器能将MBR加载到内存的0x7c00?

程序加载器负责将根据编译后的程序地址加载到内存中,mbr 用 vstart=0x7c00 来修饰的原因,是开发人员知道 mbr 要被加载器(BIOS)加载到物理地址 0x7c00,mbr 中后续的物理地址都是 0x7c00+。

这一章节的主要任务是,完善MBR,文件一mbr.S任务为加载到内存0x7c00位置,文件二loader.S任务为完成内核初始化和加载硬盘上的内核文件到内存。因此主要核心功能为硬盘读取操作。
整理了硬盘读取操作过程:
1.硬盘读取操作接口寄存器地址表
2.确当硬盘LBA/CHS地址,配置接口寄存器
3.确认硬盘状态,放入数据

Ⅰ.汇编中的section

实模式下,操作系统将内存中的用户数据根据段来划分,那么编译器在编译时也是根据section来划分汇编文件的数据块。也可以视为C语言的函数。

Ⅱ.section mbr vstart=0x7c00含义

让编译器从vstart开始为mbr section指定一个虚拟的起始地址,此地址对应为虚拟地址,通过该地址访存是找不到section的。

源码地址(byte)反汇编代码
section code vstart=0x7c00
mov ax,$$00000000mov ax,0x7c00
mov ax,section.code.start00000003mov ax,0x10
mov ax,section.data.start00000006mov ax,0x14
mov ax,$00000009mov ax,0x7c09
mov ax,[var1]0000000Cmov ax,[0x900]
mov ax,[var2]0000000Fmov ax,[0x904]
jmp $00000012jmp -2
section data vstart=0x900
var1 dd 0x400000014
00000016
var2 dw 0x9900000018
00000019

补充:$ 指向程序的编译起始地址, 指向程序的编译起始地址, 指向程序的编译起始地址,指向当前指令的偏移地址。

Ⅲ.CPU寻址方式

寄存器寻址:mov ax,cs

立即数寻址:mov ax,0x10

内存变址寻址:mov ax,[cs:0x10]

Ⅳ.实模式

  1. ret命令&call指令

本质是更改了CS:IP指向的代码段,跳转到待执行的内存地址

ret是返回原程序,既然有返回,那么一定有转移,assembly language转移包括jmp和call,jmp是无返回的直接冲,call是需要有ret的,因此ret和call搭配使用。

与中断的保护现场一样,assembly process的call也是需要进行保护现场的,借助栈的先入后出原理,在调用call时将指令信息保存到栈中,实现多层call调用时,能正确ret。

call分为近调用和远调用,对应ret和retf(return far)。具体原理为:ret指令将栈顶指针[ss:sp]的两个字节取出,赋值给IP寄存器,不需要改变CS寄存器值;retf将栈顶的4个字节取出,前两个字节赋值给IP寄存器,后两个字节赋值给CS寄存器。具体的选择需要程序员根据应用需求自动调整。

2.jmp指令

转移指令条 件意 义英文助记
jz/jeZF=1相减结果等于0/相等时转移Jump if Zero/Equal
jnz/jneZF=0不等于0/不相等时转移Jump if Not Zero/Not Equal
JSSF=1负数时转移Jump if Sign
jnsSF=0正数时转移Jump if Not Sign
joOF=1溢出时转移Jump if Overflow
jnoOF=0未溢出时转移Jump if Not Overflow
jp/jpePF=1低字节中有偶数个1时转移Jump if Parity/Parity Even
jnp/jpoPF=0低字节中有奇数个1时转移Jump if Not Parity/Parity Odd
jbe/jnaCF=1或 ZF=1小于等于/不大于时转移Jump if Below or Equal/Above
jnbe/jaCF=ZF=0不小于等于/大于时转移Jump if Not Below or Equal/Above
jc/jb/jnaeCF=1进位/小于巧=大于等于时转移Jump if Carry/Below/Not Above Equal
jnc/jnb/jaeCF=0未进位/不小子/大于等于时转移Jump if Not Carry/Not Below/Above Equal
jl/jingeSF!=OF小子/不大于等于时转移Jump Less/Not Great Equal
jnl/jgeSF=OF不小于/大于等于时转移Jump if Not Less/Great Equal
jle/jngZF!=OF 或 ZF=1小于等于/不大于Jump if Less or Equal/Not Great
jnle/jgSF=OF 且 ZF=O不小于等于/大于时转移Jump Not Less Equal/Great
JcxzCX寄存器值=0CX 寄存器值为0时转移Jump if register CX’s vaJue is Zero
abcegjlnop
表示 above表示 below表示 carry表示 equal表示 great表示 jmp表示 less表示not表示 overflow表示 parity

实模式最终会被保护模式替代掉,本质是安全问题。

安全问题主要体现在:实模式将所有的内存空间暴露给用户,用户通过ds<<0x1+偏移地址可以访问内存任意位置,可能会影响操作系统的稳定。

因此衍生出了保护模式,保护模式对用户的访存操作加入了特权判断,那谁来分配特权呢???

用户编写程序时,只允许有两种特权分配,内核态的特权0或用户态的特权3,用户程序通过系统调用进入内核态,访问系统硬件和内核。

Ⅴ.显示器操作

IO 接口是连接 CPU 与外部设备的逻辑控制部件 ,分为硬件和软件两部分:

  • 硬件部分的工作是协调 CPU 和外设。如数据缓冲和数据格式转换。
  • 软件部分的工作是控制接口电路工作的驱动程序以及完成内部数据传输所需要的程序。
1.CPU与外设通过I/O接口实现通信,主要解决的问题:

(1)据缓冲问题。CPU数据处理速率较外设快很多,如果直接将CPU与外设相连,CPU阻塞等待导致系统性能降低,因此通过建立I/O接口建立缓冲区,当缓冲区满了才中断CPU响应。

(2)据格式不一致问题。CPU只处理数字信号,而外设信号包括数字信号、模拟信号等,I/O接口搭载有A/D转换电路和D/A转换电路,完成CPU的数字信号到外设的模拟信号转换、外设的模拟信号到CPU的数字信号转换。

(3)信号电平不一致问题。CPU信号为TTL电平,外设大多是机电设备,采用CMOS电平,两个接口电平不一致,直接对接可能会烧坏器件,因此I/O接口设置有信号电平转换电路。

TTL电平与CMOS电平的区别

(一)TTL高电平3.6~5V,低电平0V~2.4V
CMOS电平Vcc可达到12V
CMOS电路输出高电平约为0.9Vcc,而输出低电平约为0.1Vcc。
CMOS电路不使用的输入端不能悬空,会造成逻辑混乱。
TTL电路不使用的输入端悬空为高电平**
另外,CMOS集成电路电源电压可以在较大范围内变化,因而对电源的要求不像TTL集成电路那样严格。
用TTL电平他们就可以兼容
(二)TTL电平是5V,CMOS电平一般是12V。
因为TTL电路电源电压是5V,CMOS电路电源电压一般是12V。
5V的电平不能触发CMOS电路,12V的电平会损坏TTL电路,因此不能互相兼容匹配。
(三)TTL电平标准
输出 L: <0.4V ; H:>2.4V。
输入 L: <0.8V ; H:>2.0V
TTL器件输出低电平要小于0.4V,高电平要大于2.4V。输入,低于0.8V就认为是0,高于2.0就认为是1。

CMOS电平:
输出 L: <0.1Vcc ; H:>0.9Vcc。
输入 L: <0.3Vcc ; H:>0.7Vcc.

(4)信号时序不一致问题。一些外设拥有自己的晶振时序,直接接收或发送CPU的数据,会导致数据丢失或数据污染。因此需要I/O接口设计时序转换电路。

(5)支持多个外设地址译码。由于多个外设公用一个接口,因此CPU需要明确数据来源,同时,I/O接口需要确定CPU的数据转发地址。

2.南桥和北桥

南桥用于链接低速外设,北桥用于连接内存等高速外设,为了提高访存速率,某些厂商将北桥集成在CPU内部。

CPU通过专门的in,out指令完成对接口数据的读取。按照Intel指令规范,操作码 目的操作数,源操作数的格式。则in指令(input)从接口读取数据,格式为:

in al,dx	;当源操作数dx为8bit时
in ax,dx	;当源操作数dx为16bit时

out指令向接口中写入数据,格式为:

out dx,al
out dx,ax
out 立即数,al
out 立即数,ax

3.碎碎念

实模式存在中断向量表,而保护模式没有中断向量表,因此保护模式无法通过BIOS中断实现打印输出功能。但是系统不是从刚开始就进入保护模式,首先要进入实模式执行BIOS初始化,再开启保护模式。

CLI关中断,禁止中断发生;STI开中断,允许中断发生。

Ⅵ.操作硬盘

从磁盘读写数据,首先需要确定硬盘访问地址,与CHS(柱面-磁头-扇区,Cylinder Head Sector)地址需要确定几盘几道几扇区的访问方式不同,LBA地址将硬盘视为一个整体,从0开始编址。然后根据in,out命令向LBA地址执行读写操作。

在这里插入图片描述

具体过程如下:

写入前,需要确定磁盘的起始地址、写入地址、待写入的扇区数。

mov eax,LOADER_START_SECTOR ;起始扇区LBA地址,0x900,这里对应的是loader.S文件位置,也是硬盘读写操作
mov bx,LOADER_BASE_ADDR    ;写入的地址,0x2
mov cx,1					;待写入的扇区数

1.向磁盘sector count端口0x1f2传入待写入的磁盘数

执行的操作:out dx,[待写入的扇区数]

mov dx,0x1f2
mov al,cl
out dx,al

2.向磁盘的LBA地址端口写入地址

在这里插入图片描述

;将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位写入端口0x1f6
	shr eax,cl
	mov dx,0x1f5
	out dx,al
	
	;设置LBA地址模式
	shr eax,cl
	;取LBA 24-27位
	and al,0x0f
	;设置7-4位为1110,表示LBA模式
	or al,0xe0
	mov dx,0x1f6
	out dx,al

3.向0x1f7端口写入status寄存器配置信息,确定磁盘状态是否满足当下读写要求。

status寄存器控制命令主要有三个:

(1)硬盘识别:0xEC

(2)读数据:接口写入0x20

(3)写数据:接口写入0x30

image-20230719215018128
	mov dx,0x1f7
	mov ax,0x20		;写数据0x20
	out dx,ax

4.当硬盘稳定后,执行读数据命令

	.not_ready:
		nop
        	in al,dx 	;将端口中的信息读到al中,注意此时dx=0x1f7不变,此时是status寄存器,也就是状态端口
        	and al,0x88 
        	cmp al,0x08  	;第7位为1,表示占用;第8位为1,表示空闲
        	jnz .not_ready 	;如果被占取了,就循环  jnz=jmp not equal

        	mov ax,di  	;di=1
        	mov dx,256 
        	mul dx     	;dx=ax*dx 每次读取1个字,也就是两字节,一共512字节,所以需要256次
        	mov cx,ax  	;cx指定循环的次数
        	mov dx,0x1f0 	;数据端口,终于开始读取数据了
        
    	.go_on_read:     
        	in ax,dx      	;将端口中指定的数据,也就是指定的扇区的数据读入到ax中
        	mov [bx],ax   	;bx寄存器存储的就是0x900也就是loader的内存地址
        	add bx,2      	;每次读两字节
        	loop .go_on_read

        	ret            	;返回后就会执行jmp跳转到0x900去了,此时机会执行loader.bin
	.go_on_read:     
    	in ax,dx      	;将端口中指定的数据,也就是指定的扇区的数据读入到ax中
    	mov [bx],ax   	;bx寄存器存储的就是0x900也就是loader的内存地址
    	add bx,2      	;每次读两字节
    	loop .go_on_read

    	ret            	;返回后就会执行jmp跳转到0x900去了,此时机会执行loader.bin`

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

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

相关文章

Transformer [Attention is All You Need]

&#xff08;一&#xff09;论文部分 Abstract (1)The best performing models also connect the encoder and decoder through an attention mechanism. 最好的性能通过注意力机制将编码器和解码器连接在一起。 (2)the Transformer, based solely on attention mechanisms,…

安装JAVA 依赖环境 Maven 教程

一、下载链接与Tips Maven 过去版本下载传送门&#xff1a;&#xff08; Java 8 兼容 Java 7&#xff0c;即 Java 8 的 JDK 能运行 3.8.8 以下的 Maven&#xff09; Maven Releases History Download 点击 release notes 点击 available for download. 选择 bin 的安装包 然…

【使用 TensorFlow 2】03/3 创建自定义损失函数

一、说明 TensorFlow 2发布已经接近5年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…

Linux之open/close/read/write/lseek记录

一、文件权限 这里不做过多描述&#xff0c;只是简单的记录&#xff0c;因为下面的命令会涉及到。linux下一切皆是文件包括文本、硬件设备、管道、数据库、socket等。通过ls -l 命令可以查看到以下信息 drwxrwxrwx 1 root root 0 Oct 10 17:06 open -rwxrwxrwx 1 root roo…

js 滚动鼠标滑轮放大缩小图片

<div><h1>原图</h1><imgsrc"https://so.360tres.com/dmsmty/160_160_100/t01b29734b9604fb7aa.webp"/><h1>可放大缩小的图</h1><div class"imgView"><imgsrc"https://so.360tres.com/dmsmty/160_160_10…

建设一个完整的企业经营管理体系是什么样的

建设一个完整的企业经营管理体系是确保企业高效、可持续发展的基础。该体系包括组织架构、战略规划、运营管理、人力资源管理、财务管理等多个要素&#xff0c;下面将逐一进行详细介绍。 一、组织架构&#xff1a; 组织架构是企业内部各个部门、职能和层级之间的关系和分工。…

代码随想录算法训练营第五十三天 |1143.最长公共子序列、1035.不相交的线、53. 最大子序和动态规划

一、1143.最长公共子序列 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列_哔哩哔哩_bilibili 思考&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]…

关键词搜索天猫商品列表数据,天猫商品列表数据接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取天猫网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;天猫网站…

pytest + yaml 框架 -56. 输出日志优化+allure报告优化

前言 v1.4.8 版本优化接口请求和响应输出日志&#xff0c;生成的allure报告也按步骤优化request和response详情日志 优化日志 用例 test_log1: -name: log1request:url: http://127.0.0.1:8000/api/test/demomethod: GETvalidate:- eq: [status_code, 200]- eq: ["cod…

从 0 到 1 打造企业数字化运营闭环

打造企业数字化运营闭环是现代企业发展的必然趋势。它涉及到信息技术、数据分析、流程优化等多个方面&#xff0c;通过有效整合和运用这些资源&#xff0c;可以实现从0到1的全面数字化转型。 下面是一个详细的介绍&#xff0c;包括步骤、关键要素和实施策略。 一、了解需求和…

吉客云对接打通金蝶云星空销售单查询接口与销售出库新增接口

吉客云对接打通金蝶云星空销售单查询接口与销售出库新增接口 接通系统&#xff1a;吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求&#xff0c;重新定位、全新设计推出的换代产品&#xff0c;从业务数字化和组织数字化两个方向出发&#x…

图扑 HT for Web 风格属性手册教程

图扑软件明星产品 HT for Web 是一套纯国产化独立自主研发的 2D 和 3D 图形界面可视化引擎。HT for Web&#xff08;以下简称 HT&#xff09;图元的样式由其 Style 属性控制&#xff0c;并且不同类型图元的 Style 属性各不相同。为了方便查询和理解图元的 Style 属性&#xff0…

第二证券:5.5G时代将至 算力基建迎政策助力

昨日&#xff0c;A股全线低开&#xff0c;三大股指盘中均跌超1%&#xff0c;盘中冲高回落&#xff0c;午后逐渐止跌。到收盘&#xff0c;沪指跌0.44%报3096.92点&#xff0c;深成指微跌0.03%报10106.96点&#xff0c;创业板指跌0.26%报1998.61点&#xff0c;两市算计成交7700元…

腾讯系数藏停摆一年 玩家被甩在维权路上

暴雷、维权、清退是过去一年数藏行业的常态。小平台跑了&#xff0c;腾讯这样的大厂以关停、退款终止运营数藏业务时&#xff0c;吃相也不好看。 在黑猫投诉平台上&#xff0c;幻核被投诉退款缓慢&#xff0c;曾经发行过数字藏品的QQ音乐被投诉违背发行时承诺的“持有356天后可…

嵌入式学习笔记(52)ADC的引入

11.1.1什么是ADC (1)ADC:analog digital converter,AD转换&#xff0c;模数转换&#xff08;也就是模拟转数字&#xff09; (2)CPU本身是数字的&#xff0c;而外部世界变量&#xff08;如电压、温度、高度、压力&#xff09;都是模拟的&#xff0c;所以需要用CPU来处理这些外…

【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

多测师肖sir_高级金牌讲师_python之 字符、索引、切片、列表、集合004

python之 字符、索引、切片、列表、集合 一、索引 索引在公司中一般叫下标或角标 定义&#xff1a;我们可以直接使用索引来访问序列中的元素&#xff0c;同时索引可分为正向和负向两种&#xff0c;而切片也会用到索引&#xff0c;下面放上一个图&#xff0c;有助于大 家理解正…

Docker 网络访问原理解密

How Container Networking Works: Practical Explanation 这篇文章讲得非常棒&#xff0c;把docker network讲得非常清晰。 分为三个部分&#xff1a; 1&#xff09;docker 内部容器互联。 2&#xff09;docker 容器 访问 外部root 网络空间。 3&#xff09;外部网络空间…

MySQL数据库技术笔记(6)

新建两张表&#xff0c;班级表和学生表&#xff0c;因为班级表与学生表之间是 1 对多的关系&#xff0c;需要将少的表的主键放置多的 表中称为外键。 添加班级信息 添加学生信息并关联对应的班级 连接查询&#xff0c;表示查询的时候关联多张表进行查询 最终两张表的交叉连接…

面试算法24:反转链表

题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。例如&#xff0c;把图4.8&#xff08;a&#xff09;中的链表反转之后得到的链表如图4.8&#xff08;b&#xff09;所示。 分析 由于节点j的next指针指向了它的前一个节…