簡體   English   中英

VESA 圖形頁面在保護模式下翻轉

[英]VESA graphics page flipping in protected mode

我想弄清楚如何在 32 位保護模式下翻頁。 我運行0x4F0A並將輸出表存儲在0x00008100 設置 LFB 位置的命令應該位於0x00008102是否0x00008102 知道這是該命令的位置,我如何在不返回實模式的情況下更改 c 中 LFB 的位置?

void main() {
    char vmem_back_buffer0[3932160];
    char vmem_back_buffer1[3932160];
    char* prot_mode_desc  = (char*)0x00008102;

    /* ... code to file those buffers with data is removed for brevity ... */

    // Here I change the LFB location to vmem_back_buffer0
    // Here I change the LFB location to vmem_back_buffer1

    while (TRUE);
}

我想弄清楚如何在 32 位保護模式下翻頁。 我運行 0x4F0A 並將輸出表存儲在 0x00008100。 設置 LFB 位置的命令應該位於 0x00008102 是否正確?

0x00008102 處的 16 位值可能包含“設置/獲取顯示開始”功能的偏移量(在 VBE 的代碼段中)。 如果是這樣,您需要在 GDT 中設置各種描述符(例如“VBE 的 32 位代碼段”、“VBE 的數據段”)並使用 32 位遠調用來加載帶有“32- VBE 的位代碼段”,同時在您使用任何 VBE 加載 DS 和/或 ES 后,還加載帶有(零擴展到 32 位)“值在 0x00008102”的 EIP。

然而; 對於 VBE 3.0(最新版本和最有可能用於 20 年以上計算機的 VBE 版本)該功能是可選的,可能不存在。 反而; VBE 3.0 增加了“VBE 3.0 保護模式接口”(保護模式的 16 位代碼,允許視頻 ROM 回收現有代碼,不用擔心 64 KiB ROM 的空間不足)。

當然,對於非常舊的顯卡(VBE 2.0 之前),“VBE 3.0 保護模式接口”將永遠不會存在。

這意味着要支持“所有 VBE”,您必須使用實模式、virtual8086 模式或 VBE 1.2 及更早版本的解釋器; 並且可以對 VBE 2.0 和 VBE 3.0 使用相同的“實模式、virtual8086 模式或解釋器”(以避免處理“VBE 2.0 保護模式接口”和“VBE 3.0 保護模式接口”的額外麻煩)。

還有其他問題; 主要是VBE不提供任何“垂直同步IRQ”,如果你使用“設置垂直同步顯示開始”選項(在VBE的“設置/獲取顯示開始”功能中)它會浪費大量的CPU時間輪詢檢測垂直同步是否/何時開始,如果你不這樣做,你最終會撕裂(避免撕裂是首先進行“翻頁”的重點)。 可以通過使用計時器來模擬“垂直同步上的 IRQ”來解決這個問題(具體來說,當計時器到期時調用“設置/獲取顯示開始”,然后使用“設置/獲取顯示開始”需要多長時間才能返回到調整下一次計時器何時到期,以便您知道計時器將在垂直同步發生之前到期)。

另一個需要擔心的是 VBE 代碼中的錯誤。 一般來說,經常使用的代碼(例如設置視頻模式)經過更嚴格的測試並且不太可能有錯誤,而很少使用的代碼(例如設置顯示開始)更有可能有錯誤(和崩潰,並破壞一切) . 我不確定,但我認為可以通過將 VBE 的代碼(通過“VBE 保護模式接口”執行)隔離在“CPL=3 沙箱”(如進程)中來減輕一些風險。

當然,對於現代計算機(使用 UEFI)來說,VBE 本身根本不存在; 並且 UEFI 不提供任何替代方法來進行翻頁。 這意味着(如果您使用 VBE 和翻頁)將很難將操作系統移植到以后仍然相關的硬件上。

由於所有這些原因; 最好使用“引導加載程序使用固件提供的任何內容設置幀緩沖區,內核/操作系統僅使用幀緩沖區而不使用其他任何內容(直到/除非它啟動本機視頻驅動程序)”; 並避免為(充其量)無法正常工作的事情進行大量工作。

知道這是該命令的位置,我如何在不返回實模式的情況下更改 c 中 LFB 的位置?

大多數 C 編譯器不支持分段; 這意味着您必須使用匯編語言存根來加載 VBE 的段(包括加載 VBE 代碼段的“遠調用”),然后恢復正常的段。

您還需要擔心如果在 VBE 的代碼運行時發生 IRQ 會發生什么。 你真的不想禁用 IRQ(因為不能保證 VBE 的功能會很快,也不能保證在 VBE 的代碼運行時禁用 IRQ 不會破壞所有設備驅動程序的 IRQ 延遲,特別是對於“浪費批次”等待垂直同步時的 CPU 時間”情況); 所以所有的中斷處理程序都希望能夠處理中斷 VBE 的代碼。

除此之外; 您可以將“顯示開始”視為發送到顯示器的第一個像素所在的 LFB 中的偏移量(請注意,“顯示開始”也可用於平滑滾動 - 例如,僅將“顯示開始”移動一行像素一次垂直滾動一個像素)。 您還需要一些保護措施(例如,如果 LFB 不足以容納 2 幀,則回退到“不翻頁”,基於 VBE 的“Return”返回的結構的“TotalMemory(64 KiB 塊)”字段控制器信息”以及從 VBE 的“獲取模式信息”返回的結構中獲取的垂直分辨率和“bytesPerLine”)。

暫無
暫無

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

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