kernel関係

更新日:03.07.16


目次

  1. はじめに
  2. カーネル関連
    1. ビルドの手順
    2. 組み込み
    3. カーネル履歴
  3. カーネルドライバ
  4. 参考文献
  5. リンク

はじめに

カーネル及びカーネルドライバについて簡単にまとめました。


カーネル関連


ビルドの手順の例

以下のように推奨されています。


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
#include 

int  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
先頭へ

リンク


先頭へ