4. 在 x86 平台上使用帧缓冲设备

4.1. 什么是 vesafb?

Vesafb 是一个用于 x86 架构的帧缓冲驱动程序,它与 VESA 2.0 兼容的显卡配合工作。它与内核中的帧缓冲设备驱动程序密切相关。

vesafb 是一个显示驱动程序,可以在您的 x86 平台上为位图文本控制台启用图形模式。它还可以显示徽标,这可能是您想要使用 vesafb 的主要原因 :o)

遗憾的是,您无法在 VESA 1.2 显卡上成功使用 vesafb。这是因为这些 1.2 显卡不使用线性帧缓冲。线性帧缓冲简单来说意味着系统的 CPU 能够访问显示的每一个位。从历史上看,较旧的图形适配器只能一次访问 64K,因此限制了可怕的 CGA/EGA 图形模式!可能有人会为这些显卡编写 vesafb12 设备驱动程序,但这会占用宝贵的内核内存并涉及令人讨厌的 hack。

但是,有一种潜在的解决方法可以为您的旧版 VESA 1.2 显卡添加 VESA 2.0 扩展。您或许可以下载一个 TSR 类型程序,该程序可以从 DOS 运行,并与 loadlin 一起使用,可以帮助配置显卡以适应适当的图形控制台模式。请注意,这并非总是有效,例如,某些 Cirrus Logic 显卡(例如 VLB 54xx 系列)被映射到一系列内存地址(例如,在 15MB-16MB 范围内)以进行帧缓冲,这使得它们无法在内存超过 32MB 的系统上成功使用。有一种方法可以使其工作,即,如果您有一个 BIOS 选项可以在 15MB-16MB 范围内留下一个内存空洞,它可能会工作,但 Linux 不支持使用内存空洞。但是,有一些针对此选项的补丁 [谁有这些补丁,从哪里可以获得?]。如果您希望尝试此选项,则有很多 TSR 样式程序可用,一个主要的例子是 UNIVBE,可以在互联网上找到。

或者,您或许可以下载内核补丁,以允许您的 VESA 1.2 显卡与 VESA 帧缓冲驱动程序一起工作。例如,有一些补丁可用于较旧的 S3 板(例如 S3 Trio、S3 Virge),这些板支持 VESA 1.2。对于这些显卡,您可以从 ftp://ccssu.crimea.ua/pub/linux/kernel/v2.2/unofficial/s3new.diff.gz 获取补丁。

4.2. 如何激活 vesafb 驱动程序?

假设您正在使用 menuconfig,您需要执行以下步骤

如果您的处理器(在 x86 平台上)支持 MTRR,请启用此功能。它可以加快处理器和显卡之间的内存复制速度,但并非绝对必要。当然,您可以在控制台设备工作后执行此操作。

重要提示:对于 2.1.x 内核,请进入“Code Maturity Level”菜单,并启用“prompt for development and / or incomplete drivers”(提示开发和/或不完整的驱动程序)。对于 2.2.x 内核,不再需要这样做。

进入“Console Drivers”菜单,并启用以下选项

VGA 芯片组支持(仅文本)- vgafb - 曾经是上面列表的一部分,但它已被删除,因为它现在已弃用且不再受支持。它将很快被删除。请改用 VGA 文本控制台 (fbcon)。VGA 字符/属性仅与 VGA 芯片组支持一起使用,无需选择。

确保未启用 Mac 变量 bpp 打包像素支持。Linux 内核版本 2.1.111(和 112)似乎在首次选择“高级底层驱动程序”时会自动启用此功能。2.1.113 不再发生这种情况。

还可以选择将字体编译到内存中,但这并非真正必要,您始终可以使用 kbd-0.99 的(请参阅字体部分)setfont 实用程序,通过将字体加载到控制台设备中来更改字体。

确保这些不是要构建为模块。[不确定是否可以将它们构建为模块 - 请纠正我]

