第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端口是错误寄存器,包含硬盘驱动器最后一次执行命令后的状态(错误原因)

相关内容

热门资讯

王者定位怎么关安卓系统,轻松实... 你是不是也和我一样,对王者荣耀这款游戏爱得深沉呢?不过,有时候游戏里的设置让人头疼,比如安卓系统的王...
树莓派安卓系统流畅,打造便携式... 亲爱的读者们,你是否曾想过,将树莓派与安卓系统结合,会擦出怎样的火花呢?今天,就让我带你一起探索这个...
安卓系统智能机顶盒,引领家庭娱... 你有没有想过,家里的电视也能变得智能起来?没错,就是那个陪伴我们多年的老电视,现在也能摇身一变,成为...
安卓系统很差了吗现在,性能优劣... 最近是不是有不少朋友在讨论安卓系统的问题呢?有人说它越来越差了,也有人觉得它还是那个熟悉的“老朋友”...
安卓系统uc安装包,Andro... 你有没有发现,手机里的安卓系统越来越强大了?今天,咱们就来聊聊这个话题——安卓系统中的UC安装包。你...
安卓系统谷歌能删吗,谷歌能否删... 你有没有想过,那个一直陪伴你手机生活的安卓系统,它背后的谷歌爸爸,是不是也能被你随意删掉呢?这可不是...
安卓系统会不会更耗电,解析其功... 你有没有发现,手机用着用着,电池就有点不给力了?尤其是那些用安卓系统的手机,有时候感觉电就像流水一样...
安卓系统中无效目录,安卓系统无... 你有没有遇到过在安卓系统中,明明文件夹就在那里,但是就是找不到的情况?别急,今天就来给你揭秘安卓系统...
国产安卓机哪个系统好用,探寻最... 你有没有想过,国产安卓机哪个系统最好用呢?这可是个让人纠结的问题,毕竟每个系统都有它的特色和亮点。今...
安卓系统cpua9,引领性能与... 你有没有发现,最近你的安卓手机运行得是不是比以前顺畅多了?这可多亏了那个强大的安卓系统CPUA9啊!...
安卓系统usb驱动程序,功能、... 你有没有遇到过这种情况:手机里存了那么多宝贝照片和视频,想传输到电脑上保存,结果电脑却像个小顽皮,死...
安卓操作系统怎么关闭,轻松关闭... 手机里的安卓操作系统是不是有时候让你觉得有点儿烦呢?别急,今天就来手把手教你如何轻松关闭安卓操作系统...
追星手机壳推荐安卓系统,盘点热... 你有没有发现,现在追星族们对手机壳的热爱简直到了疯狂的地步?没错,就是那种能让你一秒变身偶像迷妹的手...
ios系统用安卓系统游戏下载软... 你有没有想过,明明是iOS系统的手机,却想玩安卓系统的游戏?这可不是什么天方夜谭,现在就有这么神奇的...
安卓高系统怎么用美化,打造专属... 亲爱的安卓用户们,你是不是也和我一样,对手机系统美化情有独钟呢?想要让你的安卓手机焕然一新,变得个性...
安卓系统怎么开夜间模式,安卓系... 亲爱的手机控们,你是不是在夜晚使用安卓手机时,眼睛感到有些不适?别担心,今天我要给你揭秘一个超级实用...
王者安卓系统用苹果人脸,一场视... 你知道吗?最近在手机圈里可是掀起了一股不小的波澜呢!那就是王者安卓系统竟然用上了苹果人脸识别技术!是...
安卓444怎么升级系统,轻松迈... 你那安卓444的小家伙是不是已经有点儿落伍了?别急,今天就来给你详细说说怎么给它来个系统升级,让它焕...
安卓系统raw修图软件,探索安... 你有没有发现,手机拍照越来越方便了,但有时候拍出来的照片还是不够完美呢?别急,今天就来给你安利几款安...
安卓系统的王者切换苹果,从安卓... 你知道吗?最近身边的朋友圈里掀起了一股热潮,那就是安卓系统的王者们纷纷切换到苹果阵营。这可真是让人大...