练习4
练习4:分析bootloader加载ELF格式的OS的过程
练习4文档 相关阅读:硬盘访问概述 相关阅读:ELF文件格式概述
bootloader如何读取硬盘扇区的
bootloader是如何加载ELF格式的OS
相关文件
bootloader如何读取硬盘扇区的
背景知识
什么是
bootloaderbootloader是为了加载内核而编写的程序。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
参考文献
bootloader是如何加载ELF格式的OS
背景知识
ELF是什么ELF是类Unix系统上的一种文件格式,常用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。ELF的格式是什么参考代码:
问题分析
bootloader是如何加载ELF格式的OS参考代码:
由代码可知,
bootloader加载OS的流程为:将硬盘第一个扇区的内容读入
ELFHDR验证
ELFHDR是否为合格的ELF格式加载
ELF的每个程序段调用
ELF头内的OS入口,加载OS成功
参考文献
Last updated
Was this helpful?