Upload
ryousei-takano
View
2.367
Download
2
Embed Size (px)
Citation preview
オペレーティングシステム設計と実装 第3版
oracchahttp://d.hatena.ne.jp/oraccha/
2010年12月11日版(P.190まで)
「MINIX本読書会」について•ほぼ一ヶ月に一度集まって、「オペレーティングシステム 設計と実装 第3版」を読んでいます。
•興味のある方は次のGoogle Groupを参照してください。
https://groups.google.com/group/minixReadingClub
Andrew S. Tanenbaum
Albert S. Woodhull
OSの設計者はオーケストラの指揮者と同じである。つまり、指揮者に問われるのは音楽の教養であるのと同じように、OS設計者に問われるのはコンピュータのハード、ソフト、応用のすべてに対する教養の深さである
高橋延匡
第1章オペレーティングシステム概論
理論と実践のバランス•理論:基本的な原理・原則を重視
•プロセス、プロセス間通信、セマフォ、モニタ、メッセージパッシング、スケジューリングアルゴリズム、入出力、デッドロック、デバイスドライバ、メモリ管理、ページングアルゴリズム、ファイルシステム設計、セキュリティ、保護機構
•実践:具体例としてのMINIX 3
MINIXの歴史• 1987 MINIX 1: UNIX (v7)互換教育用OS
• 8088 16bit リアルモード、フロッピーディスク
• 1997 MINIX 2
• 386 32bit プロテクトモード、ハードディスク
• v7 → POSIX.1互換(IEEE1003.1/ISO 9945-1)
• 2006 MINIX 3 (book versionはMINIX 3.1.0)
OSの役割•資源管理としてのOS
•計算機資源(CPU、メモリ、IO機器)の効率的な管理• 時間多重化:CPU
• 空間多重化:メモリ、ハードディスク
•拡張マシンとしてのOS
•ユーザに対して現実のマシンより便利に使用できる仮想的なマシンを提供
•アプリケーションとOSの界面:システムコール
システムコールの主な機能1.プロセス生成と消滅:fork, waitpid, exec, exit, ...
2.シグナル操作:sigaction, sigreturn, kill, alarm, ...
3.ファイルの読み書き:creat, open, close, read, write, ...
4.ディレクトリ管理:mkdir, rmdir, mount, unmount, chdir, ...
5.情報の保護:chmod, chown, unmask, ...
6.時間の管理:time, stime, utime, times
OSの構造単一システム ユーザ・カーネル
モード
階層システム リング機構 THE、MULTICS
バーチャルマシンシステム
マルチプログラミングと拡張マシンの機能の分離 VM/370
エクソカーネル (軽量な)資源の隔離 exokernel
クライアントサーバモデル
カーネル機能の高階層化 MINIX 3
クライアントサーバモデル• OSの部品化
•分散透過
•メカニズムとポリシーの分離
クライアントプロセス
プロセス管理サーバ
端末管理サーバ
ファイル管理サーバ ・・・ ファイル
管理サーバメモリ管理サーバ
マイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルマイクロカーネルクライアントはサーバプロセスにメッセージを送信することでサービスを享受する
P.55
マイクロカーネルの物語は、すばらしいアイデアと袋小路に満ちている。期待された柔軟性、安全性、モジュール性の劇的な向上に対する熱狂は、数年後失望へと変わる。第一世代のマイクロカーネルは、効率が悪く、柔軟性に欠けていたからである。
Jochen Liedtke“Toward Real Microkernels,” CACM Vol. 39, No.9, 1996.
マイクロカーネル世代論• A New Hope: 第一世代マイクロカーネル
• 1980年後半からのポストUNIXの流れ• 例:Mach、Chorus、Mach
• The Microkernel Strikes Back: 第二世代マイクロカーネル• より効率的なナチュラルボーン・マイクロカーネル• 例:L4、Exokernel
• Return of Virtual Machines: 仮想マシンモニタの大衆化• 結局やっていることはマイクロカーネルと同じ!?• 例:VMWare、Xen
第2章プロセス
プロセス•逐次プロセスモデル
•タスク>CPUの場合、疑似並列処理をいかに実現する?
•各プロセスは資源と状態を保有
• OSによるスケジューリングの基本単位
実行中
ブロック中 実行可能
実行中:その瞬間CPUを使っている実行可能:実行可能であるが、他プロセスが実行中のため一時停止させられているブロック中:何らかの外部的事象が発生しない限り実行できない
相互排除•クリティカルセクションを他プロセスと排他的に実行するための制御
•ビジーウェイト(スピンロック)•割込み禁止• Petersonのアルゴリズム• TSL命令
•セマフォ、ミューテックス•モニタ
問題点:‣CPU時間の浪費‣優先度逆転
Mars Pathfinder’s Sojourner
相互排除• Petersonのアルゴリズム
•ソフトウェアによる相互排除の基本的手法で、Dekkerのアルゴリズムを単純化したもの
•プロセス数Nへの拡張も簡単• Filterアルゴリズム• LamportのBakeryアルゴリズム
• TSL命令が一般的なので現場では使われない?
do { interested[1] = TRUE; turn = 1; while (turn == 1 && interested[0]);
/* critical region */
interested[1] = FALSE;
/* non critical region */} while (TRUE);
PERTERSONのアルゴリズムint turn;boolean interested[2];
do { interested[0] = TRUE; turn = 0; while (turn == 0 && interested[1]);
/* critical region */
interested[0] = FALSE;
/* non critical region */} while (TRUE);
enter region
leave region
プロセス0 プロセス1
共有変数
TSL命令• Test-and-Set Lock
•一つの記憶(変数)に対する二つの動作(readとwrite、readとcmp)を1命令サイクルで不可分に実行
•実例• ts (System/360)
• cas (68000, SPARC)
• xchg, cmpxchg (x86)
• ll/sc (MIPS), ldrex/strex (ARMv6)
セマフォ•ビジーウェイトを必要としないsleep&wakeup方式• Semafore(蘭)/Semaphore(英)
• P: down (sleepに相当)• V: up (wakeupに相当)
•使い方•排他:1に初期化•イベント待ち:0に初期化
用例•生産者消費者問題•哲学者の食卓問題•リーダライタ問題
スケジューリング• CPUバウンドとI/Oバウンド
•プリエンプティブ
•対話型システムのスケジューリング
•ラウンドロビンスケジューリング
•優先度スケジューリング
•スレッドスケジューリング
MINIX 3の内部構造
initユーザプロセス
ユーザプロセス ......
プロセスマネージャ
(pm)
ファイルシステム
(vfs)
仮想記憶サーバ(vm)
ネットワークサーバ(inet)
再生サーバ
(rs)
ディスクドライバ(at_wini)
TTYドライバ
(tty)
Ethernetドライバ
(lance)......
カーネル(kernel)カーネル(kernel)カーネル(kernel)
システムタスク(system)
クロックタスク(clock)
階層
1
2
3
4ユーザプロセス
サーバプロセス
デバイスドライバ
カーネル
ユーザモード
カーネルモード
システムコール
カーネルコール
P.121
起動シーケンス• boot monitor
•ブートイメージ(カーネル、必要最小限のサーバ・ドライバ、init)をロードし、カーネルに制御を遷移
• MINIX kernel
•上記のサーバ・ドライバを起動• init(8)
• /etc/rcの実行• service(8)を介して追加のサーバ・ドライバを起動
• /etc/ttytabを参照してgetty (login)プロセス起動
再生サーバ• PMを除くすべてのシステムプロセスの親
•子プロセスが異常終了したら、そのプロセスを再起動
• service(8)は再生サーバのフロントエンドコマンド
•研究としてはMINIX3の胆?
• C.Giuffrida, “We Crashed, Now What?,” USENIX HotDep’10
再生サーバの動作例•例題:情報サーバの特権テーブルのデバッグダンプ(F4キー押下で表示)の表示を修正
• isをkillすると自動的に再起動# cd servers/is# vi dmp_kernel.c# diff dmp_kernel.c.orig dmp_kernel.c338c338< ! printf("(%02u) %-7.7s %s %s %7d",---> ! printf("(%02u) %-7.7s %s %s %6d",# make && make install# kill 38
変更前
変更後
PSの結果 PID TTY TIME CMD(-4) ? 0h44 idle(-3) ? 0:00 clock(-2) ? 0:00 system(-1) ? 0:00 kernel 5 ? 0:00 pm 7 ? 0:00 vfs 4 ? 0:00 rs 8 ? 0:00 memory: 1 ? 0:00 init: 122 co 0:00 sh 123 c1 0:00 getty
システムタスク
プロセス
ソースコードを読む前に• MINIX3 bookにしたがって読み進めるなら、v3.1.0の
ISOイメージか、Appendix Bのファイルの入手を勧める
• MINIX3 book version (v3.1.0)とcurrent version (v3.1.8)の差分は結構大きい
• http://www.minix3.org/doc/
ソースツリー(/USR/SRC)include (make worldで/usr/includeにコピーされる)
sys 追加のPOSIXヘッダファイルminix MINIX 3 OSが用いるibm IBM PCに固有の定義
kernel 第一階層drivers 第二階層servers 第三階層
カーネル再構築(1/2)• src/toolsでmakeすれば、以下が設定される
(詳細はhttp://wiki.minix3.org/en/DevelopersGuide/RebuildingSystem)
• /boot/boot: ブートモニタ
• /boot/images: ブートイメージ
• /sbin: サーバ、ドライバ# cd /usr/src/tools# make image# make install
カーネル再構築(2/2)•ブートモニタに入って、newminixコマンドで起動イメージの選択項目を追加
プロセス間通信(1)• MINIXはC/S型のマイクロカーネル
•システム階層内・間の通信はメッセージパッシング(ユーザプロセス間は対象外)
•割込みをメッセージに変換するのが胆
•例1)システムコール(ソフトウェア割込み)
•例2)ハードウェア割込み
プロセス間通信(2)•ブロッキング操作
• send、receive、sendrec
•ランデブ方式:単純でバッファ管理が不要だが、遅延が大きい
•システムコール、カーネルコールはsendrecのみを使用 send
receive
S Rkernel
send
receive
S Rkernel
(ブロック中)
プロセス間通信(3)•ノンブロッキング操作
• notify
•タイムスタンプ、ビットマップを設定して、プロセスを起床
プロセス間通信(4)•プロセス毎の許可ビットマップ(priv構造体)
• ipc_to: IPCの宛先プロセス• traps: IPCの種類(send、receive、sendrec、notify)
•例:ユーザプロセスはpm、vfs、rsのみにsendrec可能ユーザプロセスユーザプロセスユーザプロセスユーザプロセスユーザプロセス
pm vfs vm inet rs
driversdriversdriversdriversdrivers
kernelkernelkernelkernelkernel
sendrec sendrecsend
システムタスクメッセージ型 送信元 意味
sys_fork PM プロセスは分岐したsys_exec PM EXECコールの後にSPを設定するsys_exit PM プロセスは終了した
sys_privctl RS 特権レベルを設定または変更するsys_irqctl driver 割込みを、許可、禁止、構成するsys_devio driver I/Oポートを読み書きするsys_umap driver 仮想アドレスを物理アドレスに変換する
sys_vircopy FS, driver 仮想アドレスを指定してコピーを行うsys_physcopy driver 物理アドレスを指定してコピーを行うsys_getinfo all システム情報を要求する
P.208
おまけ:FORK&EXECの起源• UNIX最初期(PDP-7の頃)のプロセス管理は未成熟
•プロセスは端末毎に一つで、シェルはOSの一部(当時のTSSではありがちな実装)
•マルチプロセス化に向けたforkとexecの実装• forkとexecを分離したのは実装が簡単だったから
•分離のアイデア自体はSDS 930 TSSで実装例あり
•副作用:カレントディレクトリ、ファイルポインタなど出典:D.M.Ritchie, ”The evolution of the UNIX Time-sharing system,” 1979
割込み処理の概要• 割込みや例外が発生すると、IDTに登録された割込みハンドラが実行され、iretd命令で復帰する
• CPUはスタックをTSSに格納されたSSとESP(カレントプロセスのstackframe_s構造体に初期化済み)に切り替える
• 割込み処理初期はプロセスのコンテキストをstackframe_s構造体に保存。その後、割込みハンドラをカーネルスタックを使って実行する
• 割込み中にプロセススイッチが行われる場合は、iretd命令でユーザモードに復帰するときにプロセスが切り替わる• 割込みはデバイスドライバ(優先度が高いユーザプロセス)へのメッセージ送信を伴うので、通常はプロセススイッチする
割込み制御(IA32の場合)
SYS386_VECTOR
zero divide
base limit
IDTR
0
55
ハードウェア的に最大256個(32~255はユーザ定義可能)
+IDT
IA-32 ®
5-16
5.12.
! "#$$!
! %&'
"#$$! ()*)+)
()*),)"#$$
5-2. IDT
31 16 15 1314 12 8 7 0
P31..16DPL
0 4
31 16 15 0
15..0 0
011D
DPL
P
31 16 15 1314 12 8 7 0
PDPL
0 4
31 16 15 0
TSS 0
1010
45
0 0 0
31 16 15 1314 12 8 7 0
P31..16DPL
0 4
31 16 15 0
15..0 0
111D
45
0 0 0
1=32 0=16D33
割込み・例外とスタック(IA32の場合)
SS
ESP
EFLAGS
CS
EIP
(Error Code)
ここまではCPUがpush
SS
ESP
EFLAGS
CS
EIP
(Error Code)
IRETでpop
•エラーコードがpushされるかは例外の原因に依存する•例えば、ゼロ除算はpushされないが、ページフォルトはpushされる•エラーコード分はIRET実行前にプログラマが責任をもってpopしておくこと
カーネルからユーザへの遷移コードの共通化
restart()
service(int)
save()
syscall()
プロセスまたはタスク
起動
外部割込み(ハードウェアまたはクロックより)
ソフトウェア割込み(システムコール)
カーネル空間
ユーザ空間
P.188
_RESTART呼出しのトリック
SS
ESP
EFLAGS
CS
EIPhwint_XXへのret address
SSSS
ESPESP
EFLAGSEFLAGS
CSCS
EIPEIPhwint_XXへのret addresshwint_XXへのret address
EAXEAX
ECXECX
EDXEDX
EBXEBX
ESPESP
EBPEBP
ESIESI
EDIEDI
DS ES
FS GS
(RETADR)
(saveからjmpで復帰後)(call save後)
save関数はスタックをカーネルスタックに切り替え、(ret命令ではなく)jmp命令で復帰する。その結果、hwint_XXマクロのret命令では_restart
関数が戻りアドレスと解釈される。(v3.1.8でこのトリックは使われていない)
struct stackframe_s
カーネルスタック
_restartk_stktop
mov esp, k_stktop
struct stackframe_s (struct procの先頭)(割込みハンドラの実行)
save内でpush
例外ハンドラ
SS
ESP
EFLAGS
CS
EIP
(Error Code)
SS
ESP
EFLAGS
CS
EIP
old EFLAGS
old CS
old EIP
エラーコード例外番号
call save前
ここまではCPUがpush
エラーコードの有無で例外ハンドラ(_exception or
_errexception)を変えてスタックをそろえた後、C言語で記述された共通関数を呼び出す
例外発生後