[HOME][Linux Kernel 2.6 のフレームバッファ]

Linux Kernel 2.2と2.4 のフレームバッファ


Linux Kernel 2.2 から追加されたフレームバッファの機能を試してみましょう. フレームバッファ機能を使用するとブート時にコンソール画面右上に ペンギンのロゴが表示され,かつてのDOS/Vで流行したコンソールの表示文字数を多 くしたり,コンソール上でグラフィックを表示するプログラムが容易に作成できたりと チョットわくわくできます. でも kon が使用できなくなります.

注意:カーネルのコンパイルやliloの設定に自信がない方は試さないほうがいいでしょう.
またパッケージ 管理が厳密なディストリビューションでは,以下のような勝手な設定はできないと思います. SlackwareやPlamoLinuxな人は問題ないでしょう.


フレームバッファを使ってみよう.

より詳細な情報はカーネルのソースツリー中のDocumentation/fb/framebuffer.txt や Documentation/svga.txt 等を参照して下さい.

まずカーネルのコンパイル

最初に一応ビデオカードの情報を見ておきましょう.
# cat /proc/pci でビデオカードの部分は,

  Bus  1, device   0, function  0:
    VGA compatible controller: NVidia Unknown device (rev 4).
      Vendor id=10de. Device id=20.
      Medium devsel.  Fast back-to-back capable.  IRQ 10.  Master Capable.  
      Latency=32.  Min Gnt=5.Max Lat=1.
      Non-prefetchable 32 bit memory at 0xd4000000 [0xd4000000].
      Prefetchable 32 bit memory at 0xd6000000 [0xd6000008].

となっていました.

フレームバッファは linux-2.2.18 で EXPERIMENTAL となっているため カーネルのコンフィギュレーションで以下のように指定します.

# make menuconfig

      +----------- Code maturity level options -----------------+
      [*] Prompt for development and/or incomplete code/drivers  

      +------------------- Console drivers ---------------------+
      [*] VGA text console                                        
      [*] Video mode selection support                            
      < > MDA text console (dual-headed) (EXPERIMENTAL)           
      [*] Support for frame buffer devices (EXPERIMENTAL)         
      < > Permedia2 support (experimental) (NEW)                  
      < > ATI Mach64 display support (NEW)                        
      [*] VESA VGA graphics console (NEW)                         
      [ ] VGA 16-color graphics console (NEW)                     
      < > Matrox acceleration (NEW)                               
      < > ATI Rage128 display support (NEW)                       
      < > Virtual Frame Buffer support (ONLY FOR TESTING!) (NEW)  
      [*] Advanced low level driver options (NEW)                 
      < > Monochrome support (NEW)                                
      < > 2 bpp packed pixels support (NEW)                       
      < > 4 bpp packed pixels support (NEW)                       
      <*> 8 bpp packed pixels support (NEW)                       
      <*> 16 bpp packed pixels support (NEW)                      
      <*> 24 bpp packed pixels support (NEW)                      
      <*> 32 bpp packed pixels support (NEW)                      
      < > Amiga bitplanes support (NEW)                           
      < > Amiga interleaved bitplanes support (NEW)               
      < > Atari interleaved bitplanes (2 planes) support (NEW)    
      < > Atari interleaved bitplanes (4 planes) support (NEW)    
      < > Atari interleaved bitplanes (8 planes) support (NEW)    
      < > Mac variable bpp packed pixels support (NEW)            
      [ ] VGA 16-color planar support (NEW)                       
      < > VGA characters/attributes support (NEW)                 
      [ ] Support only 8 pixels wide fonts (NEW)                  
      [ ] Select compiled-in fonts (NEW)                          

linux-2.4.0 の場合は:

      +----------- Code maturity level options -----------------+
      [*] Prompt for development and/or incomplete code/drivers

      +------------------- Console drivers ---------------------+
      [*] VGA text console
      [*] Video mode selection support
      < > MDA text console (dual-headed) (EXPERIMENTAL)
      Frame-buffer support  --->


      +------------------- Frame-buffer support ----------------+
      [*] Support for frame buffer devices (EXPERIMENTAL)
      < >   nVidia Riva support (EXPERIMENTAL)
      < >   Cirrus Logic support (EXPERIMENTAL)
      < >   Permedia2 support (EXPERIMENTAL)
      < >   Cyber2000 support
      [*]   VESA VGA graphics console
      < >   VGA 16-color graphics console
      < >   Hercules mono graphics console (EXPERIMENTAL)
      < >   Matrox acceleration (EXPERIMENTAL)
      < >   ATI Mach64 display support (EXPERIMENTAL)
      < >   ATI Rage 128 display support (EXPERIMENTAL)
      < >   3Dfx Banshee/Voodoo3 display support (EXPERIMENTAL)
      < >   SIS 630/540 display support (EXPERIMENTAL)
      < >   Virtual Frame Buffer support (ONLY FOR TESTING!)
      [*]   Advanced low level driver options
      < >     Monochrome support
      < >     2 bpp packed pixels support
      < >     4 bpp packed pixels support
      <*>     8 bpp packed pixels support
      <*>     16 bpp packed pixels support
      <*>     24 bpp packed pixels support
      <*>     32 bpp packed pixels support
      < >     Amiga bitplanes support
      < >     Amiga interleaved bitplanes support
      < >     Atari interleaved bitplanes (2 planes) support
      < >     Atari interleaved bitplanes (4 planes) support
      < >     Atari interleaved bitplanes (8 planes) support
      < >     Mac variable bpp packed pixels support
      < >     VGA 16-color planar support
      < >     VGA characters/attributes support
      < >     HGA monochrome support (EXPERIMENTAL)
      [ ]   Support only 8 pixels wide fonts
      [ ]   Select compiled-in fonts

