第七章 BIOS和虚拟机

BIOS及其调用

  1. BIOS简介
  • BIOS包含了主要I/O设备的处理程序和许多常用例行程序
  • BIOS是覆盖在硬件系统上的第一层软件直接操纵I/O设备或者硬件设备,实现计算机系统的基本输入或输出。
  • 通过BIOS,可以读取磁盘上的特定程序
  • 依靠BIOS,操作系统完成启动自举
  1. 键盘输入和显示输出
  1. 键位和扫描码
  • 字符键有对应的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              ;等待键盘输入
  1. 显示方式
  • 图形显示方式
  • 文本显示方式
    最经典:25行*80列
  1. 显示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程序
  1. 演示程序dp71~73.asm
  1. dp71.asm
    需要先判断当前是否有键可读若没有需要继续读取,不能直接返回。
  2. 后面的还没看

磁盘及其读写

  1. 磁盘简介
    硬盘结构:磁道、扇区(通常存储512字节)、磁头、柱面
    扇区地址
  • CHS地址(三维地址)
    通过柱面、磁头、扇区号来确定磁盘上的某个扇区。
  • 绝对扇区号/LBA地址(一维地址)
    称之为逻辑块编址。
LBA地址(逻辑块号)与CHS地址的关系如下(起始逻辑块号为0):
逻辑块号 =   每道扇区数 * 磁头数 * 柱面号
             + 每道扇区数 * 磁头号
             + 扇区号 - 1

磁盘容量

假设柱面数是c,磁头数是h,每个磁道的扇区数是s,

磁盘最大容量V(字节数)由下式计算:

V = 每扇区字节数 * 扇区个数
= 512 * 扇区个数
= 512 *(c * h * s)
  1. 磁盘读写
  • 磁盘I/O程序
    设置相应入口参数(可能有多个)后,调用INT 13H陷入中断。
  • 虚拟机bios设置成 bios设置虚拟机开启_引导程序

采用上述方式,最多只能访问8GB左右的硬盘。

虚拟机bios设置成 bios设置虚拟机开启_虚拟机bios设置成_02

  • 磁盘地址数据包DAP
    DAP结构如下:
struct  DiskAddressPacket
{
    BYTE   PacketSize;   //数据包尺寸(16字节)
    BYTE   Reserved;     //保留==0
    WORD   BlockCount;   //传输数据块个数(以扇区为单位)
    DWORD  BufferAddr;   //传输缓冲地址(segment:offset)
    QWORD  BlockNum;     //起始扇区的逻辑块号(一维地址)
    // QWORD  BlockNum中,LBA由8字节表示,足够大!
};
  • 磁盘I/O程序
  • 拓展读
  • 虚拟机bios设置成 bios设置虚拟机开启_汇编_03

  • 拓展写
  • 虚拟机bios设置成 bios设置虚拟机开启_显示方式_04

  • 磁盘I/O示例
  • 虚拟机bios设置成 bios设置虚拟机开启_柱面_05

  1. 主引导记录分析
    PC机启动主要步骤:加电自检(POST)配置BIOS引导操作系统
  1. 加电自检
    主要是检测关键部件、显示控制卡,测试RAM等。
  2. 配置BIOS
    主要是获取机器系统基本信息、相关设备I/O端口地址和中断向量。
  3. 引导操作系统
  • (加电自检时)读取主引导记录到0000:7C00,并转该处执行。
  • 关于主引导记录
  • 组成
    主引导程序(446字节)
    磁盘分区表项(Disk Partition Table)(64字节)
    结束标志(2字节)
  • 主引导记录位于启动磁盘首个扇区的一段引导(Loader)代码。所谓启动磁盘指准备启动操作系统的磁盘。所谓首个扇区指磁盘上的逻辑块号(LBA)为0的扇区,也就是CHS地址(0道、0面、1扇区)的扇区
  • 主引导程序执行步骤
  • 自身腾挪
  • 识别当前活动分区
  • 读取操作系统引导程序
  • 转操作系统引导程序

动磁盘首个扇区的一段引导(Loader)代码。所谓启动磁盘指准备启动操作系统的磁盘。所谓首个扇区指磁盘上的逻辑块号(LBA)为0的扇区,也就是CHS地址(0道、0面、1扇区)的扇区**。

- **主引导程序执行步骤**

    - 自身腾挪
    - 识别当前活动分区
    - 读取操作系统引导程序
    - 转操作系统引导程序