xv6
MIT の教育用 OS
https://pdos.csail.mit.edu/6.828/2012/xv6.html
https://github.com/mit-pdos/xv6-public
講義資料
ざっと見た感じめっちゃわかりやすそうだ
この神の資料がタダなのバグだろ
中学英語の範囲で読める……読めるぞ……!になってる
UNIX V6 を x86 用に作りなおしたやつ
あとでみる
PTE
Chapter 3 Traps, interrupts, and drivers
制御をユーザープログラムからカーネルへと戻さなければならないイベントを解決する
プロセッサ、カーネル、デバイスの切り替えとか相互の連携をうまくやる
割り込み
ハードウェアデバイスによって生成される信号
OS(カーネル)の処理が必要
WTDB trap & interrupt?
トラップ: プロセッサ上で実行中の「現在のプロセス」によって引き起こされるもの(例:システムコールの発行)
割り込み: 「外部デバイス」によって引き起こされるもので、現在実行中のプロセスとは無関係である可能性があるもの
ユーザーモードとカーネルモードの間で制御を転送させるのは一緒 同じハードウェアメカニズムに依存している
だいたいのやりかた
1. 通常のプロセッサループを停止
2. 割り込みハンドラの実行を開始しようとする
3. プロセッサが現在のレジスタを保存
4. 割り込みハンドラの実行開始
割り込みくるたびにせかせかお片付けするOSちゃんかわいいね
x86 の保護メカニズム
x86の特権レベル(0~4)
基本的には 0(最高特権) と 3 (最低特権)しか使わない。それぞれカーネルモード、ユーザーモード
そうだね.iconの気持ち
x86 が何か実行しようとするときにこの権限レベルを切り替える
このレベルはx86に対して割り当てられるものである
IDT(割り込み記述子テーブル)
https://en.wikipedia.org/wiki/Interrupt_descriptor_table
256個のエントリがあって、各エントリが %cs と %eip を指定
プログラムが int ${IDTのインデックス} でシステムコールをする
権限が弱いやつが権限を必要とする割り込みを呼び出すことはできない
%cs = 3 のときに int 31 とかは使えない
ちな RISC-V では
M-mode, S-mode, U-mode がある
最初のシステムコール
initcode.S のやつ?
code:initcode.S
movl $SYS_exec, %eax
システムコール番号を %eax レジスタに格納する
でなに?eaxってなんやねん
アセンブリ・トラップハンドラ
実装を見ましょう
Code: Interrupt
キーボード割り込みは常にプロセッサ0に送られる←おもしろ!
ドライバ
デバイスドライバ
めちゃむずい
ドライバのコードが管理対象のデバイスと並行して実行されるから
例:ディスクドライバ
データをセクタという単位の配列として扱う
各セクタはバッファ(struct buf)で表現される
ディスクデータとメモリにあるコピーを同期させるためのフラグたち
B_VALID: buf にディスクから読み込まれた有効な値があるか
B_DIRTY: メモリ上でデータ更新され、ディスクに書き戻す必要がある
B_BUSY: 使用中。ほかプロセスのアクセスを防ぐ
ユーザープログラム最優先なのに権限は与えてないの地下室監禁概念でかわいい