第8章 硬盘和显卡的访问与控制(1)
创始人
2024-06-03 19:11:38
0

第8章 硬盘和显卡的访问与控制

本章把主引导扇区改造成一个程序加载器,功能是加载用户程序,并执行该程序(将处理器的控制权交给该程序)

8.2 用户程序的结构

分段、段的汇编地址和段内汇编地址

NASM编译器使用汇编指令“SECTION”或者“SEGMENT”来定义段。段只用来分隔程序中的不同内容
Intel要求端在内存中起始物理地址起码是16字节对齐的。物理地址必须能被16整除
段内对齐也有要求,用“align=”

在这里插入图片描述

每个段的汇编地址是相对于整个程序开头(0)的。

为了方便取得该段的汇编地址,可以用section.段名称.start

段定义语句包含vstart=0子句时,标号的汇编地址要从它所在段的开头计算,而且从0开始计算。(即相对于当前段开始计算地址)

用户程序头部[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

用户程序头部起码要包含以下信息:
1. 用户程序的尺寸
加载器需要根据这一信息决定读取多少个逻辑扇区
8行,program_end标号表示长度,在编译阶段,将代表的汇编地址填写在这里
在这里插入图片描述

2. 应用程序的入口点,包括段地址和偏移地址。
11、12行,依次声明并初始化偏移地址和短地址。偏移地址取自代码段code_1标号“start”,段地址用表达式section.code_1.start得到
段地址是用伪指令dd声明的,是32位地址,它仅仅是编译阶段确定的汇编地址,在用户加载到内存后,需要根据加载的实际位置重新计算(浮动)。
3. 段重定位表
程序加载到内存后,每个段的地址必须重新确定。段的重定位是加载器的工作,它需要知道每个段在用户程序内的位置。需要一张段重定位表
声明并初始化段的重定位表的项目数,段重定位表在两个标号之间
即`(header_end - code_1_segment)/4`在编辑阶段计算,面是实际的段重定位表,每个表项用dd声明并初始化为1个双字

8.3 加载程序(器)的工作流程

初始化和决定加载位置

加载器要加载一个程序,并使之开始执行,需要决定两件事。第一,从哪个物理内存地址开始加载用户程序;第二,用户程序位于硬盘上的什么位置,它的起始逻辑扇区号是多少。

​ 8-1,6行,加载器程序的一开始声明了一个常数app_lba_start equ 100其作用类似于C语言中的#define A 100。和其他伪指令db、dw、dd不同,用equ声明的数值不占用任何汇编地址,也不在运行时占用任何内存位置。

phy_base dd 0x10000 ;用户程序被加载的物理起始地址,也可用其他位置。

在这里插入图片描述

准备加载用户程序

主引导扇区定义成一个段,vstar=0x7c00
8-1,12-14行,用于初始化栈段寄存器SS和栈指针SP。
16,17行,起始地址是双字单元,在16位处理器上,只能用两个寄存器存放。

在这里插入图片描述

外围设备及其接口

输入输出控制设备集中器(ICH)芯片,该芯片的作用是连接不同的总线,并协调各个I/O接口对处理器的访问。
在这里插入图片描述

处理器通过局部总线连接到ICH内部的处理接口电路。然后,在ICH内部,又通过总线与各个I/O接口相连。

I/O端口和端口访问

具体地说,处理器是通过端口(Port)和外围设备打交道。本质上,端口就是一些寄存器,端口的寄存器位于I/O接口电路中。

端口有的是端口号映射到内存地址空间的,有的是独立编制的,不和内存发生关系。在独立编制中,处理器的地址既连接内存,也连接每一个I/O接口。有一个特殊的引脚M/IO#。当处理器访问I/O端口,那么M/IO#引脚呈高电平,和内存相关的电路就会打开;如果访问I/O端口,那么M/IO#引脚呈低平,内存电路被禁止。

in指令从端口读,目的操作数必须是寄存器AL或AX,源操作数是寄存器DX
out指令通过端口向外围设备发送数据。目的操作数是8位立即数或者寄存器DX,源操作数必须是寄存器AL或者AX。

通过硬盘控制器端口读扇区数据

硬盘读写的基本单位是扇区,主机和硬盘之间的数据交换是成块的,硬盘是典型的块设备。

以LBA28为例来访问硬盘(28个比特来表示逻辑扇区号,可以管理128GB的硬盘)
个人计算机上的主硬盘控制器被分配了8位端口,从0x1f0到0x1f7。假设现在要从硬盘上读逻辑扇区。

  1. 设置要读取的扇区数量,这个数量写到0x1f2端口。这是个8位端口,每次智能读写255个扇区
mov dx,0x1f2
mox al,0x01
out dx,al
  1. 设置起始LBA扇区号。扇区读写是连续的,因此只需要给出第一个扇区的编号。28位扇区号要分成4段,分别写入端口0x1f3(07位),0x1f4(815位),0x1f5(16~23)和0x1f6(最后四位)。假设读写其实逻辑扇区号为0x02,可编写代码:
mov dx,0x1f3
mov al,0x02
out dx,al
inc dx
mov al,0x00
out dx,al
inc dx
out dx,al
inc dx
mov al,0xe0
out dx,al

在现行体系下,每个PATA/SATA接口允许挂接两块硬盘,分别是主盘和从盘。

请添加图片描述

0x1f6的低4位用于存放24到27位,第4位用于指示硬盘号,0表示主盘,1表示从盘。高3位是“111”,表示LBA模式

  1. 向端口0x1f7写入0x20,请求硬盘读
mov dx,0x1f7
mov al,0x20
out dx,al
  1. 等待读写操作完成。端口0x1f7既是命令端口,又是状态端口。

在这里插入图片描述

在它内部操作期间,它将0x1f7端口的第7位置1,。一旦硬盘系统准备就绪,它将此位清零,同时第3位置1,表明已经准备好,请求主机发送或者接收数据

   mov dx,0x1f7
.waits:in al,dxand al,0x88  ;10001000 表明我们想保留第7位和第3位,其他无关的清零cmp al,0x08 jnz .waits
  1. 连续取出数据。0x1f0是硬盘接口的数据端口,而且是16位得到端口。一旦硬盘控制器空闲,且准备就绪,就可以连续从这个端口写入或者读取数据。
    从硬盘读一个扇区:
	mov cx,256      ;总共要读取的字数mov dx,0x1f0
.readw:in ax,dxmov [bx],axadd bx,2loop .readw

0x1f1端口是错误寄存器,包含硬盘驱动器最后一次执行命令后的状态(错误原因)

相关内容

热门资讯

安卓10系统省电不,安卓10系... 你有没有发现,自从升级到安卓10系统,手机续航能力好像大不如前了?别急,今天就来给你揭秘安卓10系统...
cm14安卓系统,深度定制与极... 你有没有发现,你的安卓手机最近是不是有点不一样了?是不是觉得系统运行得更加流畅,界面也更加美观了呢?...
平板安卓系统咋样升级,轻松实现... 你那平板安卓系统是不是有点儿卡,想给它来个升级大变身?别急,让我来给你详细说说平板安卓系统咋样升级,...
安卓原系统在哪下载,探索纯净体... 你有没有想过,为什么安卓手机那么受欢迎?那是因为它的系统——安卓原系统,它就像是一个充满活力的魔法师...
安卓系统procreate绘图... 你有没有发现,现在手机上画画变得越来越流行了?尤其是用安卓系统的手机,搭配上那个神奇的Procrea...
电视的安卓系统吗,探索安卓电视... 你有没有想过,家里的电视是不是也在悄悄地使用安卓系统呢?没错,就是那个我们手机上常用的安卓系统。今天...
苹果手机系统操作安卓,苹果iO... 你有没有发现,身边的朋友换手机的时候,总是对苹果和安卓两大阵营争论不休?今天,咱们就来聊聊这个话题,...
安卓系统换成苹果键盘,键盘切换... 你知道吗?最近我在想,要是把安卓系统的手机换成苹果的键盘,那会是怎样的体验呢?想象那是不是就像是在安...
小米操作系统跟安卓系统,深度解... 亲爱的读者们,你是否曾在手机上看到过“小米操作系统”和“安卓系统”这两个词,然后好奇它们之间有什么区...
miui算是安卓系统吗,深度定... 亲爱的读者,你是否曾在手机上看到过“MIUI”这个词,然后好奇地问自己:“这玩意儿是安卓系统吗?”今...
安卓系统开机启动应用,打造个性... 你有没有发现,每次打开安卓手机,那些应用就像小精灵一样,迫不及待地跳出来和你打招呼?没错,这就是安卓...
小米搭载安卓11系统,畅享智能... 你知道吗?最近小米的新机子可是火得一塌糊涂,而且听说它搭载了安卓11系统,这可真是让人眼前一亮呢!想...
安卓2.35系统软件,功能升级... 你知道吗?最近在安卓系统界,有个小家伙引起了不小的关注,它就是安卓2.35系统软件。这可不是什么新玩...
安卓系统设置来电拦截,轻松实现... 手机里总是突然响起那些不期而至的来电,有时候真是让人头疼不已。是不是你也想摆脱这种烦恼,让自己的手机...
专刷安卓手机系统,安卓手机系统... 你有没有想过,你的安卓手机系统是不是已经有点儿“老态龙钟”了呢?别急,别急,今天就来给你揭秘如何让你...
安卓系统照片储存位置,照片存储... 手机里的照片可是我们珍贵的回忆啊!但是,你知道吗?这些照片在安卓系统里藏得可深了呢!今天,就让我带你...
华为鸿蒙系统不如安卓,挑战安卓... 你有没有发现,最近手机圈里又掀起了一股热议?没错,就是华为鸿蒙系统和安卓系统的较量。很多人都在问,华...
安卓系统陌生电话群发,揭秘安卓... 你有没有遇到过这种情况?手机里突然冒出好多陌生的电话号码,而且还是一个接一个地打过来,简直让人摸不着...
ios 系统 安卓系统对比度,... 你有没有发现,手机的世界里,iOS系统和安卓系统就像是一对双胞胎,长得差不多,但细节上却各有各的特色...
安卓只恢复系统应用,重拾系统流... 你有没有遇到过这种情况?手机突然卡顿,或者某个应用突然罢工,你一气之下,直接开启了“恢复出厂设置”大...