跳转到内容

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,根据窗口是否可写而定。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书