Last updated
Last updated
bootloader如何读取硬盘扇区的
bootloader是如何加载ELF格式的OS
什么是bootloader
bootloader
是为了加载内核而编写的程序。
bootloader
的作用是什么
将内核加载到内存
向内核提供正常工作所需的信息
切换到内核所需的环境
将控制权转移给内核
什么是扇区
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。
如何读写扇区
硬盘相关IO地址及其对应功能:
0x1f0
: 读数据,当0x1f7不为忙状态时,可以读
0x1f2
: 要读写的扇区数,每次读写前,你需要表明你要读写几个扇区。最小是1个扇区
0x1f3
: 如果是LBA模式,就是LBA参数的0-7位
0x1f4
: 如果是LBA模式,就是LBA参数的8-15位
0x1f5
: 如果是LBA模式,就是LBA参数的16-23位
0x1f6
: 第0~3位:如果是LBA模式就是24-27位 第4位:为0主盘;为1从盘
0x1f7
: 状态和命令寄存器。操作时先给命令,再读取,如果不是忙状态就从0x1f0端口读数据
读取扇区的流程大致如下:
等待磁盘准备好
发出读取扇区的命令
等待磁盘准备好
把磁盘扇区数据读到指定内存
bootloader
是如何读取硬盘扇区的
参考以下代码:
其中,waitdisk
函数的代码为:
由以上代码可知,bootloader
读取硬盘扇区步骤为
从0x1F7
端口读硬盘状态,直到硬盘不忙
向0x1F2
端口发送读写的扇区数量
向0x1F3
~0x1F6
端口发送LBA参数
向0x1F7
端口发送读扇区的指令
从0x1F7
端口读硬盘状态,直到硬盘不忙
从0x1F0
端口读入扇区内容至dst
ELF
是什么
ELF
是类Unix系统上的一种文件格式,常用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
ELF
的格式是什么
参考代码:
bootloader
是如何加载ELF
格式的OS
参考代码:
由代码可知,bootloader
加载OS的流程为:
将硬盘第一个扇区的内容读入ELFHDR
验证ELFHDR
是否为合格的ELF
格式
加载ELF
的每个程序段
调用ELF
头内的OS入口,加载OS成功