Uvesafb

出自 Arch Linux 中文维基

本文內容或本節內容已經過期。

原因: 請提供模板的第一個位置參數以概括原因。 (在Talk:Uvesafb討論)

這篇文章或章節的翻譯不反映原文。

原因:Last updated in 2015(在 Talk:Uvesafb# 中討論)

與其他 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:
# https://www.kernel.org/doc/html/latest/fb/uvesafb.html
#
options uvesafb mode_option=1280x800-32 scroll=ywrap

mode_option 的文獻可見於 [1]

為避免你的設置在升級時被覆蓋,把下面的文件複製到 /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[損壞的連結:package not found]. 它靜態編譯了 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

另見[編輯 | 編輯原始碼]