幀緩衝控制檯

幀緩衝控制檯(fbcon),顧名思義,是一個執行在幀緩衝裝置之上的文字控制檯。它具有任何標準文字控制檯驅動程式的功能,例如VGA控制檯,並添加了可以歸因於幀緩衝圖形性質的附加功能。

在x86架構中,幀緩衝控制檯是可選的,有些人甚至將其視為玩具。對於其他架構,它是唯一可用的顯示裝置,無論是文字還是圖形。

fbcon有哪些功能?幀緩衝控制檯支援高解析度、變化的字型型別、顯示旋轉、原始多頭顯示等。理論上,還可以實現彩色字型、混合、抗鋸齒以及底層顯示卡提供的任何功能。

A. 配置

可以使用您喜歡的核心配置工具啟用幀緩衝控制檯。它位於裝置驅動程式->圖形支援->控制檯顯示驅動程式支援->幀緩衝控制檯支援下。選擇“y”以靜態編譯支援,或選擇“m”以進行模組支援。模組將是fbcon。

為了使fbcon啟用,至少需要一個幀緩衝驅動程式,因此請從眾多可用的驅動程式中進行選擇。對於x86系統,它們幾乎都具有VGA卡,因此vga16fb和vesafb始終可用。但是,使用特定於晶片組的驅動程式將為您提供更高的速度和更多功能,例如動態更改影片模式的能力。

要顯示企鵝徽標,請在圖形支援->啟動徽標中選擇任何可用的徽標。

另外,您將需要選擇至少一個編譯到核心中的字型,但是如果您不執行任何操作,核心配置工具將為您選擇一個字型,通常是8x16字型。

注意:一個常見的錯誤報告是啟用幀緩衝,但不啟用幀緩衝控制檯。根據驅動程式的不同,您可能會得到空白或亂碼顯示,但是系統仍然可以啟動完成。如果您很幸運擁有一個不改變圖形晶片的驅動程式,那麼您仍然可以獲得VGA控制檯。

B. 載入

