学习笔记
使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171
小结 程序3-3 Boot.asm 做了哪些工作?
-
在这之前,要创建一个
1.44MB
虚拟软盘镜像boot.img
并用dd
命令 将boot.bin
写入软盘0面0道1扇区(LBA:0)
-
电脑开始上电后自动将软盘
0面0道1扇区(LBA:0)
的512字节
读入到物理内存0x7c00
处,开始执行boot.bin
里面的机器码 -
boot
的做的工作
此时软盘已经拥有了
FAT12
文件系统,boot
要从FAT12
的数据区中,找到 文件名是loader.bin
的文件,把这个文件的全部数据读入到物理内存0x1000:0000
处,然后设置跳转指令,跳转到物理内存0x1000:0000
处开始执行loader.bin
的机器码(机器码只有在内存里才可以运行,任何机器码必须先读入内存,
CPU
不知道从内存哪里开始执行指令,所以要明确地使用跳转指令,本质就是强制地设定CS:IP
的值,即告诉CPU
,请从这里开始)
- 为了支持
boot
的工作,需要实现的过程
■ 读取一个软盘扇区数据到内存指定位置
Func_ReadOneSector
■ 在FAT12
文件系统 根目录区 查找 文件名是loader.bin
的目录项Lable_Search_In_Root_Dir_Begin
■ 在FAT12
文件系统 找到 属于loader.bin
的全部簇的簇号Func_GetFATEntry
■ 根据簇号,调用软盘读,把属于指定文件的全部数据都读到内存指定位置
- 一些容易混淆的地方
loader.bin
是文件名.后缀名,这个是硬编码在汇编代码里的,如果你愿意,你当然可以写hello.txt
,只要你在代码里也同步修改成hello.txt
举个例子:吃饭
-
要准备碗,虚拟软盘镜像就是那个碗,要提前准备的
-
要准备米,在电饭煲里煮好,生米就是
boot.asm
的汇编源码,煮好的饭就是用nasm
编译后的boot.bin
-
从电饭煲里装饭到碗里,就是给虚拟软盘镜像
LBA0号扇区
写512
字节的数据 -
我想把碗里左半碗的米先吃掉,左半边的米就是我的目标文件
-
左半碗的米一口吃不完,目标文件也很大,一次也读不完
-
饭要一口一口吃,目标文件也要一簇一簇地读
参考资料
Lable_Search_In_Root_Dir_Begin 在根目录区查找目录项
Label_Cmp_FileName 对比文件名
Label_FileName_Found 找到一致的文件名
Label_File_Loaded 已经读入目标文件全部扇区数据
- [OS64位][006]源码阅读:代码清单3-7 目标文件搜索 Lable_Search_In_Root_Dir_Begin
- [OS64位][007]源码阅读:代码清单3-8 字符串显示,找不到loader.bin 时显示提示信息
- [OS64位][009]源码阅读:代码清单3-9 根据FAT表项号N获取下一个表项FAT[N] Func_GetFATEntry
- [OS64位][010]源码阅读:代码清单3-10 从FAT12文件系统中加载loader.bin文件到内存 Label_FileName_Found
网友评论