Linux 2.6 のカーネルの設定はLinux 2.2や2.4の設定といろいろ異なっています。 フレームバッファの設定とブート用のフロッピーディスクの設定に関して解説してみます。
フレームバッファ機能を使用するとブート時にコンソール画面右上に ペンギンのロゴ が表示され、かつてのDOS/Vで流行したコンソールの表示文字数を多くしたり、コンソール上で グラフィックを表示するプログラムが容易に作成できます。
より詳細な情報はカーネルのソースツリー中のDocumentation/fb/ 以下の文書や Documentation/svga.txt 等を参照して下さい。
私の今の環境は # cat /proc/pci でビデオカードの部分は、
Bus 0, device 2, function 0: VGA compatible controller: Intel Corp. 82845G/GL [Brookdale (rev 3). IRQ 5. Prefetchable 32 bit memory at 0xd8000000 [0xdfffffff]. Non-prefetchable 32 bit memory at 0xe0100000 [0xe017ffff].
となっています。
Linuxカーネルがフレームバッファを使う設定になっていない場合には、カーネルをコンパイルする必要があります。 カーネルのソースが置いてあるディレクトリに移動して、make menuconfig を実行します。 2.6 から make xconfig は tcl/tk ではなく、Qtライブラリを使うように変更されました。 Qtライブラリが使える場合は、X上で make xconfig でも同じです。
# cd /usr/src/linux # make menuconfig
設定メニューのトップは以下のように変更されています。デバイスドライバーを選択します。
Linux Kernel v2.6.0-test8 Configuration ------------------------------------------------------------------------------------ l------------------------- Linux Kernel Configuration --------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted | | letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes | | features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in | | [ ] excluded <M> module < > module capable | | l---------------------------------------------------------------------------+ | | | Code maturity level options ---> | | | | General setup ---> | | | | Loadable module support ---> | | | | Processor type and features ---> | | | | Power management options (ACPI, APM) ---> | | | | Bus options (PCI, PCMCIA, EISA, MCA, ISA) ---> | | | | Executable file formats ---> | | | | Device Drivers ---> | | | | File systems ---> | | | | Profiling support ---> | | | | Kernel hacking ---> | | | | Security options ---> | | | | Cryptographic options ---> | | | | Library routines ---> | | | | --- | | | | Load an Alternate Configuration File | | | | Save Configuration to an Alternate File | | | | | | | +---------------------------------------------------------------------------+ | +-------------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------------+
フレームバッファの設定は「Graphics support」メニューにあります。
Linux Kernel v2.6.0-test8 Configuration ------------------------------------------------------------------------------------ l------------------------------- Device Drivers --------------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted | | letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes | | features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in | | [ ] excluded <M> module < > module capable | | l---------------------------------------------------------------------------+ | | | Generic Driver Options ---> | | | | Memory Technology Devices (MTD) ---> | | | | Parallel port support ---> | | | | Plug and Play support ---> | | | | Block devices ---> | | | | ATA/ATAPI/MFM/RLL support ---> | | | | SCSI device support ---> | | | | Old CD-ROM drivers (not SCSI, not IDE) ---> | | | | Multi-device support (RAID and LVM) ---> | | | | Fusion MPT device support ---> | | | | IEEE 1394 (FireWire) support (EXPERIMENTAL) ---> | | | | I2O device support ---> | | | | Networking support ---> | | | | ISDN subsystem ---> | | | | Telephony Support ---> | | | | Input device support ---> | | | | Character devices ---> | | | | Multimedia devices ---> | | | | Graphics support ---> | | | | Sound ---> | | | | USB support ---> | | | +---------------------------------------------------------------------------+ | +-------------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------------+
フレームバッファデバイスを使えるように設定します。ビデオチップを選択すると 起動時以外に動的に解像度を変更できたりできますが、安全のためここではVESA VGA だけを使うようにします。VESAはほとんどすべてのビデオカード(チップ)で 使用できるはずです。
Linux Kernel v2.6.0-test8 Configuration ------------------------------------------------------------------------------------ l------------------------------ Graphics support -------------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted | | letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes | | features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in | | [ ] excluded <M> module < > module capable | | l---------------------------------------------------------------------------+ | | | [*] Support for frame buffer devices | | | | < > CyberPro 2000/2010/5000 support | | | | [ ] IMS Twin Turbo display support | | | | < > VGA 16-color graphics support | | | | [*] VESA VGA graphics support | | | | < > Hercules mono graphics support | | | | < > nVidia Riva support | | | | < > Matrox acceleration | | | | < > ATI Radeon display support | | | | < > ATI Rage128 display support | | | | < > ATI Mach64 display support | | | | < > SIS acceleration | | | | < > NeoMagic display support | | | | < > 3Dfx Banshee/Voodoo3 display support | | | | < > 3Dfx Voodoo Graphics (sst1) support | | | | < > Trident support | | | | < > Virtual Frame Buffer support (ONLY FOR TESTING!) | | | | Console display driver support ---> | | | | Logo configuration ---> | | | +---------------------------------------------------------------------------+ | +-------------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------------+
起動時に画面の解像度を指定できるように次のように設定します。
Linux Kernel v2.6.0-test8 Configuration ------------------------------------------------------------------------------------ l----------------------- Console display driver support ------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted | | letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes | | features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in | | [ ] excluded <M> module < > module capable | | l---------------------------------------------------------------------------+ | | | --- VGA text console | | | | [*] Video mode selection support | | | | < > MDA text console (dual-headed) (EXPERIMENTAL) | | | | <*> Framebuffer Console support | | | | [ ] Select compiled-in fonts | | | | | | | | | | | | | | | +---------------------------------------------------------------------------+ | +-------------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------------+
フレームバッファが有効であることの確認のためブート画面にペンギンを表示します。
Linux Kernel v2.6.0-test8 Configuration ------------------------------------------------------------------------------------ l----------------------------- Logo configuration ------------------------------+ | Arrow keys navigate the menu. <Enter> selects submenus --->. Highlighted | | letters are hotkeys. Pressing <Y> includes, <N> excludes, <M> modularizes | | features. Press <Esc><Esc> to exit, <?> for Help. Legend: [*] built-in | | [ ] excluded <M> module < > module capable | | l---------------------------------------------------------------------------+ | | | [*] Bootup logo | | | | [ ] Standard black and white Linux logo | | | | [ ] Standard 16-color Linux logo | | | | [*] Standard 224-color Linux logo | | | | | | | | | | | +---------------------------------------------------------------------------+ | +-------------------------------------------------------------------------------+ | <Select> < Exit > < Help > | +-------------------------------------------------------------------------------+
カーネルをコンパイルします。linux 2.6 では make だけでコンパイルできますが、 動作しているLinuxマシンのカーネルを書き換えて動かなくなってしまっても困りますから、 フロッピーディスクにカーネルを書き込んでフロッピーディスクから起動してテストすれば安心です。 しかしカーネル 2.4 までは dd でカーネルイメージを直接フロッピーディスクに書き込んでいましたが、 2.6ではフロッピーを「mformat a:」でMS-DOSフォーマットでフォーマットした後、 syslinux でブートローダを書き込み、 ファイルとしてカーネルイメージをフロッピーディスクに転送しています。 2.6 ではコンパイル中の画面もかなり変化しています。
jm:/usr/src/linux-2.6.0-test8# make bzdisk : 略 : LD vmlinux AS arch/i386/boot/setup.o LD arch/i386/boot/setup OBJCOPY arch/i386/boot/compressed/vmlinux.bin GZIP arch/i386/boot/compressed/vmlinux.bin.gz LD arch/i386/boot/compressed/piggy.o LD arch/i386/boot/compressed/vmlinux OBJCOPY arch/i386/boot/vmlinux.bin BUILD arch/i386/boot/bzImage Root device is (3, 72) Boot sector 512 bytes. Setup is 4719 bytes. System is 1401 kB Kernel: arch/i386/boot/bzImage is ready MTOOLSRC=arch/i386/boot/mtools.conf mformat a: ; sync syslinux /dev/fd0 ; sync echo 'default linux ' | \ MTOOLSRC=arch/i386/boot/mtools.conf mcopy - a:syslinux.cfg MTOOLSRC=arch/i386/boot/mtools.conf mcopy arch/i386/boot/bzImage a:linux ; sync
カーネル 2.4 までの dd で書き込む方法ではカーネルイメージが 900KB 程度が大きさの限界で、 それを超えると「カーネルが大き過ぎます」といったエラーとなっていました。 syslinux を使うカーネル 2.6 の方法では上記の例のようにフロッピーディスクの限界まで 使うことができます。
作成されたフロッピーディスクの内容を見てみましょう。linux がカーネル本体、 ldlinux.sys が syslinux によって作成されたカーネルローダです。
jm:/usr/src/linux-2.6.0-test8# mount /dev/fd0 /mnt jm:/usr/src/linux-2.6.0-test8# ls -l /mnt total 1416 -r-xr--r-- 1 root root 7856 Oct 20 01:27 ldlinux.sys -rwxr--r-- 1 root root 1440708 Oct 20 01:27 linux -rwxr--r-- 1 root root 15 Oct 20 01:27 syslinux.cfg jm:/usr/src/linux-2.6.0-test8# cat /mnt/syslinux.cfg default linux
フロッピーディスクのカーネルイメージに対してフレームバッファ機能を使うように設定します。 2種類の方法があります。最初の方法は、2.4までと同様にカーネルのパラメータを直接 rdev コマンド で書き換えます。 フロッピーディスクをマウントしてカーネルイメージに対して rdev コマンドを 以下のように使うことで、起動時にビデオモードを指定できるようになります。
# mount /dev/fd0 /mnt # /sbin/rdev -v /mnt/linux -3
第2の方法は syslinux を設定します。 こちらの方が柔軟性がありますから、syslinux のドキュメントを読むことをお勧めします。 ここでは最小限の設定の例です。 syslinux.cfg は起動時のコンフィギュレーションを設定するファイルですが、 「default linux」と書かれた単なるテキストファイルになっています。 フレームバッファを試すために以下のように追加しておきます。 適当なエディタで /dev/hda5 の部分は使っているLinux環境に合わせて rootファイルシステムのあるパーティションに変更してください。
default linux root=/dev/hda5 append vga=ask
VESA モードのフレームバッファは起動時以外は変更できません. 次の表は指定できるビデオモードです
Colors | 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 or 32 bits | 312 | 315 | 318 | 31B | 31F |
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':_
メニューに表示されているモードはテキストモードなので、グラフィックモード では、例えば 31B と入力すると1280x768x32モードで コンソールが起動します。
ペンギンのロゴ とともに以下のような表示が起動時に現れます。
vesafb: framebuffer at 0xd8000000, mapped to 0xe0007000, size 8000k vesafb: mode is 1280x1024x32, linelength=5120, pages=0 vesafb: protected mode interface info at 00ff:44f0 vesafb: scrolling: redraw vesafb: directcolor: size=8:8:8:8, shift=24:16:8:0 fb0: VESA VGA frame buffer device
/dev/fb0 が存在していない場合、フレームバッファにアクセスできるようにノードを作成します。
# mknod -m 666 /dev/fb0 u 29 0
Cでプログラムを書くと次のような感じになります。
// ヘッダをインクルード #include <unistd.h> #include <sys/mman.h> // 略 // フレームバッファデバイスをオープンして fd = open("/dev/fb0", O_RDWR, 0); // フレームバッファをメモリにマップ p = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); // これで p[0] から p[size-1] の範囲に書き込むと画面に何か表示されます。 // フレームバッファをクローズ munmap(p, size); close(fd); // 略
アセンブラ (nasm) で作成したサンプルはここやここ にあります。