で,普通にコンパイルします.

# make dep; make clean
# make
# make bzdisk
# make bzlilo
# make modules
# make modules_install
# depmod -a

あるいはフロッピーからブートして実験する場合には,FDにカーネルを書込み, 起動時にビデオモードを指定できるように設定します.この方法がお手軽です.

# make bzdisk
# rdev -v /dev/fd0 -3

デバイスファイルの作成

/dev/fb0 が存在していない場合,フレームバッファにアクセスできるようにノードを作成します.

# mknod -m 666 /dev/fb0 u 29 0


/etc/lilo.confの修正

FDから起動する場合は不要です.

# Start LILO global section
boot = /dev/hda
delay = 300
vga = ask 

# lilo を実行して,リブートします.


起動時にコンソールのモードを指定

VESA モードのフレームバッファは起動時以外は変更できません. 次の表は指定できるビデオモードです

Colours 640x480 800x600 1024x768 1280x1024 1600x1200
8 bits 301 303 305 307 31C
15 bits 310 313 316 319 31D
16 bits 311 314 317 31A 31E
24 bits 312 315 318 31B 31F

lilo.confに vga=ask を指定したことによって以下の表示がブート時に出ます.
rdev -v /dev/fd0 -3 でビデオモードを選択可能に設定した FD で起動した場合も同じです.

Press <RETURN> to see video modes available, <SPACE> to continue or wait 30 secs

ここでリターンキーを押すとメニューがでます.

Video adapter: VESA VGA
Mode:    COLSxROWS
0 0F00   80x25
1 0F01   80x50
2 0F02   80x43
3 0F03   80x28
4 0F05   80x30
5 0F06   80x34
6 0F07   80x60
7 0309   132x25
8 030A   132x43
9 030B   132x50
a 030C   132x60

Enter mode number or `scan':_ 

メニューに表示されているモードはテキストモードなので,グラフィックモード では,例えば 317 と入力すると1024x768x16モードで コンソールが起動します.
ペンギンのロゴ とともに以下のような表示が起動時に現れます.

vesafb: framebuffer at 0xd6000000, mapped to 0xc8800000, size 4096k
vesafb: mode is 1024x768x16, linelength=2048, pages=0
vesafb: protected mode interface info at c000:0241
vesafb: scrolling: redraw
vesafb: directcolor: size=0:5:6:5, shift=0:11:5:0
Console: switching to colour frame buffer device 128x48
fb0: VESA VGA frame buffer device

上記の方法ではコンソールのスクロールはコピーで行われるため,ハードウェア スクロールで起動するためには,カーネルの起動オプションに video=vesa:ywrapを指定して, モードを例えば 305 とすると起動時に以下のように表示されます.

vesafb: framebuffer at 0xfd000000, mapped to 0xc2802000, size 2048k
vesafb: mode is 1024x768x8, linelength=1024, pages=0
vesafb: protected mode interface info at c000:9a90
vesafb: pmi: set display start = c00c9ad2, set palette = c00c9af1
vesafb: pmi: ports = 3c0 3c4 3c5 3c7 3c8 3c9 3d4 3d5 3d6 3d7 3d8 3d9 3da
vesafb: scrolling: ywrap using protected mode interface, yres_virtual=2048
Console: switching to colour frame buffer device 128x48
fb0: VESA VGA frame buffer device

DOS/Vと同じですが,スクロールも高速になります.モードが317 でも高速です.

いろいろ試して気に入った設定があれば /etc/lilo.conf に設定すると良いでしょう.


実際にフレームバッファを使ってみよう.

/dev/fb0はメモリーデバイスとして使用できます,グラフィックを画面上に 表示したり,画面をファイルに書きこんだりができます. 適当なファイルを/dev/fb0に書きこんでみます.

$ cat xxx.txt > /dev/fb0

画面上部に何か表示されるはずです.

$ cat /vmlinuz > /dev/fb0カーネル自身を眺めるの一興です.

本格的に使用するためには mmap()でポインタを取得してビデオメモリに直接書き込みます (その2). X上でなくてもコンソール画面でグラフィックを表示できます. DOS/Vをご存知の方は親しみやすい環境でなないでしょうか.

MS-WindowsではWindows APIやDirectX,X11ではXlibなどを使用してグラフィックス を表示する必要があるため,「ちょっと試してみよう」と思っても学習に費やす時間と 費用(書籍代など)は馬鹿になりませんでした.

フレームバッファ機能を使うとプログラムとしては原始的な方法で,とにかく画面上に 何らかの表示を得ることができます.


ご意見・ご感想は,mizutani.jun@nifty.ne.jp まで.