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
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などを使用してグラフィックス を表示する必要があるため,「ちょっと試してみよう」と思っても学習に費やす時間と 費用(書籍代など)は馬鹿になりませんでした.
フレームバッファ機能を使うとプログラムとしては原始的な方法で,とにかく画面上に 何らかの表示を得ることができます.