簡體   English   中英

如何獲取VESA BIOS信息

[英]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文件,但它還沒有工作: httpsboot.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.

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