Uvesafb
與其他 framebuffer 驅動不同,uvesafb 需要一個叫做 v86d 的用户空間虛擬化守護進程。在 x86 機器上模擬 x86 代碼看起來很愚蠢,但若是想在其他架構上使用 framebuffer 代碼這就顯得很重要了 (尤其是非 x86 架構). 一個新的 framebuffer 驅動已添加到 2.6.24 版的內核中。它比標準的 vesafb 有更多的特性,包括:
- 延遲後適當間隔和硬件懸停。
- 支持自定義解像度,就像使用系統 BIOS 一樣。
vesafb 支持的硬件它應該都支持。
安裝[編輯 | 編輯原始碼]
準備系統[編輯 | 編輯原始碼]
記得從引導器配置中刪除一切與 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 圖形模式的代碼。
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