Linuxのカーネルの開発に関する世界観(ソースコード・カーネルモジュール)です。
実際にカーネルの探索を行う場合は、「どこから見るべきか」が以下のページに書いてあるので、参照してください。
以下からgitリポジトリの中の実際のコードを探すことができます。
基本的にinit/main.cの中の「start_kernel()」から読めば良い。
最後のarch_call_rest_init()からrest_init()を呼び、その中のcpu_startup_entry()を呼ぶ。
cpu_startup_entry()はkernel/sched/idle.cにある。
そして、do_idle()でアイドルループに入る。
(Linuxのブートプロセスを追うときに見るべきファイル(x86_64編) - Qiitaを参考に執筆しました。このページは今のカーネルの読み方について詳しい。)
Linuxカーネルは、手動でコンパイルすることで、さまざまなオプション機能を有効にしたり、無効にしたりすることが出来る。各機能は有効・無効あるいは動的にいつでも読み込めるモジュールにすることができる。
カーネルの手動コンパイルの方法は、
1.まず、カーネルソースを展開する。Linuxシステムにおいて、Linuxカーネルのソースコードを保管する一般的なディレクトリとしては、/usr/src/linux-*などとなる(*はバージョン)。/usr/src/linuxにリンクを張ることが多い。
2.以下のコマンドで、クリーンナップを行う。
make clean && make mrproper
3.以下のコマンドで、カーネルの機能の有効・無効を設定し、.configファイルを吐き出す。
make menuconfig
4.以下のコマンドで、カーネルやカーネルモジュールをコンパイルする。
make && make modules_install
5.以下のコマンドで、ブートパーティションにbzImage(カーネルイメージ)をインストールする。
make install
Linuxカーネルをコンパイルするにあたって、良く設定するのはCPU関係とファイルシステム関係のサポートだ。特に以下のような設定をするかもしれない。
File systems ---> <*> Second extended fs support <*> The Extended 3 (ext3) filesystem <*> The Extended 4 (ext4) filesystem <*> Reiserfs support <*> JFS filesystem support <*> XFS filesystem support <*> Btrfs filesystem support DOS/FAT/NT Filesystems ---> <*> MSDOS fs support <*> VFAT (Windows-95) fs support Pseudo Filesystems ---> [*] /proc file system support [*] Tmpfs virtual memory file system support (former shm fs)
それ以外の詳しい設定項目については、カーネルの設定 - Gentoo Wikiが参考になる。
以下はカーネルのコンパイルについてのリンク。カーネルのコンパイル方法はバージョンとともに良く変わるので、上の方法は古い可能性があります。必ず下のリンクのような情報から、そのコンパイルしようとしているバージョンのカーネルのコンパイル方法について調べた上で、コンパイルを行ってください。
ncursesも参照のこと。
自分でLinuxのプログラムをコンパイルしたい時に、カーネルヘッダーが必要となる時がある。カーネルのAPIを使うプログラムをコンパイルするために必要。
カーネルヘッダーは、少し前の状況だと、カーネルがメジャーアップデートされた場合(2.4から2.6への移行の時など)、プログラムが正常に動かなくなったり、コンパイルできなくなる時があった。なので、大切な基盤システムなどでは、注意してアップデートすること。
カーネルヘッダーだけではなく、gcc, glibc, pythonなどの重要コンポーネントは、メジャーアップデートに失敗すると悲惨なことになる。Red Hatの開発者などでも、注意して開発している。特に、Pythonなどは本当に動かなくなる(Python2とPython3には全く互換性がない)。気を付けてシステムを管理しよう。
最近のLinuxカーネルでは、モノリシックカーネルでありながら実行時に動的に機能を追加・削除する仕組みとして、カーネルモジュールを使用したモジュール化が進んでいます。
モジュール化を行うために、メモリ上の任意の場所にコードやデータを追加できる、実行ファイル形式ELFを使います。
ELFにより、実行中のソフトウェアに新しいコードを追加することができます。
詳しくは以下の記事が参考になります。
カーネルモジュールは*.koという拡張子で、/lib/modules/にある。
カレントディレクトリにあるkoファイルのロードは以下のようにする。
# insmod hoge.ko
ロードされたドライバはlsmodで確認できる。
# lsmod (ドライバが表示される)
アンロードはrmmodで行う。
# rmmod hoge
modprobeコマンドを使うことで、カレントディレクトリのkoファイルではなく、「/lib/modules/`uname -r`」からドライバを探す。RCスクリプトなどでLinux起動時にドライバをロードしたい時などによく使われる。
カーネルモジュールを手動で読み込むためには、/etc/modules-load.d/*.confに読み込みたいモジュールを記述する。
モジュールのオプションは/etc/modprobe.d/*.confに記述する。
基本的にはudevが自動で検知したハードウェアのモジュールを読み込むため、手作業で行う必要は稀である。
lsmodはカーネルモジュールの状態を表示する。insmodはモジュールを読み込み、rmmodはモジュールを取り出す。
以下を参照のこと。
今使用しているカーネルのバージョンを調べるには、unameコマンドを使う。
$ uname -a
オプションは、-a(すべての情報を表示)、-r(カーネルのバージョンを表示)、-n(ホスト名を表示)、-p(プロセッサの種類を表示)。
/etc/sysctl.confは、カーネルパラメータの設定をチューニングするファイル。カーネルのあらゆる設定を変更できる。
このファイルの記述は、/proc/sys/以下にあるパラメータに反映される。設定できる項目の一覧はsysctl -aコマンドを実行すれば表示される(ただしめちゃくちゃ多い)。
カーネルのコンパイルやモジュールなどの管理については、RHELとGentooとArchのガイドが参考になる。
特に以下のArchのガイドは分かりやすくて参考になる。カーネルモジュールを管理する場合は一読の必要あり。
ZEN KernelはカスタムLinuxカーネルのひとつ。「カーネルハッカーたちの知恵の結晶」であるとのこと(カーネル - ArchWikiより)。
日本のLinuxディストリビューションAlter Linuxで採用されている。
libcについてはlibcを参照のこと。
GNUツールチェインについてはGNUツールチェインやMakeを参照のこと。
コマンドのソースコードについてはソースからのインストールやUNIXコマンド(基本)を参照のこと。