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

相关内容

热门资讯

122.(leaflet篇)l... 听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
育碧GDC2018程序化大世界... 1.传统手动绘制森林的问题 采用手动绘制的方法的话,每次迭代地形都要手动再绘制森林。这...
Vue使用pdf-lib为文件... 之前也写过两篇预览pdf的,但是没有加水印,这是链接:Vu...
PyQt5数据库开发1 4.1... 文章目录 前言 步骤/方法 1 使用windows身份登录 2 启用混合登录模式 3 允许远程连接服...
Android studio ... 解决 Android studio 出现“The emulator process for AVD ...
Linux基础命令大全(上) ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维...
再谈解决“因为文件包含病毒或潜... 前面出了一篇博文专门来解决“因为文件包含病毒或潜在的垃圾软件”的问题,其中第二种方法有...
南京邮电大学通达学院2023c... 题目展示 一.问题描述 实验题目1 定义一个学生类,其中包括如下内容: (1)私有数据成员 ①年龄 ...
PageObject 六大原则 PageObject六大原则: 1.封装服务的方法 2.不要暴露页面的细节 3.通过r...
【Linux网络编程】01:S... Socket多进程 OVERVIEWSocket多进程1.Server2.Client3.bug&...
数据结构刷题(二十五):122... 1.122. 买卖股票的最佳时机 II思路:贪心。把利润分解为每天为单位的维度,然后收...
浏览器事件循环 事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间࿰...
8个免费图片/照片压缩工具帮您... 继续查看一些最好的图像压缩工具,以提升用户体验和存储空间以及网站使用支持。 无数图像压...
计算机二级Python备考(2... 目录  一、选择题 1.在Python语言中: 2.知识点 二、基本操作题 1. j...
端电压 相电压 线电压 记得刚接触矢量控制的时候,拿到板子,就赶紧去测各种波形,结...
如何使用Python检测和识别... 车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计...
带环链表详解 目录 一、什么是环形链表 二、判断是否为环形链表 2.1 具体题目 2.2 具体思路 2.3 思路的...
【C语言进阶:刨根究底字符串函... 本节重点内容: 深入理解strcpy函数的使用学会strcpy函数的模拟实现⚡strc...
Django web开发(一)... 文章目录前端开发1.快速开发网站2.标签2.1 编码2.2 title2.3 标题2.4 div和s...