更新日:03.07.16
カーネル及びカーネルドライバについて簡単にまとめました。
以下のように推奨されています。
1. ブートディスクの作成 1.a redhat系の場合 mkbootdsk 1.b redhat系以外、mkbootdskが無い場合 フォーマット済みFDの準備、DOSディスクでも構わない。 カーネルファイルをFDに書き込む dd if=/boot/vmlinuz-2.2.12-32 of=/dev/fd0 ルートデバイスの指定 rdev /dev/fd0 /dev/hda1 2. カーネルのビルド cd /usr/src/linux make xconfig X Windowsの場合 make menuconfig テキストベースの場合 /usr/src/linux/.config 選択した結果の出力ファイル 3. カーネルビルド make dep 最初のビルド、カーネルバージョンアップ時に実施 make clean bzImage modules modules_install 4. カーネルのインストール 4.a slackware、Plamo Linux などの場合 make bzlilo 4.b redhat系の場合 mkinitrd /boot/initrd-2.2.14.img 2.2.14 /sbin/installkernel 2.2.14 arch/i386/boot/bzImage System.map 5. liloの書き換え vi /etc/lilo.conf image 部分を新規に作成したkernelに lilo 6. ローダブルモジュールのロード modprobe module_name /lib/modules/2.2.14/*.o に格納 kerneld で必要に応じて自動的にロード/アンロードも
ブートディスクなどを作成しない場合は、以下のようにするだけでも十分である。 liloを使用せず、grubのみ場合。RH7.3などで実績あり。
cd /usr/src/linux make mrproper 最初に必須 make menuconfig 機能を取捨選択 make dep clean bzImage modules コンパイル make install modules_install インストール vi /etc/grub.conf 必要に応じて編集
mkbootdisk --device /dev/fd0 `uname -r`
デフォルトのカーネルコンフィグレーション(.config)のディレクトリ www.kernel.org 等から、直接持ってくる。intel版のRedHatには、ppcなどは含まれない。
/usr/src/linux-2.4.19/arch/i386 /usr/src/linux-2.4.19/arch/ppc/configs/ など
make ARCH=ppc menuconfig make ARCH=ppc CROSS_COMPILE=powerpc-linux- clean dep zImage modules vi Makefile ARCH=ppc、CROSS_COMPILE=powerpc-linux- など編集 /usr/local/src/linux-2.4.13-ac8/arc/ppc/boot/images/zImage.embedded 必要に応じて、file,powerpc-linux-size,powerpc-linux-objdumpで調査
http://www.redhat.co.jp/support/errata/及び http://www.kernel.orgで調査した結果です。
kernel及びそのデバイスドライバの開発にはC言語を使用します。 C言語の標準関数が使用できますが、浮動小数点演算はできません。 一般に開発対象のカーネルのバージョンは現在、2.0.x, 2.2.x, 2.4.xです。 OS特有の関数はカーネルのバージョン毎に異なっています。 つまり、2.4用に開発したデバイスドライバソースは2.0及び2.2では動作しない確率が高く、 他のバージョンのカーネルに移植する場合は、書き換えが必要なことが多い。 2.0と2.2及び2.4の差は大きいが、2.2と2.4の差は小さい。 現在主流のカーネル2.4のとても簡単なカーネルプログラムを紹介します。
kernel 2.3.18-3 (RedHat Linux 7.3)を使用。 必ず、一度はカーネルの再構成をし、再構成したカーネルで再起動する。
# cat hello.c #define MODULE #includeint init_module(void) { printk("<1>Hello, world\n"); return 0; } void cleanup_module(void) { printk("<1>Goodbye cruel world\n"); } # gcc -I/usr/src/linux-2.4.18-3/include -c hello.c # insmod hello.o Warning: loading hello.o will taint the kernel: no license # lsmod Module Size Used by Tainted: P hello 748 0 (unused) autofs 11812 0 (autoclean) (unused) eepro100 20176 2 ide-cd 30176 0 (autoclean) cdrom 32096 0 (autoclean) [ide-cd] ext3 66304 1 (autoclean) jbd 48856 1 (autoclean) [ext3] # rmmod hello # lsmod Module Size Used by Tainted: P autofs 11812 0 (autoclean) (unused) eepro100 20176 2 ide-cd 30176 0 (autoclean) cdrom 32096 0 (autoclean) [ide-cd] ext3 66304 1 (autoclean) jbd 48856 1 (autoclean) [ext3] # tail /var/log/messages Apr 9 11:10:18 host_name kernel: Hello, world Apr 9 11:10:33 host_name kernel: Goodbye cruel world # 誤ったインクリュードファイルを読み込んだ時 # gcc -c hello.c In file included from hello.c:2: /usr/include/linux/module.h:60: parse error before `atomic_t' /usr/include/linux/module.h:60: warning: no semicolon at end of struct or union /usr/include/linux/module.h:60: warning: no semicolon at end of struct or union /usr/include/linux/module.h:62: parse error before `}' /usr/include/linux/module.h:62: warning: data definition has no type or storage class /usr/include/linux/module.h:91: parse error before `}' 違うバージョンのモジュール(*.o)を読み込もうとした時 # insmod ./hello.o ./hello.o: kernel-module version mismatch ./hello.o was compiled for kernel version 2.4.7-10 while this kernel is version 2.4.18-3c. KDB http://oss.sgi.com/projects/kdb echo 1 > /proc/sys/kernel/kdb その他 gcc -D__KERNEL__ -DMODULE -O -Wall -c aaa.c /etc/syslog.conf tail -f /var/log/messages echo 1 > /proc/sys/kernel/sysrq objdump -x ls make > make.out 2>&1 & tail -f make.out
TECH I Vol.5 技術者のためのUNIX系OS入門 CQ出版社 \2200 kernel 2.2デバイスドライバなど TECH I Vol.13 エンジニアリングLinux応用技法 CQ出版社 \2200 kernel 2.2 & 2.4デバイスドライバなど TECH I Vol.16 組み込みLinux入門 CQ出版社 \2200 LINUXデバイスドライバ ALESSANDRO RUBINI 著 オライリー・ジャパン \4800 kernel 2.0 LINUXデバイスドライバ 第2版 ALESSANDRO RUBINI, JONATHAN CORBET 著 オライリー・ジャパン \5500 kernel 2.0 & 2.2 & 2.4