刚开始作者叫我们用二进制编辑器,手敲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 nop |
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字节
恩,时间不早了,第一天就这么过去吧. 喂喂喂!那段这么长的代码,你倒是分析下啊!
(不会!)