美文网首页
[OS64位][012]小结 程序3-3 boot.asm 做了

[OS64位][012]小结 程序3-3 boot.asm 做了

作者: AkuRinbu | 来源:发表于2019-05-09 16:47 被阅读0次

学习笔记

使用教材(配书源码以及使用方法)
《一个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

https://www.jianshu.com/p/2c03cdd67d4e

  • [OS64位][007]源码阅读:代码清单3-8 字符串显示,找不到loader.bin 时显示提示信息

https://www.jianshu.com/p/cdf5cb908693

  • [OS64位][009]源码阅读:代码清单3-9 根据FAT表项号N获取下一个表项FAT[N] Func_GetFATEntry

https://www.jianshu.com/p/542af8c6423e

  • [OS64位][010]源码阅读:代码清单3-10 从FAT12文件系统中加载loader.bin文件到内存 Label_FileName_Found

https://www.jianshu.com/p/d772901a6be3

相关文章

网友评论

      本文标题:[OS64位][012]小结 程序3-3 boot.asm 做了

      本文链接:https://www.haomeiwen.com/subject/kkfgoqtx.html