从0创建一个OS (八) 读取硬盘中的数据
本节将学习如何从硬盘中读取数据
关键字: 硬盘; 柱面(cylinder);磁头(head);扇区(sector); 进位(carry bit)
目标:利用boot sector从硬盘中读取数据(这一步的目地是为从硬盘中启动操作系统kernel做准备)
理论基础
本节的内容是自本系列博客开始以来最复杂的一节,希望读者在学习时尽量保持耐心,译者读这一节的原文和代码也花了一整天时间,希望大家Keep Patient.
磁盘/硬盘结构
关于磁盘/硬盘的基础概念,本节不做过多讲解,这里给出一篇写的很好的博客,硬盘概念:扇区,磁道,磁头,柱面,簇,针对本节知识来说,掌握扇区、磁头、柱面这三个概念即可。
读取硬盘中的内容
我们没有必要再实现一个读取硬盘数据的底层函数,因为BIOS会提供给我们,我们需要做的就是利用BIOS提供的接口完成我们的任务.
BIOS提供的接口为0x13号中断的硬盘读取功能,读取硬盘任务的相关参数写入特定寄存器,即可在部分寄存器和缓存中得到读取结果.
下面是0x13号中断的介绍,喜欢看英文文档的读者也可以直接看INT 13,2 - Read Disk Sectors,我也会将该中断的介绍放入代码中,方便读者在阅读代码时前后对照,理解相关代码的用意.
进位标志
如果在指令的运算中发生了进位,那么CPU的标志寄存器eFlags的CF(carry flag)位就会被置位,示意上一条指令发生了进位.
利用条件跳转指令 jc 可以在CF为1时发生跳转.
源码
本节的源码有两个:
- 主函数,设置相关参数,读取硬盘,并打印buffer中的数,查看是否读取正确
- 读取硬盘函数,基于BIOS的13号中断实现
这里我们以先子函数,后主函数的形式展现给大家,也希望大家以这个顺序阅读源码,有利于加深对代码的理解.
boot_sect_disk.asm
boot_sect_main.asm
实验结果
由于本次的实验可能在不同的系统上会出一些问题,特此说明.
如果使用qemu-system-x86_64 boot_sect_main.bin
显示boot不成功,可以尝试使用qemu-system-x86_64 -fda boot_sect_main.bin
.
这是实验结果,表明读取成功.
__EOF__

本文链接:https://www.cnblogs.com/haiyonghao/p/14623200.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律