&size(24){&color(darkgreen){''Kernel 2.6''};}; #navi(Linux) ~''CONTENTS'' #contents ---- ~''REFERENCES'' -[[The Linux Kernel Archives>http://www.kernel.org/]] -[[Linux 2.6 へ>http://www-6.ibm.com/jp/developerworks/linux/031121/j_l-inside.html]] -[[Linux: Kernel Release Numbering >http://www.kerneltrap.org/node/4793]] ---- **はじめに[#la638f81] ~kernel-2.6 のバージョンも 2桁になった。そろそろまじめに、kernel-2.6 のお勉強をしましょう。kernel-2.4もそれほど勉強したわけではないが…。現在は、移行期間みたいな感じでそんなに、普及している感はないような気がするが、当然あと何ヶ月かすると、2.6ばっかになるんだろーなー。とういことで、UNIX USER 2004/3 〜 2004/9の連載"GCC プログラミング工房 --Linuxカーネル2.6実習編--"に沿ってお勉強。 :) -kernel-2.6の概要 --2.6は、2.4のチューニングといった意味合いが強く、機能として大きく変わったところは、あまりない。 -kernel-2.4からkernel-2.6の変更点概要 |~分類|~機能概要| |大規模システム向けの強化|多数のプロセスがあっても、複数のCPUに効率的に振り分けられるよう、新しいプロセススケジューラーであるO(1)スケジューラーを導入| |~|多数のCPUでの効率的な動作のために、ロックのさらなる細粒度化と新しい排他方式の導入| |~|Linux2.4までは遅延処理をtaskqueueで行っていたが、各CPUで並列に動作するworkqueueに書き直し| |~|大量のメモリを積んでいる場合にも効率よく処理ができるよう、バウンスバッファの処理の改善| |~|バッファキャッシュが廃止され、ブロックデバイスに対するI/Oがページ単位に(bioインターフェース)| |~|大規模システムでは、CPUに対してメモリアクセス時間が一様でないものがある。2.6では、メモリの確保時に近いところから確保したり、プロセスのスケジューリングもこれを意識するようになった。(NUMA対応)| |~|LVM2(Logical Volume Manager)| |~|ジャーナリングファイルシステム(Ext3、ReiserFS、XFS、JFS)| |~|非同期I/Oの追加| |~|Huge TBLの導入| |組込みシステム向けの強化|組込み向けCPU(とくにMMUを持たないCPU)への対応| |~|不要な機能を削り、カーネルサイズを抑えるオプションの追加| |~|新I/Oスケジューラー(Deadlineスケジューラー、anticipatoryスケジューラー)| |~|カーネルプリエンプション機能(応答性が重要になる用途向けに、カーネルの内部処理を実行中でも処理を切り替える機能)| |そのほかの強化|セキュリティ機能の強化| |~|ネットワーク機能の強化| |~|新サウンドドライバ(ALSA)の追加| |~|USBドライバの強化| |~|電源管理機能の強化| |~|カーネル構築方法の改善| **第1回 makeターゲットをマスターせよ [#nf4bcd34] -2.4から変わったとこ -- make dep が無くなった -- ビルドディレクトリの指定が可能になった (O変数 or 環境変数KBUILD_OUTPUT で指定 O変数優先) ---これで違うアーキテクチャとか、違うコンフィギュレーションとかでも1つのソースツリーでいけるってことかな? # make O=/usr/src/kernel-2.6.x/build bzImage (とか、もしくは) # export KBUILD_OUTPUT=/usr/src/kernel-2.6.x/build # make bzImage -- 組込み向けオプションと最適化スイッチが追加されている --- CONFIG_EMBDDEDを有効にすると、不要なカーネルオプションを徹底的に削り込むことができる --- CONFIG_CC_OPTIMAIZE_FOR_SIZEを有効にすると、gcc の最適化が、O2=>Osになる。~ (これ前からなかったっけ?ちなみにリナザウは、この最適化オプションだった…) --カーネルの設定を埋め込むことができる --- CONFIG_IKCONFIGを有効にすると、/proc/config.gzでカーネルのコンフィギュレーションが参照できる -make help (こんなにたくさんターゲットあるんですね…) # make ARCH=sh help Cleaning targets: clean - remove most generated files but keep the config mrproper - remove all generated files + config + various backup files Configuration targets: oldconfig - Update current config utilising a line-oriented program menuconfig - Update current config utilising a menu based program xconfig - Update current config utilising a QT based front-end gconfig - Update current config utilising a GTK based front-end defconfig - New config with default answer to all options allmodconfig - New config selecting modules when possible allyesconfig - New config where all options are accepted with yes allnoconfig - New minimal config Other generic targets: all - Build all targets marked with [*] * vmlinux - Build the bare kernel * modules - Build all modules modules_install - Install all modules dir/ - Build all files in dir and below dir/file.[ois] - Build specified target only rpm - Build a kernel as an RPM package tags/TAGS - Generate tags file for editors cscope - Generate cscope index checkstack - Generate a list of stack hogs Kernel packaging: rpm-pkg - Build the kernel as an RPM package binrpm-pkg - Build an rpm package containing the compiled kernel & modules deb-pkg - Build the kernel as an deb package Documentation targets: Linux kernel internal documentation in different formats: sgmldocs (SGML), psdocs (Postscript), pdfdocs (PDF) htmldocs (HTML), mandocs (man pages, use installmandocs to install) Architecture specific targets (sh): zImage - Compressed kernel image (arch/sh/boot/zImage) adx_defconfig - Build for adx cqreek_defconfig - Build for cqreek dreamcast_defconfig - Build for dreamcast hp680_defconfig - Build for hp680 rts7751r2d_defconfig - Build for rts7751r2d se7300_defconfig - Build for se7300 se7751_defconfig - Build for se7751 snapgear_defconfig - Build for snapgear systemh_defconfig - Build for systemh make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build make O=dir [targets] Locate all output files in "dir", including .config make C=1 [targets] Check all c source with checker tool Execute "make" or "make all" to build all targets marked with [*] For further info see the ./README file *** Rebuild [#l47f002d] # vi Makefile EXTRAVERSION = -REDMAGIC1.0 とか。 # make bzImage # make modules # make modules_install # installkernel 2.6.x-REDMAGIC1.0 arch/i386/boot/bzImage System.map **第2回 SYSLINUXの秘密 [#g828b29a] - SYSLINUXとは、様々なディストリビューションのインストール用起動ディスクなどに使用されているブートローダー - 2.4では、bzImageをFDにべた書きすれば、カーネルが起動したが、2.6では、SYSLINUXを使わないとダメなんだって。 -とりあえず知りたいのは、(b)zImageのビルドまでと、module関連。 -ここはあんまり用事ないので、SKIP **第3回 /usr/includeディレクトリの謎 [#c83c8634] - /usr/include に含まれる include header file ++ kernel に依存したヘッダーファイル : /usr/include/linux ++ CPUアーキテクチャに依存したヘッダーファイル : /usr/include/asm ++ ライブラリヘッダーファイル : 上記以外のファイル - 2.4では -- /usr/include/linux と /usr/include/asm にカーネルソースのincludeからシンボリックリンクを張っても問題なく、カーネルをビルドできる。 - 2.6では -- (kernel-source)/include/asm は存在しない。2.4では、カーネルコンフィギュレーションをすると、$ARCH で指定されている、アーキテクチャのシンボリックリンクが作成されていたが、2.6では、ビルドディレクトリの指定が可能になったため、存在しない。 -- (kernel-source)/include/asm-generic が追加されている - とりあえず symbolic link -- kernelをビルドするためには、まずユーティリティプログラムをビルドする必要がある。こいつは、$HOSTCC でコンパイルされるため、きちんとした、インクルードの設定がなされていないと、エラーとなる? ++ /usr/src/linux => /usr/src/(kernel-source) ++ /usr/include/linux => /usr/src/linux/include/linux ++ /usr/include/asm => /usr/src/linux/include/asm-($ARCH) ++ /usr/include/asm-generic => /usr/src/linux/include/asm-generic - 注意点 --本来ライブラリをビルドするのにも、カーネル依存のヘッダファイルや、CPU依存のヘッダファイルが必要である。そのため/usr/includeにシンボリックリンクを張るやり方は、稼動中のライブラリと、カーネルヘッダの整合性がとれない問題点がある。安定性を求めるなら、新しいカーネル用のライブラリを1からビルドしたほうがいいらしい… **第4回 GCCソースツリーから理解するインクルードの極意 [#h93ee9aa] -この回では、gccのインクルード検索パスなんかの説明がされている。 -インクルードにおける、検索パスの操作オプション |~フルスペル名|~省略名|~機能| | \-\-no-standard-include | -nostdinc | 初期検索パスのリセット | | \-\-include-directory | -I | 検索パスに追加 | | \-\-include-barrier | -I- | -I- より前に-Iで指定されているdirectoryが、quote_includeリストに追加され、-I- より後に指定されているdirectoryが、bracket_includeリストに追加される| **第5回 モジュール対決2.4vs2.6 [#b092035b] - ようやく本番って感じですかね :) - とりあえずモジュールのビルドの仕方は違う。 -- 2.6におけるモジュール作成方法 +++カーネル2.6.xソースツリーを展開 +++トップディレクトリ上で「make menuconfig」(xconfig)を一度実行する トップディレクトリに .config が作成される オプション設定内容を反映した include/linux/autoconf.h が作成される +++「make prepare-all」を実行する include サブディレクトリ内部において、ターゲットアーキテクチャ用のヘッダーファイルを格納する asm-xxx へのシンボリックリンク asm が作成される +++ Makefile 及びモジュールソースを用意する +++次のオプション付きで make modules を実行する 「-C /usr/src/linux-2.6.x」: カーネルソースツリーの指定 「SUBDIRS=$PWD」: モジュールソースディレクトリの指定 -- Makefile (ks2k-linux) 例 KERNEL_VERSION = $(shell uname -r) KERNEL_SRC = /lib/modules/$(KERNEL_VERSION)/build SUBDIR = $(shell pwd) all: modules obj-m := ks2k_cb.o ks2k_cb-objs := ks2k_pci.o ks2k_net.o ks2k_param.o dfu.o host_if.o rec.o send.o EXTRA = -DREDHAT9 modules: $(MAKE) -C $(KERNEL_SRC) EXTRA_CFLAGS='$(EXTRA)' SUBDIRS=$(SUBDIR) V=1 modules clean: rm -f core *.o *~ a.out *.d rm -f *.s *.i rm -f *.ko *.mod.c .*.cmd rm -f .*.ko .*.mod.c .*.cmd .*.d rm -rf .tmp_versions -- 注意点 ---上記の操作をした後カーネルをサブディレクトリ内でビルドしようとすると、エラー終了してしまう。 TOPDIR/.config TOPDIR/include/asm が、存在するとアボートする ---単一ソースツリー上で、サブディレクトリ内でのビルド方法とトップディレクトリ上でのビルド方法を同時に利用することは、できない。 --- TOPDIR/Makefile の prepare1 ターゲットを編集することで回避できる **第6回 insmodコマンドを自作しよう! [#a06980d4] - insmod コマンドの説明。 -- 2.4用 と 2.6用は違うらしい… --26のinsmodは-fオプションがきかない **第7回 2.6モジュールを自作しよう! [#a5dbf4f3] -セクションの説明 --基本セクション |~セクション|~配置されるもの| |.text|命令コード| |.data|初期化済みデータ| |.bss|初期化されていないデータ| |.rodata|定数データ| --2.6モジュールの特殊セクション +++ .modinfo : これは、2.4にもある +++ __versions +++ .gnu.linkonce.this_module