[HOME]

Linux Kernel 2.6 のフレームバッファ

copyright (C) 2003 Jun Mizutani (mizutani.jun@nifty.ne.jp)

フレームバッファを使う

penguin

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モードで コンソールが起動します。

penguin

ペンギンのロゴ とともに以下のような表示が起動時に現れます。

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) で作成したサンプルはここここ にあります。


[HOME]
ご意見・ご感想は、こちら まで。