0.引子
最近在看操作系统底层方面的东西,最开始的为什么是07c00h这个问题就让我对操作系统有了很大的兴趣。所以准备在看书之余顺便写一个操作系统(Anz)。至于为什么这个系统会被叫做Antz,可以参考Antz Uhl Kone(某个日漫男主的名字), 日语为アインズ·ウール·ゴウン , 与之对应的还有接下来准备写的自制脚本语言AntzScript,因为准备是用Java实现解释器,所以如何把AntzScript运行在Antz上是一个很大问题(其实问题就是引入Java)。
Antz系统更新地址:
Linux内核源码分析地址:
1.关于Boot Sector
引导扇区(Boot Sector) 通常指设备的第一个扇区,用于加载并转让处理器控制权给操作系统。
1.1 主引导扇区
1.2 MBR成员
1.3MBR功能
2.Boot Sector实现代码
在BIOS自检等一系列工作完成后,要开始引导了。计算机会将硬盘0面0道1扇区512字节加载到07c00h(0000::7c00)处。
1)为什么是0面0道1扇区?
这个可以理解为是规定,当Bios工作完成后会去将硬盘0面0道1扇区512字节进行加载。但是真实情况是根据“魔数”来确定的,魔数就是有特殊意义的数,更大作用是用来做标记,比如MBR就是在512个字节的最后两个字节填入 0x55 ,0xaa来进行标记的。放在第一个扇区是因为0面0道1扇区是磁盘最开始的地方,一开始检验出有 0x55 ,0xaa就直接开始加载。
2)为什么是07c00h?
这个也可以当作是规定,在IBM文档中没有具体说明07c00h是为什么,但是在世界上第一台个人计算机诞生时,07c00h就是在它当中初次诞生的,那时的DOS最多也就是32K,为了实现MBR中的栈需要512B,为了满足需求取最大为1K,也就是32K-1K,就是07c00h了。
1 org 07c00h 2 mov ax,cs 3 mov ds,ax 4 mov es,ax 5 call DispStr 6 jmp $ 7 8 DispStr: 9 mov ax,BootMessage10 mov bp,ax11 mov cx,1612 mov ax,01301h13 mov bx,000ch14 mov dl,015 int 10h16 ret17 BootMessage: db "Antz Uhl Kone"18 times 510-($-$$) db 019 20 dw 0xaa55
第1行的org 07c00h已经做出讲解了,它规定了程序加载的区域。
第2-4行是将ds,es和cs指向相同的地址
第5行call DispStr是调用了子程序实现字符串显示。
在子程序DispStr中:
mov ax,BootMessage 取得显示字符串的地址
mov bp,ax es:ax 串地址 mov cx,16 cx,串长度 mov ax,01301h ah = 13 h al=01h mov bx,000ch bh = 00 页号 bl = 0ch 字色 mov dl,0 int 10h 10h中断 ret第6行的 jmp $是为了进行无限循环。
$可以理解为当前行命令的起始地址,$$是表示当前段的起始地址。
第18行的times 510-($-$$) db 0 是将剩下的地址全部填 0 ,在512个字节中,0x55,0xaa占两个字节,剩下的510个字节减去之前用过的($-$$)个字节,身下的512-2-$-$$个字节全部填0。
3.代码生成Img镜像
工具 : NASM , FloppyWriter
先对asm文件使用NASM编译成为bin文件:
nasm os.asm -o os.img
此时在asm同级目录生成了一个os.bin文件。
新建一个文件为 One_Antz.img
此时生成了一个空的img文件。
打开FloppyWriter.exe,选择第二个
先选择我们生成的bin文件,点击下一步
再选择我们创建的img文件。
镜像就制作成功了。
生成的镜像就是我们之前创建的img文件,内容被直接写入了。
现在可以使用虚拟机打开我们创建的镜像了。
设置好镜像后打开虚拟机。