可能的場景

  1. 驅動程式和fbcon是靜態編譯的

    通常,fbcon會自動接管您的控制檯。一個值得注意的例外是vesafb。需要使用vga=啟動選項引數顯式啟用它。

  2. 驅動程式是靜態編譯的,fbcon是作為模組編譯的

    根據驅動程式的不同,您會得到一個標準控制檯或亂碼顯示,如上所述。要獲得幀緩衝控制檯,請執行“modprobe fbcon”。

  3. 驅動程式是作為模組編譯的,fbcon是靜態編譯的

    您會得到您的標準控制檯。一旦使用“modprobe xxxfb”載入驅動程式,fbcon就會自動接管控制檯,但可能需要使用fbcon=map:n選項。 見下文。

  4. 驅動程式和fbcon都是作為模組編譯的。

    您可以按任何順序載入它們。一旦都載入完畢,fbcon將接管控制檯。

  1. 啟動選項

    幀緩衝控制檯有幾個很大程度上未知的啟動選項,可以改變其行為。

  1. fbcon=font:<名稱>

    選擇要使用的初始字型。“名稱”的值可以是任何編譯到核心中的字型:10x18、6x10、6x8、7x14、Acorn8x8、MINI4x6、PEARL8x8、ProFont6x11、SUN12x22、SUN8x16、TER16x32、VGA8x16、VGA8x8。

    請注意,並非所有驅動程式都可以處理寬度不能被8整除的字型,例如vga16fb。

  2. fbcon=map:<0123>

    這是一個有趣的選項。它告訴哪個驅動程式被對映到哪個控制檯。“0123”的值是一個序列,它會重複直到總長度為64,這是可用的控制檯數量。在上面的示例中,它被擴充套件為012301230123...,對映將是

    tty | 1 2 3 4 5 6 7 8 9 ...
    fb  | 0 1 2 3 0 1 2 3 0 ...
    
    ('cat /proc/fb' should tell you what the fb numbers are)
    

    一個可能有用的副作用是使用超出已載入fb驅動程式數量的map值。例如,如果只有一個驅動程式可用,fb0,新增fbcon=map:1會告訴fbcon不要接管控制檯。

    稍後,當您想將控制檯對映到幀緩衝裝置時,可以使用con2fbmap實用程式。

  3. fbcon=vc:<n1>-<n2>

    此選項告訴fbcon僅接管由值“n1”和“n2”指定的控制檯範圍。給定範圍之外的其餘控制檯仍將由標準控制檯驅動程式控制。

    注意:對於x86機器,標準控制檯是VGA控制檯,它通常位於同一影片卡上。因此,由VGA控制檯控制的控制檯將被損壞。

  4. fbcon=rotate:<n>

    此選項更改控制檯顯示的方向角度。“n”的值接受以下值

    • 0 - 正常方向(0度)

    • 1 - 順時針方向(90度)

    • 2 - 上下顛倒方向(180度)

    • 3 - 逆時針方向(270度)

    以後可以透過將相同的數字“echo”到/sys/class/graphics/fbcon中找到的2個屬性之一來隨時更改角度

    • rotate - 旋轉活動控制檯的顯示

    • rotate_all - 旋轉所有控制檯的顯示

    只有在您的核心中編譯了Framebuffer Console Rotation支援時,控制檯旋轉才可用。

    注意:這純粹是控制檯旋轉。使用幀緩衝的任何其他應用程式將保持其“正常”方向。實際上,底層fb驅動程式完全不知道控制檯旋轉。

  5. fbcon=margin:<顏色>

    此選項指定邊距的顏色。邊距是螢幕右側和底部的剩餘區域,未被文字使用。預設情況下,此區域將為黑色。“顏色”值是一個整數,具體取決於所使用的幀緩衝驅動程式。

  6. fbcon=nodefer

    如果核心是使用延遲fbcon接管支援編譯的,通常,韌體/引導載入程式留在原位的幀緩衝內容將被保留,直到實際上有文字輸出到控制檯為止。此選項導致fbcon立即繫結到fbdev裝置。

  7. fbcon=logo-pos:<位置>

    唯一可能的“位置”是“center”(不帶引號),當給出該位置時,啟動徽標將從預設的左上角位置移動到幀緩衝的中心。如果由於多個CPU而顯示了多個徽標,則收集的徽標行將作為一個整體移動。

  8. fbcon=logo-count:<n>

    值“n”覆蓋啟動徽標的數量。0停用徽標,-1給出預設值,即線上CPU的數量。

  1. 連線、分離和解除安裝

在繼續討論如何連線、分離和解除安裝幀緩衝控制檯之前,對依賴關係的說明可能會有所幫助。

與大多數子系統一樣,控制檯層需要一個與硬體介面的驅動程式。因此,在VGA控制檯中

console ---> VGA driver ---> hardware.

假設可以解除安裝VGA驅動程式,則必須先將VGA驅動程式與控制檯層分離,然後才能解除安裝驅動程式。如果VGA驅動程式仍然繫結到控制檯層,則無法解除安裝該驅動程式。(有關更多資訊,請參見控制檯驅動程式)。

在幀緩衝控制檯(fbcon)的情況下,這更為複雜,因為fbcon是控制檯和驅動程式之間的中間層

console ---> fbcon ---> fbdev drivers ---> hardware

如果fbdev驅動程式繫結到fbcon,則無法解除安裝它們;如果fbcon繫結到控制檯層,則無法解除安裝fbcon。

因此,要解除安裝fbdev驅動程式,必須首先將fbcon與控制檯分離,然後將fbdev驅動程式與fbcon分離。幸運的是,將fbcon與控制檯層分離將自動將幀緩衝驅動程式與fbcon分離。因此,無需顯式地將fbdev驅動程式與fbcon分離。

那麼,我們如何將fbcon與控制檯分離?部分答案在控制檯驅動程式中。 總結一下

將一個值回顯到表示幀緩衝控制檯驅動程式的繫結檔案。因此,假設vtcon1代表fbcon,那麼

echo 1 > /sys/class/vtconsole/vtcon1/bind - attach framebuffer console to
                                           console layer
echo 0 > /sys/class/vtconsole/vtcon1/bind - detach framebuffer console from
                                           console layer