您需要在 /dev 中创建帧缓冲设备。每个帧缓冲设备都需要一个,因此您只需键入 mknod /dev/fb0 c 29 0 即可创建第一个。后续设备将以 32 的倍数递增,因此例如要创建 /dev/fb1,您需要键入 mknod /dev/fb1 c 29 32,依此类推,直到第八个帧缓冲设备 (mknod /dev/fb7 c 29 224)

然后重新构建内核,修改 /etc/lilo.conf 以包含 VGA=ASK 参数,并运行 lilo,这是为了让您能够选择您希望使用的模式。

这是一个 LILO 配置示例(取自我的机器)

# LILO 配置文件 boot = /dev/hda3 delay = 30 prompt vga = ASK # 让用户输入所需的模式 image = /vmlinuz root = /dev/hda3 label = Linux read-only # 非 UMSDOS 文件系统应以只读方式挂载以进行检查

重新启动内核,作为一个简单的测试,尝试在 VGA 提示符下输入 0301(这将为您提供 640x480 @ 256),您应该能够看到一个可爱的小企鹅徽标。

请注意,在 VGA 提示符下,您需要以“0”加上三位数字的格式输入数字,并省略 'x'。如果您使用 LILO,则不需要这样做。

一旦您看到它运行良好,您就可以探索各种 VESA 模式(见下文),并决定您最喜欢哪一种,并将该模式硬编码到 lilo.conf 中的“VGA=x”参数中。当您选择最喜欢的模式后,从下表查找等效的十六进制数字并使用它(即,对于 1280x1024 @ 256,您只需使用“VGA=0x307”),然后重新运行 lilo。这就是全部内容。有关更多参考,请阅读 LoadLin/LILO HOWTO。

注意! vesafb 默认不启用回滚缓冲。您需要将选项传递给内核才能启用它。使用 video=vesa:ypan 或 video=vesa:ywrap 来激活它。两者都做同样的事情,但方式不同。ywrap 比 ypan 快得多,但可能不适用于略微损坏的 VESA 2.0 显卡。ypan 比 ywrap 慢,但兼容性更高。此选项仅在内核 2.1.116 及更高版本中存在。较早的内核不具备在 vesafb 中允许回滚缓冲的功能。

4.3. 我可以使用哪些 VESA 模式?

这实际上取决于您的系统中安装的 VESA 2.0 兼容显卡的类型以及可用的显存量。这只是测试哪些模式最适合您的显卡的问题。

下表显示了您可以在 VGA 提示符下输入或与 LILO 程序一起使用的模式编号。(实际上,这些数字加上了 0x200,以便更容易参考该表)

表 1. VESA 模式

深度640x400640x480800x6001024x7681152x8641280x10241600x1200
4 位??0x302????
8 位0x3000x3010x3030x3050x1610x3070x31C
15 位?0x3100x3130x3160x1620x3190x31D
16 位?0x3110x3140x3170x1630x31A0x31E
24 位?0x3120x3150x318?0x31B0x31F
32 位????0x164??

键:8 位 = 256 色,15 位 = 32,768 色,16 位 = 65,536 色,24 位 = 1680 万色,32 位 - 与 24 位相同,但额外的 8 位可用于其他用途,并且完美适合 32 位 PCI/VLB/EISA 总线。

其他模式由制造商自行决定,因为 VESA 2.0 文档仅定义了高达 0x31F 的模式。您可能需要进行一些调整才能找到这些额外的模式。

4.4. 拥有 Matrox 显卡?

如果您拥有 Matrox 显卡,实际上您不需要 vesafb,您需要 matroxfb 驱动程序。这将大大增强您显卡的功能。Matroxfb 适用于 Matrox Mystique Millennium I & II、G100 和 G200。它还支持多头系统(也就是说,如果您的机器中有两张 Matrox 显卡,您可以在同一台机器上使用两个显示器!)。要配置 Matrox,您需要执行以下操作

