上一篇讲了如何使用虚拟机运行我们写好的操作系统,但上一篇的操作系统其实仅仅存在于引导扇区中,接下来我们将看到程序如何从引导扇区跳到其他位置。
引导区内容的装载位置为
0x00007c00-0x00007dff,规定该位置的人是当年开发IBM-PC的工程师们。0x7e00-0x9fbff是操作系统可以随便使用的内存位置。按照《30天自制操作系统》中所讲,我们把前10个磁道的数据都读入内存,内存位置从0x8000开始。因此磁盘镜像文件中,位于地址x的字符加载到内存的位置就为0x8000+x。现在设我们需要执行磁盘镜像上位于0x004200号地址的程序,那么其内存地址就为0x8000+0x4200=0xc200。
程序一、ipl.nas
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; hello-os
; TAB=8
ORG 0x7C00
; 以下的记述用于标准FAT12格式的软盘
start:
JMP entry
DB "HELLOIPL" ; 启动区名称(8字节)
DW 512 ; 扇区大小(512字节)
DB 1 ; 簇大小(1扇区)
DW 1 ; FAT起始位置
DB 2 ; FAT个数
DW 224 ; 根目录大小(224项)
DW 2880 ; 磁盘大小(2880扇区)
DB 0xf0 ; 磁盘种类
DW 9 ; FAT长度
DW 18 ; 每个磁道扇区数
DW 2 ; 磁头数
DD 0 ; 不使用分区
DD 2880 ; 重写一次磁盘大小
DB 0,0,0x29 ; 意义不明
DD 0xffffffff ; 可能是卷标号码
DB "HELLO-OS " ; 磁盘名称(11字节)
DB "FAT12 " ; 格式名称(8字节)
RESB 18 ; 空出18字节
entry:
MOV AX,0 ; 初始化寄存器