[英]How to get VESA BIOS Information
我正在通過關於在Rust中編寫操作系統的Phil-Opp教程 ,並且在稍微玩了一下后,我想擺弄在屏幕上顯示真實圖形。
我已經想到我應該從使用線性幀緩沖器開始,使用VESA。 我在這里和這里找到了osdev.org上的一些教程,但他們繼續談論“功能代碼”和es:di
。 第二個鏈接說:
功能:獲取VESA BIOS信息
功能碼:0x4F00
說明:返回VESA BIOS信息,包括制造商,支持的模式,可用的視頻內存等...輸入:AX = 0x4F00
輸入:ES:DI =段:偏移指向存儲VESA BIOS信息結構的位置的指針。
輸出:成功時AX = 0x004F,其他值表示不支持VESA BIOS。
無論如何,上面的函數返回以下結構並將它存儲在ES:DI中,因為它們在輸入時。 在輸入時,ES:DI應包含指向以下結構的指針:
vbe_info_structure: .signature db "VBE2" ; indicate support for VBE 2.0+ .table_data: resb 512-4 ; reserve space for the table below
雖然我已經看了一些匯編語言教程,但我不知道“功能代碼”是什么。 根據我的理解,如果我移動mov ax, 0x4f00
,並創建一個類似上面的結構,它將神奇地覆蓋結構,然后我可以作為參數傳遞給我的Rust代碼? 我如何,或者我需要設置我的es:di
? (從研究開始,我認為它只是在現代處理器上自動設置)
我應該在Inline Assembly中完成所有這些工作嗎? 我應該只使用UEFI並重寫我的內核嗎? 如果您能舉例說明如何在Rust代碼中訪問vbe_info_structure(我在long mode
運行),我會很高興。
到目前為止,這是我的boot.asm
文件,但它還沒有工作: https : boot.asm
。 謝謝!
在boot.asm文件中,您有:
get_vesa_info:
mov ax, 0x4f00
mov [es:di], vbe_info_structure
int 0x10
ret
第三行必須替換為
mov di, vbe_info_structure
說明:就像現在一樣,它嘗試在es:di指向的地址處寫入常量vbe_info_structure(在您的情況下未定義)。 你想要的是將地址vbe_info_structure加載到di中,然后將其傳遞給int 0x10例程。
順便說一句,int 0x10執行幾個功能。 為了告訴你要調用哪一個,你傳遞ax寄存器中的“功能代碼”。 將功能代碼視為函數的名稱(程序集中沒有名稱,只有數字和地址)。
此外,您需要正確設置es。 要么這樣做
push ds
pop es
假設ds已經指向section.data,或者使用匯編程序指令( assume es section.data
? - 不確定這一點,自從我使用匯編程序以來已經很長時間了)。 或者像這樣:
mov ax, @section.data
mov es, ax
當然,應該在將0x4f00加載到ax之前完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.