[概要][詳細][実験トップ]
情報システム実験:カーネルハック
- 担当教員
- 新城 靖 <yas@cs.tsukuba.ac.jp>
- 実施学期
- 春ABC
- 実験の概要
-
オペレーティング・システムのカーネル内で動作するプログラムの作成する。
新しいシステム・コールやデバイス・ドライバを追加する。VMware 等の仮想計
算機を用いる。
注意:この実験の課題は簡単そうに見えるかもしれないが、実際にはかなり難しい。
難しい課題に挑戦したい人、自分の腕前を試したい人に勧める。
一般的には、
システムプログラム
を薦める。
■連絡事項
- 2025/04/01
- 電子メールで連絡します。
@coins.tsukuba.ac.jp の電子メールを読んで下さい。
コンピューティング環境/mail環境
参照。
https://www.coins.tsukuba.ac.jp/webmail/
も使えます。
- 2025/04/01
-
この実験では、Manaba のコース
「
情報システム実験A K-12 カーネルハック
」
を使います。
レポート提出に使います。
このテーマを選択した人を、新城が登録します。
- 2025/04/22
-
2025 年度は、4月23日水曜日 13:45 から説明会を行います。
3C206実習室 の azalea24 の近くに集まりなさい。
12:15から13:45 も、実験を進めなさい。
TA から説明を聞き、
以下の Wiki も含めて、Linux カーネルのコンパイル、
および、仮想計算機モニタの使い方に関する様々な資料を収集しなさい。
- 2025/04/23
-
Wiki を作成しました。
- 2025/04/23
- レポートを2通、Manaba から提出しなさい。
- 中間レポート: 課題1から課題3まで。締切6月6日 17:00。
- 最終レポート: 課題4以降。締切8月6日 17:00。
実習室に来て着席した時に「出席」、退席する時に「退席」ボタンを押しなさい。
「一覧」で、過去の出席が確認ができます。
いずれも、coins のユーザ名とパスワードが必要です。ユーザ名とパスワード
を打つ時には、SSL が有効になっていることを確認してください。また、URL
が https://idp.coins.tsukuba.ac.jp/
で始まっ
ていることを目で確認して下さい。
■実験課題
課題1-4を必須とする。課題5以降から3つ以上選択して回答しなさい。
◆課題1 カーネルのコンパイルとパラメタの設定
選択したカーネルのソース・プログラムを入手する。いくつかのパラメタを設
定し、コンパイルする。特に不要なデバイス・ドライバを外すことが、コンパ
イル時間を短縮し、実習を円滑に進めるために重要となる。
レポートには、同じことを再び行う場合に必要な情報を含めなさい。
◆課題2 カーネルのリモート・デバッグ
gdb のリモート・デバッグ機能を用いて、カーネルのプログラムをデバッグ可
能な状態にしなさい。次の機能を利用しなさい。
- ブレークポイントの設定と実行継続
- ソースコードの表示
- バックトレース
- スタックフレームの選択
- ステップ実行
- 変数の表示
ブレークポイントやステップ実行には、利用頻度が高いシステム・コールを選
ぶと、やりにくいかもしれない。
あまり利用されないシステム・コールを使う既存のコマンドを実行するか、
自分でそれを利用するプログラムを作成して実行すると、やりやすい。
実験ではシステム・コールの実行回数の統計をとらなくても良い。
レポートには、その選択したシステム・コールをステップ実行した結果を含め
なさい。また、ステップ実行の結果、そのシステム・コールの動作を理解しな
さい。そして、そのシステム・コールの動作の簡単な説明をレポートに含めな
さい。
◆課題3 システムコールの追加
最終的には、次のような条件をみたすシステムコールを追加する。
- ユーザ空間から引数を2つ以上とる。
- 引数のうち1つは、必ずの番地を指定する。番地の先には、可変長のデー
タがあるものとする。可変長のデータの置き方は、open() システム・コールや
read() システム・コール等、既存のシステム・コールと類似の方法を用いるこ
と。
- 結果を返す。結果は、レジスタか、または、与えられた番地に返す。
これに加えて、次の
カーネル内で動作するプログラムの要件
を満たすこと。
この要件は、この課題に限らず、以下の課題でも同じように満たすこと。
- 無効な引数とアクセス権に関してエラー処理を含む。
不正な番地が与えられた場合、エラー(EFAULTなど)を返す。
不正な整数が与えられた場合、エラー(EINVALなど)を返す。
- メモリ・リークがない。kmalloc() 等で確保したメモリは、利用されな
くなった時に必ず開放すること。
カーネル内で確保するメモリの上限を設定し、
ユーザ空間からなされる、大きなメモリを確保させるような攻撃に耐える。
- スタック上に大きなデータを置かない。
- デバッグ目的を除き、printk() 等による表示をしない。
デバッグ終了後は、表示を削除すること。
次のような手順でプログラムを作成するとよい。
- システム・コールの番号を割り当てる。
- 他のシステム・コールにならい、エントリ関数を定義し、登録する。
最初は、何もしない関数、または、コンソールにメッセージを表示する
を登録する。最初は、引数がなくてもよい。
- ユーザ・プログラムからシステム・コールを発行するプログラムを
作成する。
- 4. を実行し、デバッガ等で動作を確認する。
- システム・コールの簡単なロジックを、ユーザ・レベルのプログラムで
記述し、動作を確認する。この時、カーネル内のAPIを利用する場合は、
ダミーの関数を定義する。
- ユーザ空間から引数を取り込む部分を記述する。
- 6. のロジックをカーネルに移動させる。
- 結果をユーザ空間に返す部分を記述する。
◆課題4 デバイス・ドライバの作成
次のような条件をみたすデバイス・ドライバを追加しなさい。
- open() により、なんなかの初期化を行う。
- write() によりデータをユーザ空間からコピーする。
- read() によりデータをユーザ空間にコピーする。
- read() と write() に大きなバッファを与えて1度に読み書きした時と、
小さなバッファを与えて繰り返し呼び出した時と、同じ内容が読み書きできる
こと。
- ioctl() として3つ以上のサブコマンドを持つ。そのうち1つは、内部
の状態を設定するもの、そのうち1つは、内部の状態を取得するものであること。
- これらのシステム・コールは、一般ユーザの権限でも実行できるようにす
ること。
◆課題5 /proc ファイル・システムの作成
/proc ファイル・システムを通じてアクセス可能なモジュールを作成しなさい。
提供する内容は、カーネル内にある動的に変化する可能性があるものとする。
読み込みのみ対応すればよい。
read() と write() に大きなバッファを与えて1度に読み書きした時と、小さ
なバッファを与えて繰り返し呼び出した時と、同じ内容が読み書きできること。
lseek() システム・コールに対応すること。
ファイルの読み書きは、一般ユーザの権限でも実行できるようにすること。
◆課題6 定期的な仕事
次の2つの方法で、カーネル内で定期的に動作するプログラムを作成しなさい。
両者の利点を比較しなさい。
- カーネル・スレッドを用いる方法。
- Linux struct timer_list, Linux struct hrtime,
BSD struct callout_handle 等を用いる方法。
◆課題7 ファイルシステムの追加
VFS層に新たなモジュールを追加し、ファイル・システムを追加しなさい。
◆課題8 ユーザレベルでのファイルシステムの追加
FUSE、または、NFS RPCを用いて、ユーザレベルのプログラムで新たなファイル・
システムを追加しなさい。
◆課題9 トレース機能の利用
次のようなカーネルが持っているトレース機能を1つ1上利用しなさい。
- eBPF, perf, ftrace
- DTrace
- SystemTap
- Kprobes
- その他類似の機能
◆課題10 その他
その他、課題4-9と同等の難易度を持つ課題を設定し、取り組む。設定する課
題については、担当教員と相談して決定すること。
◆課題11 別のオペレーティングシステムでの実験
課題3-10を、それとは別のオペレーティング・システムで実施しなさい。たと
えば、課題3を Linux で行なったならば、課題3 を FreeBSD で行いなさい。
■ヒント
- 既存のファイルに自分のコードを追加すると、Makefile 等の修正は不用
になる。
- コンパイルする時、ヘッダファイルは、ホストの /usr/include の下に
あるものではなく、開発中のカーネルのものを利用する。それには、gcc の
-I オプションを使うとよい。
- ユーザ空間から渡されたポインタ(メモリの番地)を信用してはならない。
ポインタを利用する前に検査する必要がある。一般的には、ユーザ空間とカー
ネル空間は別のプログラムなので同じ番地でも別の内容を含むことがある。た
だし、x86 アーキテクチャでは、ユーザとカーネルでアドレス空間が同じにし
ている OS が多い。
ポインタの利用には、strlen() などの関数によるアクセスも含む。
- ユーザ空間からポインタで渡されたデータは、カーネル空間にコピーして
から利用する。ポインタが不正な場合等に、コピーに失敗することがある。コ
ピーに成功したか失敗したかを必ずチェックする。
■レポート作成の注意
レポートには、次の項目を含めなさい。
- レポートは、ワードプロセッサ、または、LaTeX 等文書整形システムを
用いて作成すること。
- ワードプロセッサを用いる時には、
コンピュータリテラシの資料
を参考にして、必ずスタイルを使うこと。図はページの端に寄せること。レポー
トにプログラムを含める時には、そのためのスタイルを定義し、「文字数と行
数」で、「標準の文字数を使う」を調整し、1ページに60行程の行間で含める
こと。
- レポートには必ず図を含めること。図にはキャプションをつけ、本文中
から図番号で参照すること。Markdown を使うものは、図の扱いが弱いので、
レポート作成には適していない。
- 作成したプログラムを記載すること.シンタックス・ハイライトを無効
にすること.プログラムの表示で色を使うのは、レポートで強調したい所だけ
にすること.
- 各課題でアルゴリズム,方式,内部動作の説明 プログラム中で使用しているアルゴリズムや方式の採用理由とその内容を分かりやすく説明すること.
- 最終的に A4 用紙 (PDF) を作成して提出する。
◆プログラムの仕様
- 各課題で、man ページと同程度の詳しさで仕様を記述しなさい。
- 引数の範囲、返り値、エラーの説明を含めなさい。
◆実行結果
◆開発環境
-
プログラム開発に使用したプログラミング言語,言語処理系,オペレーティングシステム,計算機機種,ライブラリ等を記載すること.
◆参考文献,感想
-
プログラミングおよびレポート作成の際に参考にした参考文献を記載すること.
-
プログラムの作成に要した時間,および,本レポートの作成に要した時間を記載すること.プログラムモジュールごとの開発時間を記載してもよい. プログラミングおよびレポート作成の際の感想を記載すること.
■関連ページ
Last updated: 2025/04/23 14:47:28
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>