您可能需要首先升级 Matrox BIOS,您可以从 http://www.matrox.com/mgaweb/drivers/ftp_bios.htm 下载 BIOS 升级程序。请注意,您需要 DOS 才能执行此操作。

进入“Code Maturity Level”菜单,并启用“prompt for development and/or incomplete drivers”(提示开发和/或不完整的驱动程序)[请注意,这在未来的内核中可能会发生变化 - 当这种情况发生时,本 HOWTO 将会修订]

进入“Console Drivers”菜单,并启用以下选项

重新构建您的内核。然后,您需要修改您的 lilo.conf 文件以启用 Matroxfb 设备。最快和最简单的方法是重新使用我的配置。

# LILO 配置文件 boot = /dev/hda3 delay = 30 prompt vga = 792 # 您需要这样做,以便它以正常状态启动 # Linux 可启动分区配置开始 image = /vmlinuz append = "video=matrox:vesa:440" # 然后切换到 Matroxfb root = /dev/hda3 label = Linux read-only # 非 UMSDOS 文件系统应以只读方式挂载以进行检查

最后,您需要在 /dev 中创建帧缓冲设备。每个帧缓冲设备都需要一个,因此您只需键入 mknod /dev/fb0 c 29 0 即可创建第一个。后续设备将以 32 的倍数递增,因此例如要创建 /dev/fb1,您需要键入 mknod /dev/fb1 c 29 32,依此类推,直到第八个帧缓冲设备 (mknod /dev/fb7 c 29 224i)

应该就是这样了![注意:是否有任何人正在使用此多头支持,请尽快与我联系 - 我需要与您讨论它,以便我可以记录它!

4.5. 拥有 Permedia 显卡?

Permedia 显卡不能与 vesafb 驱动程序一起使用,但幸运的是,可以使用 Permedia 帧缓冲驱动程序。假设您正在使用 menuconfig,请执行以下操作

进入“Code Maturity Level”菜单,并启用“prompt for development and/or incomplete drivers”(提示开发和/或不完整的驱动程序)[请注意,这在未来的内核中可能会发生变化 - 当这种情况发生时,本 HOWTO 将会修订]

进入“Console Drivers”菜单并选择以下选项

重新构建您的内核。然后,您需要修改您的 lilo.conf 文件以启用 pm2fb 设备。最快和最简单的方法是重新使用以下配置

# LILO 配置文件 boot = /dev/hda3 delay = 30 prompt vga = 792 # 您需要这样做,以便它以正常状态启动 # Linux 可启动分区配置开始 image = /vmlinuz append = "video=pm2fb:mode:1024x768-75,font:SUN12x22,ypan" # 然后切换到 pm2fb root = /dev/hda3 label = Linux read-only # 非 UMSDOS 文件系统应以只读方式挂载以进行检查

行 "pm2fb:mode:1024x768-75,font:SUN12x22,ypan" 表示您正在选择 1024x768 模式,频率为 75Hz,并选择了 SUN12x22 字体(如果您选择了它),包括 ypan 以获得回滚支持。您可以根据需要选择其他模式。

最后,您需要在 /dev 中创建帧缓冲设备。每个帧缓冲设备都需要一个,因此您只需键入 mknod /dev/fb0 c 29 0 即可创建第一个。后续设备将以 32 的倍数递增,因此例如要创建 /dev/fb1,您需要键入 mknod /dev/fb1 c 29 32,依此类推,直到第八个帧缓冲设备 (mknod /dev/fb7 c 29 224)

有关 Permedia 帧缓冲驱动程序的其他功能的更多信息,请将您的浏览器指向 http://www.cs.unibo.it/~nardinoc/pm2fb/index.html

video=pm2fb:[选项[,选项[,选项...]]]

其中选项是以下之一

4.6. 拥有 ATI 显卡?

[注意:此信息充其量只是二手或三手信息,因为我没有 ATI 显卡来测试它。如果我错了,请随时纠正我或喷我!] 8)

