1. 制作真正的IPL
- IPL 启动程序装载器, 用来装载程序
- 分析代码
; haribote-ipl
; TAB=4
ORG 0x7c00 ; このプログラムがどこに読み込まれるのか
; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述
JMP entry
DB 0x90
DB "HARIBOTE" ; ブートセクタの名前を自由に書いてよい(8バイト)
DW 512 ; 1セクタの大きさ(512にしなければいけない)
DB 1 ; クラスタの大きさ(1セクタにしなければいけない)
DW 1 ; FATがどこから始まるか(普通は1セクタ目からにする)
DB 2 ; FATの個数(2にしなければいけない)
DW 224 ; ルートディレクトリ領域の大きさ(普通は224エントリにする)
DW 2880 ; このドライブの大きさ(2880セクタにしなければいけない)
DB 0xf0 ; メディアのタイプ(0xf0にしなければいけない)
DW 9 ; FAT領域の長さ(9セクタにしなければいけない)
DW 18 ; 1トラックにいくつのセクタがあるか(18にしなければいけない)
DW 2 ; ヘッドの数(2にしなければいけない)
DD 0 ; パーティションを使ってないのでここは必ず0
DD 2880 ; このドライブ大きさをもう一度書く
DB 0,0,0x29 ; よくわからないけどこの値にしておくといいらしい
DD 0xffffffff ; たぶんボリュームシリアル番号
DB "HARIBOTEOS " ; ディスクの名前(11バイト)
DB "FAT12 " ; フォーマットの名前(8バイト)
RESB 18 ; とりあえず18バイトあけておく
; プログラム本体
entry:
MOV AX,0 ; レジスタ初期化
MOV SS,AX
MOV SP,0x7c00
MOV DS,AX
; ディスクを読む
MOV AX,0x0820
MOV ES,AX
MOV CH,0 ; シリンダ0
MOV DH,0 ; ヘッド0
MOV CL,2 ; セクタ2
MOV AH,0x02 ; AH=0x02 : ディスク読み込み
MOV AL,1 ; 1セクタ
MOV BX,0
MOV DL,0x00 ; Aドライブ
INT 0x13 ; ディスクBIOS呼び出し
JC error
; 読み終わったけどとりあえずやることないので寝る
fin:
HLT ; 何かあるまでCPUを停止させる
JMP fin ; 無限ループ
error:
MOV SI,msg
putloop:
MOV AL,[SI]
ADD SI,1 ; SIに1を足す
CMP AL,0
JE fin
MOV AH,0x0e ; 一文字表示ファンクション
MOV BX,15 ; カラーコード
INT 0x10 ; ビデオBIOS呼び出し
JMP putloop
msg:
DB 0x0a, 0x0a ; 改行を2つ
DB "load error"
DB 0x0a ; 改行
DB 0
RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令
DB 0x55, 0xaa
- 我们这里主要分析下面这段代码
1.2 相应指令分析
- INT 0x13 实际上是BIOS 的19 号函数, 用来操作硬盘
对照上面的说明, 我们可以发现, 代码中, 将AH 赋值为 0x02, 实际上是读盘操作, 读取 AL 个扇区,* 将读取数据写入到内存 【ES:BX】所指定的位置处*
另外如果操作出现问题, 会将错误号码存入AH 中, 并将 CF(进位) 标志位标记为 TRUE
1.3 软盘驱动器的构造
ie, 一张软盘有80个柱面, 2 个磁头, 18 个扇区, 每个扇区 512 byte, 总容量 1440kb, 共计2880 个扇区
- 一般我们为了书写方便, 如果使用DS 段寄存器, 可以省略
2. 试错代码
这里我们使用SI 记录错误尝试的次数, 超过 5 次就显示 error 信息, 否则继续尝试, 需要注意的是, 由于AH 放置了错误信息, 在重新尝试的时候, 需要将其进行复位 AH = 0
3. 读到18扇区
上面的代码只是读取了 磁盘中的 2 号扇区, 利用相同的方式, 我们可以读取后面的扇区, 由于1 个柱面总共有 18 个扇区, 因此这里我们只读到 18 扇区, ie, 读取一个柱面
这里每次向后读一个扇区, 需要将段寄存器 ES 向后移动 0x0020, ie, 内存地址向后移动 0x200, (正好就是 512 byte)
- 实际上, 他也是借助了一个循环进行实现
4. 读入 10 个柱面
这里需要注意的是, 由于一个柱面上虽然只有 18 个扇区, 但是他有正反两面, 2 个磁头, 所以在循环的时候, 需要注意寄存器变量的切换工作
5. 着手开发操作系统
- 一般向一个空软盘保存文件的时候:
- 文件名会写在0x002600 以后的地方
- 文件的内容会写在0x004200 以后的地方
6. 从启动区执行操作系统
- 当需要指定执行的操作系统的代码的时候, 在相应的xx.nas 里面加入ORG 0xc200 指令 (0x8000 + 0x4200)
7. 确认操作系统的执行情况
下面给出了 设置显卡的一些说明
ie, 我们这里采用的是 vga 图形模式
8. 32bit 模式前期准备
- 如果使用了 32bit 模式, 就不能调用 BIOS 的相关功能了, 这是因为BIOS 是通过16bit机器语言编写的, 如果想要使用BIOS 实现一些功能, 最好全部都放在开头来实现, 一旦进入32bit 模式就不能再调用 BIOS 函数了
9. 开始导入C 语言
- 使用C 语言, 需要涉及相应的链接工作