- 程序必须载入内存中运行。
- 硬件设计的约束。CPU 的指令执行单元只能访问内存,无法从硬盘等存储设备读取;内存随机访问速度快,满足 CPU 实时执行的需求。
- 统一管理简化设计。若 CPU 可以访问外存,会增加硬件复杂性;操作系统只需管理内存分配即可。
- 由加载器将程序代码从外存复制到内存的特定区域,程序中的逻辑地址映射到物理内存地址。
- 将 CS:IP 指向程序的入口地址
- 按下主机上的开机键后,第一个运行的软件是BIOS。
- CPU 加电后,CS:IP 被初始化为 0xF000:0xFFF0(物理地址为 0xFFFF0),此处存放一条跳转指令,跳转到 BIOS 的启动代码。
jmp far f000:e05b ; 0xF000:0xFFF0 存放的跳转指令
- BIOS 代码固定在主板的 ROM 内存中,无需外部加载器。
- CPU 加电后,CS:IP 被初始化为 0xF000:0xFFF0(物理地址为 0xFFFF0),此处存放一条跳转指令,跳转到 BIOS 的启动代码。
- 实模式中只能访问 1MB 的内存。
区域 地址 :–: :–: 系统 BIOS 0xF0000~0xFFFFF 扩展 ROM 0xC0000~0xEFFFF adad adaa
- 开机的那一刻,设置 CS:IP 的初值为 F000:FFF0,实际地址为 0xFFFF0,执行该代码段代码。0xFFFF0~0xFFFFF 为 BIOS 的入口地址。 “`asm jmp far f000:e05b ;跳向 0xE05B 处,这是 BIOS 代码真正开始的地方。这条指令占5字节,剩余11字节可能填充为 NOP 或厂商信息。 “`
- 将段寄存器 CS 设置为 0xF000,用于计算 BIOS 代码的物理地址。
- 接下来 BIOS 检测内存显卡等外设信息。
- 在内存 0x000~0x3FF建立数据结构,中断向量表 IVT 并填写中断例程。256个中断向量,每个4字节,总共 1KB。
## 硬盘操作
- 0X1F0:16位端口,用于读写数据
- 0X1F1:检测前一个指令的错误(基本用不到)
- 0X1F2:读写扇区的数量,最大256
- 0X1F3:起始扇区的 0~7 位
- 0X1F4:起始扇区的 8~15 位
- 0X1F5:起始扇区的 16~23 位
- 0X1F6:device 寄存器
-
5388
- 0~3:起始扇区的 24~27 位
- 4:0 表示主盘,1 表示从盘
- 6:0 表示 CHS,1 表示 LBA
- 5 与 7:固定是 1
- 0X1F7:out 操作
- 0XEC:识别硬盘
- 0X20:读硬盘
- 0X30:写硬盘
- 0X1F7:in 操作
- 0:ERR,此位为 1 表示有错误发生
- 3:DRQ,此位为 1 表示硬盘已经准备好数据,随时可以输出
- 6:DRDY,此位为 1 表示设备就绪,等待指令
- 7:BSY,此位为 1 表示硬盘正忙,勿扰