Uvesafb (简体中文) - ArchWiki

# Uvesafb (简体中文)

Related articles

- Kernel modules
- Kernel parameters
- sysctl

翻译状态： 本文是英文页面 Uvesafb 的翻译，最后翻译时间：2015-02-28，点击这里可以查看翻译后英文页面的改动。

与其他 framebuffer 驱动不同，uvesafb 需要一个叫做 v86d 的用户空间虚拟化守护进程。在 x86 机器上模拟 x86 代码看起来很愚蠢，但若是想在其他架构上使用 framebuffer 代码这就显得很重要了 (尤其是非 x86 架构). 一个新的 framebuffer 驱动已添加到 2.6.24 版的内核中。它比标准的 vesafb 有更多的特性，包括:

1. 延迟后适当间隔和硬件悬停。
2. 支持自定义分辨率，就像使用系统 BIOS 一样。

vesafb 支持的硬件它应该都支持。

## 安装

从 AUR 安装 v86dAUR.

## 准备系统

记得从引导器配置中删除一切与 framebuffer 有关的内核启动参数以防止 vesafb framebuffer 加载。

    $ grep vga /proc/cmdline
    $ grep -ir vga /etc/modprobe.d/

应该不会返回错误。如果你在别处还有 `vga=` 选项，记得移除。

### GRUB

注意: 这可能不起作用。

编辑 `/etc/default/grub`, 注释掉 `GRUB_GFXPAYLOAD_LINUX=keep` 行。

然后用标准脚本生成 `grub.cfg`:

    # grub-mkconfig -o /boot/grub/grub.cfg

### GRUB legacy

从 `/boot/grub/menu.lst` 的 kernel 行移除所有对 `vga=xxx` 的引用以便 uvesafb 正常工作。

### Systemd

使用 systemd 的话，往 `/etc/mkinitcpio.conf` 的 HOOKS 部分添加 v86d. 这能让 uvesafb 在启动时接管工作。

    HOOKS="base udev v86d ..."

## 配置 uvesafb

### 规定分辨率

uvesafb 的配置在 `/usr/lib/modprobe.d/uvesafb.conf`:

    # This file sets the parameters for uvesafb module.
    # The following format should be used:
    # options uvesafb mode_option=<xres>x<yres>[-<bpp>][@<refresh>] scroll=<ywrap|ypan|redraw> ...
    #
    # For more details see:
    # http://www.kernel.org/doc/Documentation/fb/uvesafb.txt
    #
    options uvesafb mode_option=1280x800-32 scroll=ywrap

`mode_option` 的文献可见于 linux.git/tree/Documentation/fb/modedb.txt

为避免你的设置在升级时被覆盖，把下面的文件复制到 `/etc/modprobe.d/uvesafb.conf`:

    # cp /usr/lib/modprobe.d/uvesafb.conf /etc/modprobe.d/uvesafb.conf

然后往 `/etc/mkinitcpio.conf` 的 FILES 部分添加你的配置文件，比如:

    FILES="/etc/modprobe.d/uvesafb.conf"

为使变更生效，你需要重新生成 initramfs 镜像。

    # mkinitcpio -p linux

重启后变更生效。

### 调整分辨率

通过以下命令可得到可用分辨率:

    $ cat /sys/bus/platform/drivers/uvesafb/uvesafb.0/vbe_modes

可根据得到的条目来修改 `/usr/lib/modprobe.d/uvesafb.conf`.

### 检查当前分辨率

下面的任一命令都可以用来检查当前 framebuffer 分辨率:

    $ cat /sys/devices/virtual/graphics/fbcon/subsystem/fb0/virtual_size

    $ cat /sys/class/graphics/fb0/virtual_size

## Uvesafb 内核参数

如果你编译了个人定制内核，你也可以把 uvesafb 编译进内核，之后比如通过 `/etc/rc.local` 运行 v86d。这种情况下，该选项能够以 video=uvesafb:<options> 格式传递内核参数。请注意当你如下把 uvesafb 和 915resolution 结合起来时，这个方案是无效的。

## Uvesafb 和 915resolution

接下来我们要处理一个更复杂的情形。许多为笔记本设计的 Intel 图形芯片组被报告说有一个易出 bug 的 BIOS，它甚至无法支持宽屏的原生主分辨率！为此创造了 915resolution, 用于在启动时给 BIOS 打补丁以让 X server 支持宽屏的分辨率。 目前，X server 能在没有 915resolution 的情况下完成这些。然而，915resolution 能与 uvesafb 结合来获得一个支持宽屏的 framebuffer, 根本就不需要启动 X 了。这种情况下，运行完 915resolution 之后我们需要加载 uvesafb 来让它工作在正常的分辨率之下。

### 915resolution-static

在这种情形中，915resolution 需要被静态编译 (因为它要包含在 initramfs 中，因此不能有任何到外部库文件的连接). 所以你不能使用 [community] 源中的 915resolution 软件包，应该转而使用 AUR 中的 915resolution-staticAUR. 它静态编译了 915resolution 并提供了一个它的钩子，所以你在加载 uvesafb 之前就能运行 915resolution 并获得正确的分辨率。所以通过 makepkg 和 pacman 安装 915resolution-static .

### 分辨率

你需要编辑 915resolution 钩子以确定你要替换的 BIOS 模式和你想要的分辨率。你可以用如下命令得到 915resolution 所有选项的信息:

    $ 915resolution -h

编辑 `/lib/initcpio/hooks/915resolution` 并修改 915resolution 的选项:

    run_hook ()
    {
       msg -n ":: Patching the VBIOS..."
       /usr/sbin/915resolution 5c 1280 800
       msg "done."
    }

默认的 5c 用来替换成你要的 BIOS 模式的代码。使用命令 `915resolution -l` 来得到所有可用 BIOS 图形模式的代码。

注意: 你可能会选择你并不需要的代码 (framebuffer 或是 X 也都不需要), 因为 915resolution 会把它替换成用户选定的模式。上例中，`1280 800` 是新的所需分辨率。

### 钩子阵列

添加 915resolution 钩子并在其后添加 v86d 钩子到 `/etc/mkinitcpio.conf` 的 HOOKS 部分。务必位于 keymap 之前，以便从悬停和文件系统中恢复。

    HOOKS="base udev 915resolution v86d ..."

之后用 mkinitcpio 重新生成 initramfs (替换成你自己的预设文件):

    mkinitcpio -p linux

## 疑难问题

### Uvesafb 无法保留内存

检查你是否忘记删除了 `vga=xxx` 内核参数 -- 它把 UVESA framebuffer 覆盖为标准 VESA.

### Error: "pci_root PNP0A08:00 address space collision + Uvesafb cannot reserve memory"

这发生在 Acer Aspire One 751h 上使用 2.6.34-ARCH 内核时; 这是否在其他系统上也有我们不得而知。即使用另一份 uvesafb 设置调制 framebuffer, uvesafb 也不能保留必要的内存区域。

你可以通过在引导器配置里加上如下内核参数来解决。

    pci=nocrs

## 另见

- Uvesafb Kernel Page
- Gentoo's uvesafb Page
- VESA mode numbers

Categories:

- Graphics (简体中文)
- Eye candy (简体中文)