[概要][詳細][実験トップ]
情報システム実験:カーネルハック
- 担当教員
- 新城 靖 <yas@cs.tsukuba.ac.jp>
- 実施学期
- 春ABC
- 実験の概要
-
オペレーティング・システムのカーネル内で動作するプログラムの作成する。
新しいシステム・コールやデバイス・ドライバを追加する。VMware 等の仮想計
算機を用いる。
注意:この実験の課題は簡単そうに見えるかもしれないが、実際にはかなり難
しい。難しい課題に挑戦したい人、自分の腕前に自信がありそれを試したい人
に勧めるが、一般的には勧められない。
■連絡事項
- 2024/04/23
- 電子メールで連絡します。
@coins.tsukuba.ac.jp の電子メールを読んで下さい。
コンピューティング環境/mail環境
参照。
https://www.coins.tsukuba.ac.jp/webmail/
も使えます。
- 2024/04/23
-
この実験では、Manaba のコース
「
情報システム実験A K-12 カーネルハック
」
を使います。
レポート提出に使います。
このテーマを選択した人を、新城が登録します。
- 2024/04/23
-
2024 年度は、4月24日水曜日 13:45 から説明会を行います。
3C206実習室 の dahlia PC の近くに集まりなさい。
12:15から13:45 も、実験を進めなさい。
TA から SSD を受け取り、
以下の Wiki も含めて、Linux カーネルのコンパイル、お
よび、VMware Workstation の使い方に関する様々な資料を収集しなさい。
- 2024/04/20
- この実験では UEFI ブート可能な SSD を貸し出します。これは、3C206 に
ある dahlia PC (Dell Optiplex) で動作しますが、自宅にある PC でも、UEFI ブート可能ならば使えると思います。
(3C206 azalea PC では、使えません。)
- 2024/04/20
-
Wiki を作成しました。
実習室に来て着席した時に「出席」、退席する時に「退席」ボタンを押しなさい。
「一覧」で、過去の出席が確認ができます。
いずれも、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() などの関数によるアクセスも含む。
- ユーザ空間からポインタで渡されたデータは、カーネル空間にコピーして
から利用する。ポインタが不正な場合等に、コピーに失敗することがある。コ
ピーに成功したか失敗したかを必ずチェックする。
■レポート作成の注意
レポートには、次の項目を含めなさい。
◆プログラムの仕様
- 書く課題で、man ページと同程度の詳しさで仕様を記述しなさい。
- 引数の範囲、返り値、エラーの説明を含めなさい。
◆データ構造とアルゴリズム
◆実行結果
-
実行環境(仮想計算機モニタ、ホストOS等),および,実行結果を記載すること.
-
各課題で実行結果として、まず正しいパラメタが指定され、期待通りに正しく
動く例を示しなさい。プログラムがきちんと動作していることを示すために必
要かつ十分なものになるようにすること。
-
各課題で、実行結果として、不正なパラメタが指定されも、きちんとエラーが
返される例を、4例以上示しなさい。特に、ポインタとして不正なものが指定さ
れた時や、不正な長さが指定された時を含めなさい。(各課題で、4例以上。全
体で4例以上ではない。)
-
実行結果の入力部と出力部がはっきりとわかるように工夫すること.
-
実行例を考える際には,どういう例を付せば,実現すべき機能が動作していることを示せるかをよく考えること.
-
実行結果が付されていない機能に関しては,実現されなかったものとみなす.
◆開発環境
◆参考文献,感想
■関連ページ
Last updated: 2024/04/23 14:38:57
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>