视频模式选择支持 2.13¶
- 版权:
© 1995--1999 Martin Mares, <mj@ucw.cz>
简介¶
这个简短的文档描述了“视频模式选择”(Video Mode Selection)功能,该功能允许使用视频 BIOS 支持的各种特殊视频模式。由于使用了 BIOS,该选择受限于引导阶段(内核解压开始之前),并且仅适用于通过 BIOS 固件引导的 80X86 机器(而不是通过 UEFI、kexec 等引导的机器)。
注意
给急性子的简短介绍:首次使用时只需使用 vga=ask,在视频模式提示符下输入 scan,选择你要使用的模式,记住其模式 ID(四位十六进制数),然后将 vga 参数设置为该数字(需先转换为十进制)。
要使用的视频模式由内核参数选择,该参数可以在内核 Makefile 中指定(SVGA_MODE=... 行),或者通过 LILO(或其他你使用的引导加载程序)的“vga=...”选项指定,或者通过“xrandr”工具(存在于标准 Linux 工具包中)指定。你可以使用该参数的以下值
NORMAL_VGA - Standard 80x25 mode available on all display adapters.
EXTENDED_VGA - Standard 8-pixel font mode: 80x43 on EGA, 80x50 on VGA.
ASK_VGA - Display a video mode menu upon startup (see below).
0..35 - Menu item number (when you have used the menu to view the list of
modes available on your adapter, you can specify the menu item you want
to use). 0..9 correspond to "0".."9", 10..35 to "a".."z". Warning: the
mode list displayed may vary as the kernel version changes, because the
modes are listed in a "first detected -- first displayed" manner. It's
better to use absolute mode numbers instead.
0x.... - Hexadecimal video mode ID (also displayed on the menu, see below
for exact meaning of the ID). Warning: LILO doesn't support
hexadecimal numbers -- you have to convert it to decimal manually.
模式 ID¶
由于所有视频内容的复杂性,这里使用的视频模式 ID 也稍微有些复杂。视频模式 ID 是一个 16 位数字,通常用十六进制表示(以“0x”开头)。如果你知道某个模式,即使它没有显示在菜单上,也可以通过直接输入其模式来进行设置。
ID 编号可以划分为以下区域
0x0000 to 0x00ff - menu item references. 0x0000 is the first item. Don't use
outside the menu as this can change from boot to boot (especially if you
have used the ``scan`` feature).
0x0100 to 0x017f - standard BIOS modes. The ID is a BIOS video mode number
(as presented to INT 10, function 00) increased by 0x0100.
0x0200 to 0x08ff - VESA BIOS modes. The ID is a VESA mode ID increased by
0x0100. All VESA modes should be autodetected and shown on the menu.
0x0900 to 0x09ff - Video7 special modes. Set by calling INT 0x10, AX=0x6f05.
(Usually 940=80x43, 941=132x25, 942=132x44, 943=80x60, 944=100x60,
945=132x28 for the standard Video7 BIOS)
0x0f00 to 0x0fff - special modes (they are set by various tricks -- usually
by modifying one of the standard modes). Currently available:
0x0f00 standard 80x25, don't reset mode if already set (=FFFF)
0x0f01 standard with 8-point font: 80x43 on EGA, 80x50 on VGA
0x0f02 VGA 80x43 (VGA switched to 350 scanlines with a 8-point font)
0x0f03 VGA 80x28 (standard VGA scans, but 14-point font)
0x0f04 leave current video mode
0x0f05 VGA 80x30 (480 scans, 16-point font)
0x0f06 VGA 80x34 (480 scans, 14-point font)
0x0f07 VGA 80x60 (480 scans, 8-point font)
0x0f08 Graphics hack (see the VIDEO_GFX_HACK paragraph below)
0x1000 to 0x7fff - modes specified by resolution. The code has a "0xRRCC"
form where RR is a number of rows and CC is a number of columns.
E.g., 0x1950 corresponds to a 80x25 mode, 0x2b84 to 132x43 etc.
This is the only fully portable way to refer to a non-standard mode,
but it relies on the mode being found and displayed on the menu
(remember that mode scanning is not done automatically).
0xff00 to 0xffff - aliases for backward compatibility:
0xffff equivalent to 0x0f00 (standard 80x25)
0xfffe equivalent to 0x0f01 (EGA 80x43 or VGA 80x50)
如果你在模式 ID 上加上 0x8000,程序将尝试根据模式参数重新计算垂直显示时序,这可用于消除某些 VGA BIOS 的一些烦人漏洞(通常是用于带有 S3 芯片组的显卡和旧 Cirrus Logic BIOS 的漏洞)——主要是显示器末尾的额外行。
选项¶
arch/x86/boot/* 的构建选项由内核 kconfig 工具和内核 .config 文件选择。
VIDEO_GFX_HACK - 包含用于设置图形模式的特殊修改,以便稍后供特殊驱动程序使用。允许设置_任何_ BIOS 模式(包括图形模式),并强制指定特定的文本屏幕分辨率,而不是从 BIOS 变量中获取。除非你认为你知道自己在做什么,否则请勿使用。要激活此设置,请使用模式编号 0x0f08(请参阅上面的“模式 ID”一节)。
仍然无法工作?¶
当模式检测不工作时(例如,模式列表不正确或机器挂起而不是显示菜单),尝试关闭“Options”下列出的一些配置选项。如果仍然失败,你仍然可以通过内核参数直接设置视频模式来使用内核。
无论哪种情况,请向我发送一份错误报告,其中包含_确切_发生了什么以及配置开关如何影响该错误的表现。
如果你从 M$-DOS 启动 Linux,你可能还会使用一些 DOS 工具来进行视频模式设置。在这种情况下,你必须向 Linux 指定 0x0f04 模式(“保留当前设置”),因为如果不这样做并且使用了任何非标准模式,Linux 将自动切换到 80x25。
如果你设置了某种扩展模式,并且显示屏底部有一行或多行包含已经滚动出屏幕的文本的额外行,则你的 VGA BIOS 包含最常见的视频 BIOS 漏洞,称为“不正确的垂直显示结束设置”。在模式 ID 中加上 0x8000 可能会解决该问题。不幸的是,这必须手动完成——没有可用的自动检测机制。
历史记录¶
1.0 (1995年11月??日) |
支持旧的 setup.S + Cirrus Logic 54XX 所支持的所有适配器的第一个版本。存在于某些 1.3.4? 内核中,随后由于在某些机器上不稳定而被移除。 |
2.0 (1996年1月28日) |
从头重写。添加了对 Cirrus Logic 64XX 的支持,几乎所有内容都是可配置的,VESA 支持应该更加稳定,允许显式模式编号,实现了“scan”等。 |
2.1 (1996年1月30日) |
VESA 模式移至 0x200-0x3ff。支持按分辨率选择模式。修复了一些错误。由于 VESA 模式更可靠,因此它们列在 SVGA 自动检测提供的模式之前。CLGD 自动检测工作得更好。启动时不依赖于 80x25 处于活动状态。修复了扫描。添加了 80x43(任何 VGA)。清理了代码。 |
2.2 (1996年2月1日) |
修复了 EGA 80x43。VESA 扩展到 0x200-0x4ff(非标准 02XX VESA 模式现在可以工作了)。支持显示结束漏洞的变通方法。重新给特殊模式编号以允许添加“recalculate”标志,0xffff 和 0xfffe 变成了别名而不是真实 ID。在模式更改期间保留屏幕内容。 |
2.3 (1996年3月15日) |
修改为可与 1.3.74 内核协同工作。 |
2.4 (1996年3月18日) |
添加了 Hans Lermen 的补丁,修复了某些引导加载程序的内存覆盖问题。重写了内存管理以反映这些更改。不幸的是,现在屏幕内容保留功能仅对某些加载程序有效。添加了 Tseng 132x60 模式。 |
2.5 (1996年3月19日) |
修复了在 2.4 中引入的 VESA 模式扫描错误。 |
2.6 (1996年3月25日) |
不再报告某些 VESA BIOS 错误——这修复了带有损坏的 VESA 代码的几款显卡(例如 ATI VGA)上的错误报告。 |
2.7 (1996年4月9日) |
|
2.8 (1996年4月14日) |
|
2.9 (1996年5月12日) |
|
2.10(1996年11月11日) |
|
2.11(1997年5月3日) |
|
2.12(1998年5月25日) |
添加了对 VESA 帧缓冲图形的支持。 |
2.13(1999年5月14日) |
文档微调。 |