[读书笔记]30 天自制操作系统 day3 进入32bit模式并导入C语言

1. 制作真正的IPL

  1. IPL 启动程序装载器, 用来装载程序
  2. 分析代码
; 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. 我们这里主要分析下面这段代码
    这里写图片描述

1.2 相应指令分析

  1. INT 0x13 实际上是BIOS 的19 号函数, 用来操作硬盘
    这里写图片描述
    这里写图片描述
    对照上面的说明, 我们可以发现, 代码中, 将AH 赋值为 0x02, 实际上是读盘操作, 读取 AL 个扇区,* 将读取数据写入到内存 【ES:BX】所指定的位置处*
    另外如果操作出现问题, 会将错误号码存入AH 中, 并将 CF(进位) 标志位标记为 TRUE

1.3 软盘驱动器的构造

这里写图片描述
ie, 一张软盘有80个柱面, 2 个磁头, 18 个扇区, 每个扇区 512 byte, 总容量 1440kb, 共计2880 个扇区

  1. 一般我们为了书写方便, 如果使用DS 段寄存器, 可以省略

2. 试错代码

这里写图片描述
这里写图片描述
这里我们使用SI 记录错误尝试的次数, 超过 5 次就显示 error 信息, 否则继续尝试, 需要注意的是, 由于AH 放置了错误信息, 在重新尝试的时候, 需要将其进行复位 AH = 0

3. 读到18扇区

  1. 上面的代码只是读取了 磁盘中的 2 号扇区, 利用相同的方式, 我们可以读取后面的扇区, 由于1 个柱面总共有 18 个扇区, 因此这里我们只读到 18 扇区, ie, 读取一个柱面
    这里写图片描述
    这里写图片描述

  2. 这里每次向后读一个扇区, 需要将段寄存器 ES 向后移动 0x0020, ie, 内存地址向后移动 0x200, (正好就是 512 byte)

  3. 实际上, 他也是借助了一个循环进行实现

4. 读入 10 个柱面

这里写图片描述
这里需要注意的是, 由于一个柱面上虽然只有 18 个扇区, 但是他有正反两面, 2 个磁头, 所以在循环的时候, 需要注意寄存器变量的切换工作

5. 着手开发操作系统

  1. 一般向一个空软盘保存文件的时候:
    1. 文件名会写在0x002600 以后的地方
    2. 文件的内容会写在0x004200 以后的地方

6. 从启动区执行操作系统

  1. 当需要指定执行的操作系统的代码的时候, 在相应的xx.nas 里面加入ORG 0xc200 指令 (0x8000 + 0x4200)

7. 确认操作系统的执行情况

这里写图片描述
下面给出了 设置显卡的一些说明
这里写图片描述
ie, 我们这里采用的是 vga 图形模式

8. 32bit 模式前期准备

  1. 如果使用了 32bit 模式, 就不能调用 BIOS 的相关功能了, 这是因为BIOS 是通过16bit机器语言编写的, 如果想要使用BIOS 实现一些功能, 最好全部都放在开头来实现, 一旦进入32bit 模式就不能再调用 BIOS 函数了

9. 开始导入C 语言

  1. 使用C 语言, 需要涉及相应的链接工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值