如果fbcon與控制檯層分離,您的啟動控制檯驅動程式(通常是VGA文字模式)將接管。一些驅動程式(rivafb和i810fb)將為您恢復VGA文字模式。對於其餘驅動程式,在分離fbcon之前,您必須採取一些額外的步驟來確保您的VGA文字模式已正確恢復。以下是可以執行的幾種方法之一

  1. 下載或安裝vbetool。此實用程式包含在當今大多數發行版中,並且通常是掛起/恢復工具的一部分。

  2. 在您的核心配置中,確保將CONFIG_FRAMEBUFFER_CONSOLE設定為“y”或“m”。 啟用一個或多個您喜歡的幀緩衝驅動程式。

  3. 啟動到文字模式並以root身份執行

    vbetool vbestate save > <vga state file>
    

    上面的命令將圖形硬體的暫存器內容儲存到<vga state file>。您只需要執行此步驟一次,因為狀態檔案可以重複使用。

  4. 如果將fbcon編譯為模組,請透過執行以下操作來載入fbcon

    modprobe fbcon
    
  5. 現在分離fbcon

    vbetool vbestate restore < <vga state file> && \
    echo 0 > /sys/class/vtconsole/vtcon1/bind
    
  6. 就是這樣,您回到了VGA模式。如果您將fbcon編譯為模組,則可以透過“rmmod fbcon”解除安裝它。

  7. 要重新連線fbcon

    echo 1 > /sys/class/vtconsole/vtcon1/bind
    

8. 一旦fbcon被解除繫結,所有註冊到系統的驅動程式也將被解除繫結。這意味著可以隨意解除安裝或重新載入fbcon和單獨的幀緩衝驅動程式。重新載入驅動程式或fbcon將自動將控制檯、fbcon和驅動程式繫結在一起。解除安裝所有驅動程式而不解除安裝fbcon將使控制檯無法繫結fbcon。

vesafb使用者的注意事項:

不幸的是,如果您的bootline包含一個vga=xxx引數,該引數將硬體設定為圖形模式,例如載入vesafb時,vgacon將無法載入。相反,vgacon會將預設的啟動控制檯替換為dummycon,並且在分離fbcon後您將看不到任何顯示。您的機器仍然可用,因此您可以重新連線vesafb。但是,要重新連線vesafb,您需要執行以下操作之一

變體1

  1. 在分離fbcon之前,執行

    vbetool vbemode save > <vesa state file> # do once for each vesafb mode,
                                             # the file can be reused
    
  2. 按照步驟5分離fbcon。

  3. 連線fbcon

    vbetool vbestate restore < <vesa state file> && \
    echo 1 > /sys/class/vtconsole/vtcon1/bind
    

變體2

  1. 在分離fbcon之前,執行

    echo <ID> > /sys/class/tty/console/bind
    
    vbetool vbemode get
    
  2. 記下模式編號

  1. 按照步驟5分離fbcon。

  2. 連線fbcon

    vbetool vbemode set <mode number> && \
    echo 1 > /sys/class/vtconsole/vtcon1/bind
    

示例:

如果您在X86盒子上,可以使用以下2個示例bash指令碼來繫結或取消繫結幀緩衝控制檯驅動程式

#!/bin/bash
# Unbind fbcon

# Change this to where your actual vgastate file is located
# Or Use VGASTATE=$1 to indicate the state file at runtime
VGASTATE=/tmp/vgastate

# path to vbetool
VBETOOL=/usr/local/bin


for (( i = 0; i < 16; i++))
do
  if test -x /sys/class/vtconsole/vtcon$i; then
      if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
           = 1 ]; then
          if test -x $VBETOOL/vbetool; then
             echo Unbinding vtcon$i
             $VBETOOL/vbetool vbestate restore < $VGASTATE
             echo 0 > /sys/class/vtconsole/vtcon$i/bind
          fi
      fi
  fi
done

#!/bin/bash
# Bind fbcon

for (( i = 0; i < 16; i++))
do
  if test -x /sys/class/vtconsole/vtcon$i; then
      if [ `cat /sys/class/vtconsole/vtcon$i/name | grep -c "frame buffer"` \
           = 1 ]; then
        echo Unbinding vtcon$i
        echo 1 > /sys/class/vtconsole/vtcon$i/bind
      fi
  fi
done

Antonino Daplas <adaplas@pol.net>