幀緩衝控制檯¶
幀緩衝控制檯(fbcon),顧名思義,是一個執行在幀緩衝裝置之上的文字控制檯。它具有任何標準文字控制檯驅動程式的功能,例如VGA控制檯,並添加了可以歸因於幀緩衝圖形性質的附加功能。
在x86架構中,幀緩衝控制檯是可選的,有些人甚至將其視為玩具。對於其他架構,它是唯一可用的顯示裝置,無論是文字還是圖形。
fbcon有哪些功能?幀緩衝控制檯支援高解析度、變化的字型型別、顯示旋轉、原始多頭顯示等。理論上,還可以實現彩色字型、混合、抗鋸齒以及底層顯示卡提供的任何功能。
A. 配置¶
可以使用您喜歡的核心配置工具啟用幀緩衝控制檯。它位於裝置驅動程式->圖形支援->控制檯顯示驅動程式支援->幀緩衝控制檯支援下。選擇“y”以靜態編譯支援,或選擇“m”以進行模組支援。模組將是fbcon。
為了使fbcon啟用,至少需要一個幀緩衝驅動程式,因此請從眾多可用的驅動程式中進行選擇。對於x86系統,它們幾乎都具有VGA卡,因此vga16fb和vesafb始終可用。但是,使用特定於晶片組的驅動程式將為您提供更高的速度和更多功能,例如動態更改影片模式的能力。
要顯示企鵝徽標,請在圖形支援->啟動徽標中選擇任何可用的徽標。
另外,您將需要選擇至少一個編譯到核心中的字型,但是如果您不執行任何操作,核心配置工具將為您選擇一個字型,通常是8x16字型。
注意:一個常見的錯誤報告是啟用幀緩衝,但不啟用幀緩衝控制檯。根據驅動程式的不同,您可能會得到空白或亂碼顯示,但是系統仍然可以啟動完成。如果您很幸運擁有一個不改變圖形晶片的驅動程式,那麼您仍然可以獲得VGA控制檯。
B. 載入¶
可能的場景
驅動程式和fbcon是靜態編譯的
通常,fbcon會自動接管您的控制檯。一個值得注意的例外是vesafb。需要使用vga=啟動選項引數顯式啟用它。
驅動程式是靜態編譯的,fbcon是作為模組編譯的
根據驅動程式的不同,您會得到一個標準控制檯或亂碼顯示,如上所述。要獲得幀緩衝控制檯,請執行“modprobe fbcon”。
驅動程式是作為模組編譯的,fbcon是靜態編譯的
您會得到您的標準控制檯。一旦使用“modprobe xxxfb”載入驅動程式,fbcon就會自動接管控制檯,但可能需要使用fbcon=map:n選項。 見下文。
驅動程式和fbcon都是作為模組編譯的。
您可以按任何順序載入它們。一旦都載入完畢,fbcon將接管控制檯。
啟動選項
幀緩衝控制檯有幾個很大程度上未知的啟動選項,可以改變其行為。
fbcon=font:<名稱>
選擇要使用的初始字型。“名稱”的值可以是任何編譯到核心中的字型:10x18、6x10、6x8、7x14、Acorn8x8、MINI4x6、PEARL8x8、ProFont6x11、SUN12x22、SUN8x16、TER16x32、VGA8x16、VGA8x8。
請注意,並非所有驅動程式都可以處理寬度不能被8整除的字型,例如vga16fb。
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實用程式。
fbcon=vc:<n1>-<n2>
此選項告訴fbcon僅接管由值“n1”和“n2”指定的控制檯範圍。給定範圍之外的其餘控制檯仍將由標準控制檯驅動程式控制。
注意:對於x86機器,標準控制檯是VGA控制檯,它通常位於同一影片卡上。因此,由VGA控制檯控制的控制檯將被損壞。
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驅動程式完全不知道控制檯旋轉。
fbcon=margin:<顏色>
此選項指定邊距的顏色。邊距是螢幕右側和底部的剩餘區域,未被文字使用。預設情況下,此區域將為黑色。“顏色”值是一個整數,具體取決於所使用的幀緩衝驅動程式。
fbcon=nodefer
如果核心是使用延遲fbcon接管支援編譯的,通常,韌體/引導載入程式留在原位的幀緩衝內容將被保留,直到實際上有文字輸出到控制檯為止。此選項導致fbcon立即繫結到fbdev裝置。
fbcon=logo-pos:<位置>
唯一可能的“位置”是“center”(不帶引號),當給出該位置時,啟動徽標將從預設的左上角位置移動到幀緩衝的中心。如果由於多個CPU而顯示了多個徽標,則收集的徽標行將作為一個整體移動。
fbcon=logo-count:<n>
值“n”覆蓋啟動徽標的數量。0停用徽標,-1給出預設值,即線上CPU的數量。
連線、分離和解除安裝
在繼續討論如何連線、分離和解除安裝幀緩衝控制檯之前,對依賴關係的說明可能會有所幫助。
與大多數子系統一樣,控制檯層需要一個與硬體介面的驅動程式。因此,在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文字模式已正確恢復。以下是可以執行的幾種方法之一
下載或安裝vbetool。此實用程式包含在當今大多數發行版中,並且通常是掛起/恢復工具的一部分。
在您的核心配置中,確保將CONFIG_FRAMEBUFFER_CONSOLE設定為“y”或“m”。 啟用一個或多個您喜歡的幀緩衝驅動程式。
啟動到文字模式並以root身份執行
vbetool vbestate save > <vga state file>
上面的命令將圖形硬體的暫存器內容儲存到<vga state file>。您只需要執行此步驟一次,因為狀態檔案可以重複使用。
如果將fbcon編譯為模組,請透過執行以下操作來載入fbcon
modprobe fbcon
現在分離fbcon
vbetool vbestate restore < <vga state file> && \ echo 0 > /sys/class/vtconsole/vtcon1/bind
就是這樣,您回到了VGA模式。如果您將fbcon編譯為模組,則可以透過“rmmod fbcon”解除安裝它。
要重新連線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
在分離fbcon之前,執行
vbetool vbemode save > <vesa state file> # do once for each vesafb mode, # the file can be reused按照步驟5分離fbcon。
連線fbcon
vbetool vbestate restore < <vesa state file> && \ echo 1 > /sys/class/vtconsole/vtcon1/bind
變體2
在分離fbcon之前,執行
echo <ID> > /sys/class/tty/console/bind vbetool vbemode get記下模式編號
按照步驟5分離fbcon。
連線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>