视频模式选择支持 2.13

版权:

© 1995--1999 Martin Mares, <mj@ucw.cz>

简介

这篇小文档描述了“视频模式选择”功能,该功能允许使用视频 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)

如果您将 0x8000 添加到模式 ID,该程序将尝试根据模式参数重新计算垂直显示时序,这可以用于消除某些 VGA BIOS(通常用于具有 S3 芯片组和旧 Cirrus Logic BIOS 的卡)的某些烦人的错误,主要是显示末尾的额外行。

选项

arch/x86/boot/* 的构建选项由内核 kconfig 实用程序和内核 .config 文件选择。

VIDEO_GFX_HACK - 包括用于设置图形模式的特殊技巧,供特殊驱动程序以后使用。允许设置 _任何_ BIOS 模式,包括图形模式,并强制执行特定的文本屏幕分辨率,而不是从 BIOS 变量中窥探它。除非您认为自己知道自己在做什么,否则请不要使用。要激活此设置,请使用模式编号 0x0f08(请参见上面的模式 ID 部分)。

仍然不起作用?

当模式检测不起作用时(例如,模式列表不正确或机器挂起而不是显示菜单),请尝试关闭 “选项” 下列出的一些配置选项。如果失败,您仍然可以使用内核,并通过内核参数直接设置视频模式。

无论哪种情况,请给我发送一份错误报告,其中包含 _确切地_ 发生了什么以及配置开关如何影响该错误的表现。

如果您从 M$-DOS 启动 Linux,您还可以使用一些用于视频模式设置的 DOS 工具。在这种情况下,您必须为 Linux 指定 0x0f04 模式(“保留当前设置”),因为如果您不这样做并且使用了任何非标准模式,Linux 将自动切换到 80x25。

如果您设置了一些扩展模式,并且显示器底部有一行或多行额外的行,其中包含已经滚动出来的文本,则您的 VGA BIOS 包含最常见的视频 BIOS 错误,称为 “不正确的垂直显示结束设置”。将 0x8000 添加到模式 ID 可能会解决此问题。不幸的是,这必须手动完成 - 没有可用的自动检测机制。

历史

1.0 (??-11月-95)

支持旧 setup.S + Cirrus Logic 54XX 支持的所有适配器的第一个版本。出现在一些 1.3.4?内核中,然后由于某些机器上的不稳定性而被删除。

2.0 (28-1月-96)

从头开始重写。添加了 Cirrus Logic 64XX 支持,几乎所有内容都是可配置的,VESA 支持应该更加稳定,允许显式模式编号,实现了 “scan” 等。

2.1 (30-1月-96)

VESA 模式移至 0x200-0x3ff。支持按分辨率选择模式。修复了一些错误。VESA 模式的列出顺序优先于 SVGA 自动检测提供的模式,因为它们更可靠。CLGD 自动检测效果更好。启动时不再依赖 80x25 处于活动状态。修复了扫描。添加了 80x43(任何 VGA)。清理了代码。

2.2 (01-2月-96)

修复了 EGA 80x43。VESA 扩展到 0x200-0x4ff(现在可以使用非标准的 02XX VESA 模式)。支持显示结束错误解决方法。重新编号特殊模式以允许添加 “重新计算” 标志,0xffff 和 0xfffe 成为别名而不是真实的 ID。模式更改期间保留屏幕内容。

2.3 (15-3月-96)

已更改为与 1.3.74 内核一起使用。

2.4 (18-3月-96)

添加了 Hans Lermen 的补丁,修复了某些引导加载程序的内存覆盖问题。重写了内存管理以反映这些更改。不幸的是,现在只有某些加载程序才能保留屏幕内容。添加了 Tseng 132x60 模式。

2.5 (19-3月-96)

修复了 2.4 中引入的 VESA 模式扫描错误。

2.6 (25-3月-96)

一些 VESA BIOS 错误未报告 - 它修复了具有损坏的 VESA 代码的几张卡(例如,ATI VGA)上的错误报告。

2.7 (09-4月-96)

  • 接受了 0x100 到 0x7ff 范围内的所有 VESA 模式,因为某些显卡使用非常奇怪的模式编号。

  • 添加了 Realtek VGA 模式(感谢 Gonzalo Tornaria)。

  • 硬件测试顺序略有更改,基于 ROM 内容的测试先进行。

  • 添加了对特殊 Video7 模式切换功能的支持(感谢 Tom Vander Aa)。

  • 添加了 480 扫描线模式(尤其适用于笔记本电脑,原始版本由 hhanemaa@cs.ruu.nl 编写,由 Jeff Chua 修补,我进行了重写)。

  • 修复了屏幕存储/恢复问题。

2.8 (1996 年 4 月 14 日)

  • 之前的版本在没有 CONFIG_VIDEO_SVGA 的情况下无法编译。

  • 在模式扫描期间更好地识别文本模式。

2.9 (1996 年 5 月 12 日)

  • 忽略了 VESA 模式 0x80 - 0xff(更多 VESA BIOS 错误!)

2.10(1996 年 11 月 11 日)

  • 整个功能设置为可选。

  • 添加了 CONFIG_VIDEO_400_HACK 开关。

  • 添加了 CONFIG_VIDEO_GFX_HACK 开关。

  • 代码清理。

2.11(1997 年 5 月 3 日)

  • 又一次清理,现在也包括文档。

  • 默认情况下关闭了对 SVGA 适配器的直接测试,在提示符行显式提供了 scan

  • 删除了描述添加新的探测功能的文档部分,因为我尝试在这里摆脱_所有_硬件探测。

2.12(1998 年 5 月 25 日)

添加了对 VESA 帧缓冲图形的支持。

2.13(1999 年 5 月 14 日)

小文档修复。