如何读emmc里的引导程序_自制操作系统学习1 引导程序
Contents
起因
自制操作系统系列的第一课:加电之后 CPU 到底做了什么、怎么让它跑起我们自己的程序。这条链路的第一棒就是引导程序(boot sector)。
本系列学习有前面的汇编学习基础最好,如果没有影响也不大本系列学习主要资源来自《[30天自制操作系统].(川合秀实)》,《自己动手写操作系统》两本书
需求
- 引导程序在 FAT12 软盘镜像里找到 NotOneOS.sys,把它所在的磁盘块载入内存
- 跳转执行它,并用 bochs 调试器验证“确实跳过去了”
技术实现原理
为什么是 0x7c00 和 512 字节
x86 上电后进入实模式,BIOS 做完自检,把启动盘的第一个扇区(512 字节,结尾要有 0x55AA 标记)整块读到内存 0x7c00,然后跳过去执行——这就是引导程序的身世:被 BIOS 固定搬到 0x7c00 的 512 字节。512 字节装不下任何“操作系统”,所以它的宿命就是搬运工:把盘上更多内容读进内存,再把控制权交出去。
FAT12 的盘面布局:0x2600 和 0x4200 是算出来的
引导程序要找文件,就得按文件系统的规矩来。FAT12 软盘的扇区分配是固定的:1 个引导扇区 + 2 份 FAT 表(各 9 扇区)+ 根目录区(224 项,占 14 扇区)+ 之后全是数据区。换算一下:根目录从第 19 扇区开始,19×512 = 0x2600——文件名在这里;数据区从第 33 扇区开始,33×512 = 0x4200——文件内容从这里起放。前一节已经把整块盘搬进内存 0x8000 起,于是“找文件”变成“查内存”:磁盘偏移 + 0x8000 就是内存地址,0x4200 处的内容落在 0xc200。跳到 0xc200 执行,就是运行 NotOneOS.sys。
读盘循环:CHS 与重试
INT 13h 按“柱面-磁头-扇区”三元组读盘,一次一个扇区。读完一个扇区 ES 加 0x20(512 字节换算成段单位),扇区数满 18 就进位到磁头,磁头满 2 就进位到柱面,直到读满 10 个柱面。读失败不是异常而是常态(软盘的特性),所以每个扇区都带“失败重试 5 次 + 复位驱动器再来”的逻辑——这段是整个加载过程的可靠性来源。
为什么调试用 bochs
bochs 自带调试器,能反汇编、下断点、看寄存器:u 0x7c00 反汇编引导区找到关键跳转,b 0x7cca 下断点,单步后看寄存器与跳转目标——确认程序真的跳到了 0xc200 的 NotOneOS.sys。
一、准备工作
bochs
virtualbox,windows虚拟机
nasm
二、操作流程
回顾前文的程序,我们的引导程序已经可以加载软盘的10个柱面的数据到内存的 0x0820 处,引导扇区本身的512字节由BIOS加载到 0x7c00 处(所以代码里 org 07c00h)。
这一节让程序从这些数据中找到软盘上的程序,并运行其中的程序。
下面程序的重点是加载文件后,程序所在位置。通过前一节可以知道:
文件名在磁盘的是 0x2600处
文件内容在磁盘的0x4200处
磁盘的内容加载到内存的0x8000处
所以磁盘的0x4200处的内容在 内存的 0x8000+0x4200=0xc200处
- 修改程序
|
|
- 编译,生成镜像 ```sh make img
|
|
Author 软件开发大郭
LastMod 2022-01-05