刚开始作者叫我们用二进制编辑器,手敲01代码写了个IMG(磁盘映像文件)
,并提供了一些文件
:
Run.bat, install.bat这些一个批处理文件,其实就是写好了cmd指令保存到文档里面,方便以后执行。
其中run.bat里面的指令是这样的
:
copy helloos.img ..\z_tools\qemu\fdimage0.bin
..\z_tools\make.exe -C ../z_tools/qemu
(稍微解释一下:第一行:copy指令把,helloos.img 复制成..\z_tools\qemu\fdimage0.bin其中 ..\表示上级目录。
第二行使用make程序 -C ../z_tools/qemu 表示传递给make的参数。具体什么作用目前还不知道)
然后是install.bat:
..\z_tools\imgtol.com w a: helloos.img //此句是将helloos.img写到软盘上
(我也不会,刚百度的。)
作者提供了一个虚拟器,所以为了避免麻烦,我就使用虚拟器了。
哦,虚拟器,run.bat的作用就显而易见了,就是把磁盘映像复制到虚拟器目录下然后并启动它。
或许作者觉得手写01代码实在过于麻烦,于是他又改用了汇编代码。
书中使用的汇编编译器 NASK是作者自己开发的
第一段汇编代码中作者只是使用了 DB指令,表示定义一个字节。
作者也觉得的代码太长,于是又使用了RESB指令。
RESB是给编辑器的指令,告诉编辑器空出多少多少空间来,作者的nask编辑器,会自动给空出来的地址补上0x00,这样代码长度就减少多了!
然后作者竟然一个大跳跃,直接上了连爹妈都不认识的改良版代码。
刚开始一堆DB DW的,作者称为标准FAT12软盘专用代码。
我不知道为什么需要这个东西。。特地百度了下:
这段完全由数据组成的代码只是符合了一个软盘启动扇区的标准
好吧,我自己反正是不太明白,于是我又百度了一个答案:
引导扇区是软盘的第0个扇区,在这个扇区中有一个很重要的数据结构叫BPB(BIOS Parameter Block),下面是引导扇区格式,其中BPB_开头的属于BPB,以BS_开头的只是BOOT Sector的一部分,不属于BPB。
名称 | 开始字节 | 长度 | 内容 | 参考值 |
BS_jmpBOOT | 0 | 3 | 一个短跳转指令 | jmp Label_07c00H |
BS_OEMName | 3 | 8 | 厂商名 | 'QingFeng' |
BPB_BytesPerSec | 11 | 2 | 每扇区字节数(Bytes/Sector) | 0x200 |
BPB_SecPerClus | 13 | 1 | 每簇扇区数(Sector/Cluster) | 0x1 |
BPB_ResvdSecCnt | 14 | 2 | Boot记录占用多少扇区 | ox1 |
BPB_NumFATs | 16 | 1 | 共有多少FAT表 | 0x2 |
BPB_RootEntCnt | 17 | 2 | 根目录区文件最大数 | 0xE0 |
BPB_TotSec16 | 19 | 2 | 扇区总数 | 0xB40[2*80*18] |
BPB_Media | 21 | 1 | 介质描述符 | 0xF0 |
BPB_FATSz16 | 22 | 2 | 每个FAT表所占扇区数 | 0x9 |
BPB_SecPerTrk | 24 | 2 | 每磁道扇区数(Sector/track) | 0x12 |
BPB_NumHeads | 26 | 2 | 磁头数(面数) | 0x2 |
BPB_HiddSec | 28 | 4 | 隐藏扇区数 | 0 |
BPB_TotSec32 | 32 | 4 | 如果BPB_TotSec16=0,则由这里给出扇区数 | 0 |
BS_DrvNum | 36 | 1 | INT 13H的驱动器号 | 0 |
BS_Reserved1 | 37 | 1 | 保留,未使用 | 0 |
BS_BootSig | 38 | 1 | 扩展引导标记(29h) | 0x29 |
BS_VolID | 39 | 4 | 卷序列号 | 0 |
BS_VolLab | 43 | 11 | 卷标 | 'QingFeng' |
BS_FileSysType | 54 | 8 | 文件系统类型 | 'FAT12' |
引导代码及其他内容 | 62 | 448 | 引导代码及其他数据 | 引导代码(剩余空间用0填充) |
结束标志0xAA55 | 510 | 2 | 第510字节为0x55,第511字节为0xAA | 0xAA55 |
噢!原来是数据结构。叫做BIOS Parameter Block (BIOS参数块),那么顾名思义一下?或许是给bios读取用的吧!?
对了还有一个重要的$符号,作者解释的很详细了,博主比较懒,所以就不打字了!
好啦,只剩下几个名词了,自己看书吧。
稍微总结下不太熟悉的几个知识点:
1、 启动区是第一个扇区,512字节为一个扇区。扇区的最后2个字节为55 AA
启动区的名称必须是8个字节,不够的话空格补齐.
2、 IPL ,启动程序加载器。启动区只有512字节,所以在这里面根本装不下操作系统,
所以里面里面存放的是加载操作系统本身的程序。
3、db定义字节型1字节,dw定义字类型2字节,dd定义双字类4字节
恩,时间不早了,第一天就这么过去吧. 喂喂喂!那段这么长的代码,你倒是分析下啊!
(不会!)