计算机启动过程和硬盘接口简单介绍
开机流程
- 按下开机后,CPU的cs:ip 被强制初始化为0xF000 : 0xFFF0 (BIOS的入口地址)
- 第一条指令:jmp far f000:e05b
- 接下来BIOS检测和初始化硬件,在0x000~0x3FF处建立中断向量表IVT并填写中断例程。(可通过“int 中断号”来实现相关的硬件调用,也就是对硬件的IO操作)
- BIOS的最后工作:校验启动盘0盘0道1扇区的内容(必须以0x55和0xaa结尾)
- 将1扇区(主引导记录MBR)内容加载到0x7c00,再jmp 0:0x7c00
硬盘控制器端口
让硬盘工作需要通过读写硬盘控制器的端口,硬盘控制器端口就是位于控制器上的寄存器
端口被分为两组,Common Block register 和 Control Block register。
Common Block register:用于向硬盘驱动器写入命令字或者从硬盘控制器获取硬盘状态。
Control Block register:用于控制硬盘工作状态。
端口是按照通道给出的,一个通道上的主,从两块硬盘都用同样的端口。要操作某通道上的某块硬盘,需要通过device寄存器单独指定。
注:除data寄存器是16位外,其余都是8位
端口介绍:
- data:用于数据的读取和写入
- error:读取失败时,会记录失败的信息。写入时,用于指定命令的额外参数
- sector count: 用于指定待写入或待写入的扇区数。(每成功一次便减1)
- LBA low:记录LBA(Logical Block Address)地址的0-7位
- LBA mid:记录LBA的8-15位
- LBA high:记录LBA的16-23位
- command:记录命令,identify:0xEC,识别硬盘;read sector:0x20,读扇区;write sector:0x30,写扇区
- device寄存器和status寄存器如下: