[概要][詳細][実験トップ]
情報システム実験:カーネルハック
- 担当教員
- 新城 靖 <yas@cs.tsukuba.ac.jp>
- 実施学期
- 春ABC
- 実験の概要
-
オペレーティング・システムのカーネル内で動作するプログラムの作成する。
新しいシステム・コールやデバイス・ドライバを追加する。VMware 等の仮想計
算機を用いる。
注意:この実験の課題は簡単そうに見えるかもしれないが、実際にはかなり難
しい。難しい課題に挑戦したい人、自分の腕前に自信がありそれを試したい人
に勧めるが、一般的には勧められない。
■連絡事項
- 2022/03/18
- 電子メールで連絡します。
必ず @coins.tsukuba.ac.jp の電子メールを読んで下さい。
- 2022/04/18
-
2022 年度は、4月20日水曜日 13:30 から説明会を行います。
3C206実習室 の dahlia02 の近くに集まりなさい。
12:15から13:30 も、実験を進めなさい。
TA から SSD を受け取り、
以下の Wiki も含めて、Linux カーネルのコンパイル、お
よび、VMware Workstation の使い方に関する様々な資料を収集しなさい。
- 2022/04/18
-
この実験では、Microsoft Teams のチーム
「
GB36403_情報システム実験A_K-12_カーネルハック_2022
」
を使います。
説明会、質疑応答に使います。 教員が受講生をチームに登録します。
- 2022/04/18
- この実験では UEFI ブート可能な SSD を貸し出します。これは、3C206 に
ある PC (Dell Optiplex) と iMac (27inch, 画面が大きい方) で動作しますが、自宅にある PC でも、UEFI ブート可能ならば使えると思います。
(3C206/3C205/3C113の iMac 21inch では、使えません。)
- 2022/04/20
-
Wiki を作成しました。
- 2022/04/20
-
この実験では、Manaba のコース
「
情報システム実験A K-12 カーネルハック
」
を使います。
レポート提出に使います。
授業時間中に次のボタンを押しなさい。
次のボタンで、過去の出席が確認ができます。
いずれも、coins のユーザ名とパスワードが必要です。ユーザ名とパスワード
を打つ時には、SSL が有効になっていることを確認してください。また、URL
が https://idp.coins.tsukuba.ac.jp/
で始まっ
ていることを目で確認して下さい。
■実験課題
課題1-4を必須とする。課題5以降から2つ以上選択して回答しなさい。
◆課題1 カーネルのコンパイルとパラメタの設定
選択したカーネルのソース・プログラムを入手する。いくつかのパラメタを設
定し、コンパイルする。特に不要なデバイス・ドライバを外すことが、コンパ
イル時間を短縮し、実習を円滑に進めるために重要となる。
◆課題2 カーネルのリモート・デバッグ
gdb のリモート・デバッグ機能を用いて、カーネルのプログラムをデバッグ可
能な状態にする。簡単で、利用頻度が低いシステム・コールを選び、それを利
用するユーザ・プログラムを記述する。そして、そのプログラムを実行し、カー
ネル内をステップ実行で実行することで、そのシステム・コールの動作を理解
する。
◆課題3 システムコールの追加
最終的には、次のような条件をみたすシステムコールを追加する。
- ユーザ空間から引数を2つ以上とる。
- 引数のうち1つは、必ずの番地を指定する。番地の先には、可変長のデー
タがあるものとする。可変長のデータの置き方は、open() システム・コールや
read() システム・コール等、既存のシステム・コールと類似の方法を用いるこ
と。
- 結果を返す。結果は、レジスタか、または、与えられた番地に返す。
- 無効な引数とアクセス権に関してエラー処理を含む。
不正な番地が与えられた場合、エラー(EFAULTなど)を返す。
不正な整数が与えられた場合、エラー(EINVALなど)を返す。
次のような手順でプログラムを作成するとよい。
- システム・コールの番号を割り当てる。
- 他のシステム・コールにならい、エントリ関数を定義し、登録する。
最初は、何もしない関数、または、コンソールにメッセージを表示する
を登録する。最初は、引数がなくてもよい。
- ユーザ・プログラムからシステム・コールを発行するプログラムを
作成する。
- 4. を実行し、デバッガ等で動作を確認する。
- システム・コールの簡単なロジックを、ユーザ・レベルのプログラムで
記述し、動作を確認する。この時、カーネル内のAPIを利用する場合は、
ダミーの関数を定義する。
- ユーザ空間から引数を取り込む部分を記述する。
- 6. のロジックをカーネルに移動させる。
- 結果をユーザ空間に返す部分を記述する。
◆課題4 デバイス・ドライバの作成
次のような条件をみたすデバイス・ドライバを追加しなさい。
- open() により、なんなかの初期化を行う。
- write() によりデータをユーザ空間からコピーする。
- read() によりデータをユーザ空間にコピーする。
- ioctl() として3つ以上のサブコマンドを持つ。2つのうち1つは、内部
の状態を設定するもの、もう1つは、内部の状態を取得するものであること。
- これらのシステム・コールは、一般ユーザの権限でも実行できるようにす
ること。
◆課題5 /proc ファイル・システムの作成
/proc ファイル・システムを通じてアクセス可能なモジュールを作成しなさい。
提供する内容は、カーネル内にある動的に変化する可能性があるものとする。
読み込みのみ対応すればよい。
ファイルの読み書きは、一般ユーザの権限でも実行できるようにすること。
◆課題6 定期的な仕事
カーネル内で定期的に動作するプログラムを作成しなさい。
◆課題7 ファイルシステムの追加
VFS層に新たなモジュールを追加し、ファイル・システムを追加しなさい。
◆課題8 ユーザレベルでのファイルシステムの追加
FUSE、または、NFS RPCを用いて、ユーザレベルのプログラムで新たなファイル・
システムを追加しなさい。
◆課題9 特権命令の利用
カーネル内でしか実行できない特権命令を使うプログラムを作成しなさい。
◆課題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: 2022/04/20 17:51:33
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>