🐧

カーネルハック 振り返り

#school#tech#Linux

2023-9-5

現在の所属先の1つである,筑波大学情報学群情報科学類では卒業したいのであれば3年次に主専攻実験と呼ばれる講義を受講する必要がある.

これはいくつかの実験の中から自分の興味などに合わせて春学期と秋学期に独立した2つを選択する形式になっている.今回,この中から春学期にカーネルハックを選択し,受講したのでその模様を書く.ただしpublicな場所にやったことを詳細に書きすぎてはいけないと言われているので概要を浚うのみ.

おそらく唯一講義のページで脅しをかけている実験であり,例年受講者も少ないので感想のサンプル数を1増やすのは多少の意義があるのではないだろうかと思っている.

注意:この実験の課題は簡単そうに見えるかもしれないが、実際にはかなり難 しい。難しい課題に挑戦したい人、自分の腕前に自信がありそれを試したい人 に勧めるが、一般的には勧められない。

行った課題

講義のページには全部で10個の課題が掲載されているが,その内

  • 課題1 カーネルのコンパイルとパラメタの設定
  • 課題2 カーネルのリモート・デバッグ
  • 課題3 システムコールの追加
  • 課題4 デバイス・ドライバの作成
  • 課題5 /proc ファイル・システムの作成
  • 課題6 定期的な仕事
  • 課題8 ユーザレベルでのファイルシステムの追加

をやった.全て実験を開始した当時LTSだったLinuxカーネルのLinux 6.2.12を用いた.

課題1 カーネルのコンパイルとパラメタの設定

カーネル自炊.まあ普通にやるとできる.不要なパラメーター外しは

$ make -j $(nproc)

の際に出力に特定企業名が含まれているならまだ外す余地があるなあみたいな雑な基準で行った.

課題2 カーネルのリモート・デバッグ

gdbを使って適当なシステムコールをフックしてみる課題.コールされる頻度が高いシステムコールをフックするとすぐカーネルが止まってきびしいので適当にgetcpuを選んだ.適当にプログラムを書いてアタッチすると良い.

課題3 システムコールの追加

新しいシステムコールを自炊する課題.システムコールテーブルの中身をはじめて見たが,

# don't use numbers 387 through 423, add new calls after the last

# 'common' entry

が途中にあって罠だなあと思った.

課題4 デバイス・ドライバの作成

デバイスドライバ自炊.デバドラの中でルービックキューブを回したくなった(?)のでそれを作ることにした.名前はrubikscubemawasukun.

open/close/read/write/ioctlの各システムコール(ioctlについては3個)を実行できるようにデバイスドライバを作る必要がある.

例えば回すキューブをグローバル変数として持っておくと異なるファイルディスクリプタで開かれた際の挙動がおかしくなるからこういった類のファイルディスクリプタに紐づけたいデータはstructにまとめておいてopen時にkmallocしたものをfile構造体中のprivate_dataに渡してあげると参照が楽になって良い.

ioctlの1つでは,openされてから今までに行われた回転が記録されているので,整数nを指定してn手前の状態を取得するリクエストを作成したが,これにあたって今までに行われた回転記号をストアする目的でvectorの様な動的配列が欲しくなったので実装した.

課題5 /proc ファイル・システムの作成

/procを介してアクセスできるカーネルモジュールを作成する課題.まあ雑にカーネル内にスタックを保持しておいてRPNができる計算機モジュールを作った.若干バリデーションがしんどかったが,まあそれくらい.seqファイルシステムを使ったのでこの辺の理解が促進された.

課題6 定期的な仕事

やるだけ.jiffiesなどについて理解を深めていたときにLinux 6.6にMulti-grained timestampが導入されそうな話を見るなどして面白かった.

課題8 ユーザレベルでのファイルシステムの追加

普通にFUSEを使うと楽.AVL木を実装して,エントリをノードとして扱った.AVL木を使ったのは自己満.

後はまあfuse_operations構造体に関数エントリを追加していって実装したい機能を作るだけ.結局open/read/readdir/getattr/write/mkdir/createあたりに対応した.これはユーザーランドでコネコネするのでカーネルハックなん?という疑問はある.

レポート

最後にやった内容をまとめたレポートを提出する必要があったが,これが激重だった.LaTeXで2600行を超えて11ptで書いたんだけど本文だけでA4で64枚だった.本当に何?

そもそもコードを載せているからそれなりに長くはなるのだが,説明で不必要に深入りしすぎた部分は結構あったと思うし,もう少し短くできると良かったなあと思っている(が,実装したコードは全て掲載しろと言われたので...).

感想

今年の履修者は5人で,その内任意の2人の知り合い関係のホップ数のmaxが2であったので楽しく実験を行えた.実験後に突然レンタカーで土浦まで行くなどのイベントが多々突発的に発生した.一般に知り合いは多い方が良いとされているらしい.

また,実験内で扱う題材はシスプロに気持ちが無くても知っておくと良い基礎知識をカバーできるのでその辺に気持ちが無いからといって履修の検討を止めるのは勿体ないと感じた.

また,実験中にはbootlinオペレーティングシステムⅡに簡単にアクセスできるようにしておくと便利.