首先,我們先處理程式的方面。我們要把在16bits真實模式下的讀取硬碟的程式參數,全部改成硬碟,否則他還是會停在軟碟的時代。(第一顆)硬碟的編號是0x80。並且,我們把這個檔案命名為mbr.S,他只負責讀取第3、4個磁區的程式,之後直接跳轉到下一段程式。之後還幫我們這個假的60MiB硬碟,做了一個分割區(也是唯一一個)。
.code16
.section .text
# Init all the registers
xorw %ax, %ax
xorw %bx, %bx
xorw %cx, %cx
xorw %dx, %dx
movw $0x7C0, %ax
movw %ax, %es
movw %ax, %ds
movw %ax, %ss
# Reset Disk (int 0x13, ah = 0x0, dl = 0x80 (first disk))
movb $0, %ah
movb $0x80, %dl
int $0x13
# Read Number 3, 4 (CHS)
# (int 0x13, ah = 0x2, al = 2, ch = 0, cl = 3, dh = 0, dl = 0x80, ES:BX = 0x7E00)
movw $0x200, %bx
movb $0x2, %ah
movb $0x2, %al
movb $0x0, %ch
movb $0x3, %cl
movb $0x0, %dh
movb $0x80, %dl
int $0x13
jc ERROR
ljmp $0x7e0, $0x0
ERROR:
jmp .
.org 0x1BE, 0x0
.byte 0x80
.byte 0x0
.byte 0x0
.byte 0x0
.byte 0x83
.byte 0
.byte 0
.byte 0
.long 2
.long 122878
.org 0x1FE, 0x0
.byte 0x55
.byte 0xAA
我們在之後的東西就預計把我們當時製作的Ext2檔案系統刪除,改利用程式生成了。 不過我們必須自己寫一段硬碟的分割MBR。我們就預計之前的檔案就直接當作第一個分割區了。其實我們以前的檔案也有修改一下下,主要就是要把記憶體改變,因為我們改讀取到0x7E00了。目前的程式碼:https://github.com/TNPLR/nos/tree/0.8.2
在QEMU測試的畫面:
👉【幫我們一個忙!】👈
👋如果您喜歡這篇文章,請在下方按5個Like!
❤您的支持是我們最大的動力!
您只要登入帳號(Facebook、Google),在下方按5個Like,我們就會收到來自LikeCoin基金會的贊助。
您只需要支持我們,完全不會花到錢!