1

背景情報

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.1

図 1.2 図 1.2

4

1 に答える 1