跳轉到內容

Oberon/ETH Oberon/InitStrings

來自華夏公益教科書,開放的書籍,開放的世界
初始化配置字串

Q.: Init="b8024fbb1441cd10b8014fb91401cd10268b4d28268b552a" 這樣的行是什麼意思?這種行會在啟動初期與其他配置字串一起出現

A.: 其實並不難理解。這個字串是機器程式碼,它會在處理器從真實模式切換到保護模式、V86 模式或長模式之前被解釋。這是一種簡單直接的方法,透過設定暫存器、寫入低記憶體設定區域和進行 BIOS 呼叫來配置顯示器。

當系統安裝了 Oberon0 時,Config.Mod 會提供一個 Init 字串。然後,無論何時啟動系統,引導載入程式都會允許使用者更改該字串。

要理解一個特定的字串,可以使用反彙編器。然後,在 Google 上搜索以瞭解影片處理器是如何工作的。關於VESA 2.0VESA 3.0 的規格可以以 PDF 檔案的形式獲得。

從最簡單的例子開始,Init="b81200cd10"。以下三種方法可以反彙編 Init 字串。

1) 你可以線上使用這個基於 Web 的反彙編器:https://www.onlinedisassembler.com/odaweb/。在 "Arch" 中選擇 "i8086"(處理器處於真實模式),並將 Init 字串的十六進位制位元組貼上到平臺設定下面的視窗中。在右側找到反彙編程式碼。

.data:00000000 b81200      mov $0x12,%ax
.data:00000003 cd10        int $0x10

2) 我們需要一個包含這些位元組的 Init.o 檔案。一個顯而易見但效率不高的方法是使用 Edit 或 ET 在 Init.o 中放入任何 5 個字元。然後,使用 Hex.Open 開啟 Init.o,將這些字元替換為 B8 12 00 CD 10,並儲存。將 Init.o 移動到 Linux 系統。在那裡,應用 objdump。

objdump -b binary -m i8086 -D Init.o

Init.o:     file format binary

Disassembly of section .data:

0000000000000000 <.data>: 
  0:   b8 12 00                mov    $0x12,%ax 
  3:   cd 10                   int    $0x10

3) Kees C. 建議使用 libdisasm x86dis 工具。

$ echo -e '\xb8\x12\x00\xcd\x10' | x86dis -r 0 5 -s att 
00000000 B8 12 00             mov     $0x0012, %ax 
00000003 CD 10                int     $0x10

每種方法都可以應用於任何字串。

Init="b81200cd10"
機器程式碼 操作 運算元 解釋
b81200 mov $0x12,%ax 將 12h 放入暫存器 ax 中
cd10 int $0x10 根據 ax 的內容,[1] 影片 BIOS 中斷呼叫將設定 640 x 480 畫素 x 24 色。 [2]
Init="b8024fbb1441cd10b8014fb91401cd10268b4d28268b552a"
機器程式碼 操作 運算元 解釋
b8024f mov $0x4f02,%ax 將 4f02H 放入暫存器 ax 中。
bb1441 mov $0x4114,%bx 將 4114H 放入暫存器 bx 中。
cd10 int $0x10 對於 ax 和 bx 中的這些值,影片 BIOS 將設定 800 x 600 畫素 x ?? 色。
b8014f mov $0x4f01,%ax 將 4f01H 放入 ax 中。
b91401 mov $0x114,%cx 將 114H 放入 cx 中,表示 800 x 600 x 16 位顏色。
cd10 int $0x10 查詢影片模式。 [3] es:di 包含返回的資訊。 [4]
268b4d28 mov %es:0x28(%di),%cx rWinBAttrs[8] = 0 或 1,根據視窗 A 或 B 是否支援而定。
268b552a mov %es:0x2a(%di),%dx rWinBAttrs[a] = 1 或 0,根據視窗是否可寫而定。

參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書