背景情報
OSのような単純なDOSを開発しています。したがって、すぐに保護モードに入る予定はありません。OS はアセンブリで記述されます。ちなみにNASM構文。ブート セクタは、ブート セクタをハードディスクの最初のセクタに保存し、OS のコードを 2 番目のセクタに保存することになっています。CD イメージからではなく、ハードディスクから起動できるようにします。
問題
問題は、ブート セクタがハードディスクにすべてを適切に保存しているように見えることです。しかし、VMware Player を再起動すると、仮想 CD-ROM が取り出されます。背景が緑色で起動します (図 1.1)。これは、ブート セクタがアドレス 0x7e00 の 2 番目のセクタをロードしておらず、ジャンプに失敗していることを意味するだけです。奇妙なことに、キャリー フラグが設定されていないため、エラーは発生していないと想定しています。したがって、基本的に CD-ROM イメージから起動すると、(図 1.2) のようにすべてが正常に表示されます。しかし、再起動してハードディスクから起動すると、0x7e00 にロードされているはずの OS にジャンプできません。ブート セクタは 0x7c00 にロードされます。セグメント アドレスが正しいと思い込んでいますか、オフセット アドレスが間違っているのでしょうか、それともディスクの書き込みと読み取りが完全に間違っているのでしょうか?
OSが成功したこと
ソフトウェア割り込みの形での基本的なシステム コール。IVT(割り込みベクタテーブル)を修正
プライマリ ハードディスクにブート セクタをロードすると、BIOS はブート セクタをハードディスクからメモリ位置 0x7c00 にロードできます。
問題の原因となっている可能性のあるコード
boot.asm コードは次のとおりです。
[ORG 0x7c00] ; BIOS loads at 0x7c00 in memory
jmp start
%include "C:\Users\OSDEV\OS-SRC\MonsterOS\source\syscalls\syscalls.inc"
start:
xor ax, ax ; make it zero
mov ds, ax ; Data segment is zero
;Set desired video mode (Graphics Mode)
mov ah, 0
mov al, 12h
int 10h
call init_int
;Set desired background color (Green)
mov ah, 0x0b
mov bh, 0
mov bl, 2
int 10h
; Display Box Shaped Cursor
mov ch, 0
mov cl, 7
mov ah, 1
int 10h
;Save BootLoader on the DISK
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 1 ; cylinder 0, sector 1
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, 7c00h ; segment offset of the buffer
mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write)
int 13h
;Save OS on the DISK
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 2 ; cylinder 0, sector 2
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, 7e00h ; segment offset of the buffer
mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write)
int 13h
;Load OS from DISK at 0x7e00
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 2 ; cylinder 0, sector 2
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, 7e00h ; segment offset of the buffer
mov ax, 0201h ; AH = 02 (disk read), AL = 01 (number of sectors to read)
int 13h
jc err
jmp 0h:0x7e00 ; Jump To OS
err:
mov ax, err_msg
mov bh, 0
mov bl, 0xf
int 21h ; Print error message
err_msg: db 'Error Failed To Load OS From Disk!', 0
times 510-($-$$) db 0
db 0x55
db 0xAA
os.asm は次のとおりです。
[ORG 0x7e00]
xor ax, ax ; make it zero
mov ds, ax ; Data segment is zero
mov es, ax
; Clear Screen
int 27h
;Set desired background color (Green)
mov ah, 0x0b
mov bh, 0
mov bl, 2
int 0x10
; Display Box Shaped Cursor
mov cx, 0607h
mov ah, 1
int 10h
; Print Desired Message
mov ax, msg
mov bh, 0
mov bl, 0xf
int 21h
int 23h ; Print newline
hang:
mov ax, buffer
int 25h ; SIZE(buffer)
mov ax, buffer
int 24h ;ZERO(buffer)
; Print Desired Message
mov ax, cli_msg
mov bh, 0
mov bl, 0xf
int 21h ; print ax=msg bl=blue
; Get Input
mov bx, buffer
int 22h ; Read From Keyboard And Print The String With Line Feed
; ECHO String Stored At The Address Buffer
mov ax, buffer
mov bh, 0
mov bl, 0xf
int 21h ;
int 23h ; Print newline
jmp hang
msg: db 'Welcome To MonsterOS!', 0
cli_msg: db 'MonsterOS> ', 0
buffer: times 64 db 0
スクリプト build.bat コードは次のとおりです。
nasm -f bin C:\Users\OSDEV\OS-SRC\MonsterOS\source\boot.asm -o C:\Users\OSDEV\OS-SRC\MonsterOS\bin\boot.bin
nasm -f bin C:\Users\OSDEV\OS-SRC\MonsterOS\source\os.asm -o C:\Users\OSDEV\OS-SRC\MonsterOS\bin\os.bin
copy /b C:\Users\OSDEV\OS-SRC\MonsterOS\bin\boot.bin + C:\Users\OSDEV\OS-SRC\MonsterOS\bin\os.bin C:\Users\OSDEV\OS-SRC\MonsterOS\bin\img.bin
miso C:\Users\OSDEV\OS-SRC\MonsterOS\bin\os.iso -ab C:\Users\OSDEV\OS-SRC\MonsterOS\bin\img.bin
ポストスクリプト
割り込み 21h、22h、23h、24h、25h、26h は、OS 用に作成したカスタム ソフトウェア割り込みです。さらに質問がある場合、またはコードや情報がさらに必要な場合は、ここで詳細情報を提供します。
ソリューション
気にする人のために、VirtualBox によって作成された VHD に img.bin を記述し、VHD から起動することで解決しました。だから、それは魅力のように機能します。ちなみに、Hex Editorを使用しました。
図 1.1
図 1.2