ATI 显卡可以与 vesafb 驱动程序一起使用,但您可能会遇到问题,也可能不会遇到问题,这取决于显卡的损坏程度。幸运的是,可以使用 atyfb 帧缓冲驱动程序。假设您正在使用 menuconfig,请执行以下操作

进入“Code Maturity Level”菜单,并启用“prompt for development and/or incomplete drivers”(提示开发和/或不完整的驱动程序)[请注意,这在未来的内核中可能会发生变化 - 当这种情况发生时,本 HOWTO 将会修订]

进入“Console Drivers”菜单并选择以下选项

重新构建您的内核。然后,您需要修改您的 lilo.conf 文件以启用 atyfb 设备。最快和最简单的方法是重新使用以下配置

# LILO 配置文件 boot = /dev/hda3 delay = 30 prompt vga = 792 # 您需要这样做,以便它以正常状态启动 # Linux 可启动分区配置开始 image = /vmlinuz append = "video=atyfb:mode:1024x768,font:SUN12x22" root = /dev/hda3 label = Linux read-only # 非 UMSDOS 文件系统应以只读方式挂载以进行检查

行 "atyfb:mode:1024x768,font:SUN12x22" 表示您正在选择 1024x768 模式。

最后,您需要在 /dev 中创建帧缓冲设备。每个帧缓冲设备都需要一个,因此您只需键入 mknod /dev/fb0 c 29 0 即可创建第一个。后续设备将以 32 的倍数递增,因此例如要创建 /dev/fb1,您需要键入 mknod /dev/fb1 c 29 32,依此类推,直到第八个帧缓冲设备 (mknod /dev/fb7 c 29 224)

video=atyfb:[选项[,选项[,选项...]]]

其中选项是以下之一

4.7. 哪些显卡与 VESA 2.0 兼容?

以下列出了已知可与 vesafb 设备驱动程序一起工作的所有图形设备

以下列表列出了与 vesafb 设备不兼容的显卡

4.8. 我可以将 vesafb 编译为模块吗?

据目前所知,vesafb 无法模块化,尽管在某个时候,vesafb 的开发者可能会决定修改源代码以进行模块化。请注意,即使模块化是可能的,在启动时,您也无法在显示器上看到任何输出,直到 modprobe vesafb。在出现启动问题的情况下,将其保留在内核中可能更明智。

4.9. 如何修改光标

感谢 Martin Mares,摘自他的 VGA-softcursor.txt 文档。

Linux 现在具有一些操作光标外观的能力。通常,您可以设置硬件光标的大小(并解决那些可怜的 Trident 显卡中的一些难看的错误 - 请参阅 drivers/char/vga.c 中的 #define TRIDENT_GLITCH)。如果您在系统配置中启用“软件生成的光标”,您可以玩一些新技巧:您可以使您的光标看起来像一个不闪烁的红色块,使其成为它所在字符的背景反色,或者突出显示该字符,并且仍然可以选择是否保持原始硬件光标可见。可能还有其他我从未想过的事情。

光标外观由 <ESC>[?1;2;3c 转义序列控制,其中 1、2 和 3 是下面描述的参数。如果您省略任何参数,它们将默认为零。

参数 1 指定光标大小(0 = 默认,1 = 不可见,2 = 下划线,...,8 = 完整块)+ 16 如果您希望应用软件光标 + 32 如果您希望始终更改背景颜色 + 64 如果您不喜欢背景与前景相同。最后两个标志忽略高亮显示。

第二个参数选择您要更改的字符属性位(只需将它们与此参数的值进行 XOR 运算即可)。在标准 VGA 上,高四位指定背景,低四位指定前景。在两组中,低三位设置颜色(与控制台使用的正常颜色代码一样),最高有效位打开高亮显示(或有时闪烁 - 这取决于您的 VGA 配置)。

第三个参数由您要设置的字符属性位组成。位设置发生在位切换之前,因此您可以通过在设置掩码和切换掩码中都包含一个位来简单地清除该位。