视频模式选择支持 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,即使它未显示在菜单上,您也可以通过直接输入其模式来设置模式。

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 - 包括用于设置图形模式的特殊 hack,这些模式将在以后由特殊驱动程序使用。 允许设置_任何_ BIOS 模式,包括图形模式,并强制指定文本屏幕分辨率而不是从 BIOS 变量中窥视它。 除非您认为您知道自己在做什么,否则请勿使用。 要激活此设置,请使用模式编号 0x0f08(请参见上面的模式 ID 部分)。

仍然不起作用?

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

在任何一种情况下,请向我发送包含_确切_发生情况以及配置开关如何影响错误行为的错误报告。

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

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

历史

1.0 (??-Nov-95)

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

2.0 (28-Jan-96)

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

2.1 (30-Jan-96)

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

2.2 (01-Feb-96)

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

2.3 (15-Mar-96)

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

2.4 (18-Mar-96)

添加了 Hans Lermen 的补丁,修复了某些引导加载程序中的内存覆盖问题。 内存管理已重写以反映这些更改。 遗憾的是,现在只有部分加载程序可以使用屏幕内容保留功能。 添加了 Tseng 132x60 模式。

2.5 (19-Mar-96)

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

2.6 (25-Mar-96)

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

2.7 (09-Apr-96)

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

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

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

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

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

  • 屏幕存储/恢复已修复。

2.8 (14-Apr-96)

  • 如果没有 CONFIG_VIDEO_SVGA,则之前的版本无法编译。

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

2.9 (12-May-96)

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

2.10(11-Nov-96)

  • 整个事情都是可选的。

  • 添加了 CONFIG_VIDEO_400_HACK 开关。

  • 添加了 CONFIG_VIDEO_GFX_HACK 开关。

  • 代码清理。

2.11(03-May-97)

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

  • 默认情况下,直接测试 SVGA 适配器已关闭,在提示行上明确提供了 scan

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

2.12(25-May-98)

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

2.13(14-May-99)

较小的文档修复。