第七章 BIOS和虚拟机
BIOS及其调用
- BIOS简介
- BIOS包含了主要I/O设备的处理程序和许多常用例行程序
- BIOS是覆盖在硬件系统上的第一层软件,直接操纵I/O设备或者硬件设备,实现计算机系统的基本输入或输出。
- 通过BIOS,可以读取磁盘上的特定程序。
- 依靠BIOS,操作系统完成启动自举。
- 键盘输入和显示输出
- 键位和扫描码
- 字符键有对应的ASCII码,其他的键并没有ASCII码。
- 每个键有一个代表键位置的扫描码。
- 在用户按键后,键盘中断处理程序根据所按键的扫描码进行处理。它把字符键的扫描码和对应的ASCII码存到键盘缓冲区(某个确定的内存区域);把功能键的扫描码存到键盘缓冲区;记录下控制键和双态键的状态;直接处理特殊请求键。
- 键盘I/O程序
设置AH为对应值后,使用INT 16H
陷入中断。
键盘输入示例
CLEAR:
MOV AH, 1
INT 16H ;键盘缓冲区空吗?
JZ .OK ;已清空,跳转
MOV AH, 0
INT 16H ;从键盘缓冲区取走一个字符
JMP CLEAR ;直到键盘缓存区空为止
.OK:
MOV AH, 0
INT 16H ;等待键盘输入
- 显示方式
- 图形显示方式
- 文本显示方式
最经典:25行*80列
- 显示I/O程序
设置相应入口参数(可能有多个)后,调用INT 10H
陷入中断。
可以认为显示页号是显示缓冲区的编号。调用显示I/O程序的5号功能,可选择当前显示页。通常,总是使用第0页。
- 示例:14号功能
;TTY显示方式:在当前光标处显示字符,随后光标移动到下一个位置
MOV AL, '8' ;字符(ASCII码)
MOV AH, 14 ;14(0EH)号功能
INT 10H ;TTY方式显示字符
- 示例:9号功能
;在当前光标位置处,按指定属性,显示指定字符(光标并不移动)
MOV BH, 0 ;显示页(第0页)
MOV BL, 47H ;显示属性(红底白字)
MOV CX, 1 ;重复次数(1个字符)
MOV AL, 'A' ;字符为A
MOV AH, 9 ;9号功能
INT 10H ;调用显示I/O程序
- 示例:10号功能
;利用BIOS在当前光标位置处显示指定字符2次,但光标并不移动
MOV BH, 0 ;第0页
MOV CX, 2 ;2个
MOV AL, 'A' ;字符为A
MOV AH, 10 ;10号功能
INT 10H ;调用显示I/O程序
- 演示程序dp71~73.asm
- dp71.asm
需要先判断当前是否有键可读,若没有需要继续读取,不能直接返回。 - 后面的还没看
磁盘及其读写
- 磁盘简介
硬盘结构:磁道、扇区(通常存储512字节)、磁头、柱面
扇区地址
- CHS地址(三维地址)
通过柱面、磁头、扇区号
来确定磁盘上的某个扇区。 - 绝对扇区号/LBA地址(一维地址)
称之为逻辑块编址。
LBA地址(逻辑块号)与CHS地址的关系如下(起始逻辑块号为0):
逻辑块号 = 每道扇区数 * 磁头数 * 柱面号
+ 每道扇区数 * 磁头号
+ 扇区号 - 1
磁盘容量
假设柱面数是c,磁头数是h,每个磁道的扇区数是s,
磁盘最大容量V(字节数)由下式计算:
V = 每扇区字节数 * 扇区个数
= 512 * 扇区个数
= 512 *(c * h * s)
- 磁盘读写
- 磁盘I/O程序
设置相应入口参数(可能有多个)后,调用INT 13H
陷入中断。
采用上述方式,最多只能访问8GB左右的硬盘。
- 磁盘地址数据包DAP
DAP结构如下:
struct DiskAddressPacket
{
BYTE PacketSize; //数据包尺寸(16字节)
BYTE Reserved; //保留==0
WORD BlockCount; //传输数据块个数(以扇区为单位)
DWORD BufferAddr; //传输缓冲地址(segment:offset)
QWORD BlockNum; //起始扇区的逻辑块号(一维地址)
// QWORD BlockNum中,LBA由8字节表示,足够大!
};
- 磁盘I/O程序
- 拓展读
- 拓展写
- 磁盘I/O示例
- 主引导记录分析
PC机启动主要步骤:加电自检(POST)
、配置BIOS
、引导操作系统
。
- 加电自检
主要是检测关键部件、显示控制卡,测试RAM等。 - 配置BIOS
主要是获取机器系统基本信息、相关设备I/O端口地址和中断向量。 - 引导操作系统
- (加电自检时)读取主引导记录到
0000:7C00
,并转该处执行。 - 关于主引导记录
- 组成
主引导程序(446字节)
磁盘分区表项(Disk Partition Table)(64字节)
结束标志(2字节) - 主引导记录位于启动磁盘首个扇区的一段引导(Loader)代码。所谓启动磁盘指准备启动操作系统的磁盘。所谓首个扇区指磁盘上的逻辑块号(LBA)为0的扇区,也就是CHS地址(0道、0面、1扇区)的扇区。
- 主引导程序执行步骤
- 自身腾挪
- 识别当前活动分区
- 读取操作系统引导程序
- 转操作系统引导程序
动磁盘首个扇区的一段引导(Loader)代码。所谓启动磁盘指准备启动操作系统的磁盘。所谓首个扇区指磁盘上的逻辑块号(LBA)为0的扇区,也就是CHS地址(0道、0面、1扇区)的扇区**。
- **主引导程序执行步骤**
- 自身腾挪
- 识别当前活动分区
- 读取操作系统引导程序
- 转操作系统引导程序