簡體   English   中英

組裝-讀取虛擬磁盤的下一個扇區

[英]Assembly - Read next sector of a virtual disk

作為世界上任何一個程序員,至少有一次他/她一生都在嘗試創建自己的“革命性”,新的,唯一的操作系統。 :D

好吧,我正在使用一個虛擬仿真器(Oracle VM Virtual Box),為此我創建了一個帶有vmdk磁盤的新的unknwon操作系統。 我喜歡vmdk,因為它們只是純文件,因此我可以將引導加載程序粘貼到虛擬硬盤的前512個字節上。

現在,我嘗試讀取該虛擬磁盤的下一個扇區,在該扇區上粘貼一個簡單的內核,該內核將顯示一條消息。

我有兩個問題:

  • 我是否在正確讀取第二段(前-512字節-被引導程序占用)? 碼:

     ReadDisk: mov bx, 0x8000 ; segment mov es, bx mov bx, 0x0000 ; offset mov ah, 0x02 ; read function mov al, 0x01 ; sectors - this might be wrong, trying to read from hd mov ch, 0x00 ; cylinder mov cl, 0x02 ; sector mov dh, 0x00 ; head mov dl, 0x80 ; drive - trying to read from hd int 0x13 ; disk int jc ReadDisk jmp [es:bx] ; buffer 

    在這里,我檢查了CF后收到錯誤消息。 但是,如果我使用INT 13,則獲取最后的狀態消息時,AL為0-因此不會保存任何錯誤。

  • 我是否將我的簡單內核粘貼到了vmdk中的正確位置? 我要做的是將其粘貼在文件的第512個字節之后,正如我所說的,前512個字節是引導加載程序。 該文件如下所示:

     BE 45 7C E8 16 00 EB FE B4 0E B7 00 B3 07 CD 10 <- First sector C3 AC 08 C0 74 05 E8 EF FF EB F6 C3 B4 00 B2 80 CD 13 BE 5D 7C 72 F5 BB 00 80 8E C3 BB 00 00 B4 02 B0 06 B5 00 B1 01 B6 00 B2 07 CD 13 BE 4E 7C 72 CF 26 FF 27 57 65 6C 63 6F 6D 65 21 00 52 65 61 64 69 6E 67 20 65 72 72 6F 72 21 00 52 65 73 65 74 74 69 6E 67 20 65 72 72 6F 72 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA <- Boot-loader signature B4 0E B0 2E CD 10 EB FE 00 00 00 00 00 00 00 00 <- Start of the second sector 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

因此,這就是我嘗試將內核添加到第二個扇區的方法。 您認為這有什么問題? 謝謝!

更新

好的,我現在沒有任何錯誤,但是看不到正在執行的已加載代碼。 它應該在窗口上顯示一個點:

;--------------------------------------------
; 'load.asm'
; loaded from 'boot.asm'

[org 0x8000]
[bits 16]

;--------------------------------------------

main:
mov ah, 0x0E  ; print function
mov al, '.'   ; ascii char
int 0x10   ; IO int

jmp $    ; hang

一個問題在這里:

jmp [es:bx]

這實際上將從位於寄存器es (段部分)和bx (偏移部分)中的地址的內存位置讀取一個地址,即16位偏移,然后將ip設置為該16位偏移。

您可能要使用的是:

jmp some_constant1:some_constant2

這會將cs設置為some_constant1 ,將ipsome_constant2 毫不奇怪,這兩個常量的分別為0x8000和0,因為這是加載代碼的位置。

現在,第二個問題在這里:

[org 0x8000]

org告訴NASM以這樣的方式生成代碼:如果將其加載到偏移量0x8000,它將可以工作。 現在,偏移量0x8000與段0x8000不同。 如果使用jmp 0x8000:0 ,則還應該使用:

[org 0]

失敗后再試一次。 我認為當磁盤旋轉時,您會收到一條錯誤消息,沒有任何消息,因此模擬器可能有意第一次失敗。 在bochs和qemu中,四次嘗試都對我有效,但是我沒有在其他任何方面嘗試過。 您可能還想在讀取之前重置驅動器控制器以清除以前的任何錯誤。 將中斷0x13使用al clear並將驅動器號輸入dl


注意:對驅動器號進行硬編碼可能暫時可以使用,但不能讓您支持從其他驅動器引導。 啟動引導加載程序時,BIOS應該將驅動器號保留在dl ,因此您可以保存該驅動器號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM