Uvesafb - Arch Linux 中文维基

跳至內容

# Uvesafb

出自 Arch Linux 中文维基

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

原因： AUR 上的 v86d 已經消失。原頁面已被歸檔。 (在Talk:Uvesafb討論)

相關文章

- Kernel modules
- Kernel parameters
- sysctl

翻譯狀態：

- 本文（或部分內容）譯自 Uvesafb，最近一次同步於 2015-02-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

這篇文章或章節的翻譯質量不佳。

原因：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

## 另見

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

分類：​

- 使用「模板:過時」標記的頁面或章節
- 圖形
- 小提升
- 包含損壞的軟體包連結的頁面

隱藏分類：​

- 使用「模板:糟糕的翻譯」標記的頁面或章節

Uvesafb
新增話題