Post on 15-Apr-2017
『オペレーティングシステム 設計と理論およびMINIXによる実装』• 全5章の構成
• オペレーティングシステム概論
• プロセス
• 入出力
• メモリ管理
• ファイルシステム
全部なんて 到底無理です
(90分x15週ならいける)
目次• OSの機能について(1章)
• MINIXが起動し、シェルが立ち上がるまで(2章)
• MINIX上でのデバイスドライバについて(3章)
• MINIXのメモリ管理について(4章)
• ファイルについて(5章)
アドレス空間• テキストセグメント
• プログラムコード
• データセグメント
• 変数
• BRKシステムコールで拡張される
• スタックセグメント
• 必要に応じて成長するテキストデータ
スタックFFFF
0000
空き
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図1-11
マルチプログラミング• プログラム間を高速で行き来すること
A
B
C
D
プロセス
時間
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-1(c)
ファイル• OSは、デバイスを抽象化する => ファイル
• デバイスの操作を、ファイルの読み書きなどで表すことができるようになる!
• ファイルの保存方法
• ディレクトリという考え方
• ツリー構造
システムコールの実行方法
主メモリ
ユーザプログラム(ユーザモード)
OS(カーネルモード)
トラップ
番号の決定
OSが作業する
戻る
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図1-16
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
リソース管理カーネル
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
難しいものを隠す
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク割り込みを捉える
プロセス間通信を処理する
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
デバイスドライバ ともいう
入出力系のプロセス
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
FORK, BRK
MOUNT, READ
MINIXの内部構造
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
シェル, エディタ, コンパイラなど
2. MINIXの起動についてブートブロック
ブートプログラム
• ROMは、ブートディスクの最初のセクタを読み、そこにあるコードを実行する
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-31(a)
ブートブロック• 最初の512Bにはブートストラッププログラムが格納されており、bootをロードする
512 [B] 512 [B]
1 [KB]
ロードされる セクタ
設定の保存に 使えるセクタ
• 第2セクタをbootというプログラムが見る
• bootはOS自体をロードする
• ファイルシステムの/minixファイルか、/minix/以下の最新の イメージ
システムの初期化• 16 [bit]か32 [bit]でMINIXをコンパイルすることができる
• mpx88.sかmpx386.sが使われる
#include <minix/config.h> #if _WORD_SIZE == 2 #include “mpx88.s” #else #include “mpx386.s” #endif
mpx386.s
• 32 bit CPU用の変数や関数の定義をする
• スタックフレームの設定や、各種プロセッサレジスタの設定をする
• 用語いっぱいで難しいので、Cプログラムのための準備をすると考えて下さい
準備が終わったら……• C言語の関数cstartを呼び出す
push edx push ebx push SS_SELECTOR push MON_CS_SELECTOR push DS_SELECTOR push CS_SELECTOR call _cstart
• cstartは32bitプロセッサで使われる
• OS内部のデータ構造を初期化する
restart()の処理• mpx386.sの処理の一部
• 最初に実行されると、MINIXが実行される
• proc_ptrが指しているプロセスを実行する
proc[NR_TASKS+INIT_PROC_NR].p_pid = 1; bill_ptr = proc_addr(IDLE); lock_pick_proc();
/* ここでアセンブリコードを呼び出し、現在のプロセスの実行を開始する */ restart();
initをルートとして……• initからgettyが呼び出される
• getty: 仮想端末を立ち上げる
• gettyからloginが呼び出される
• login: ユーザ名とパスの入力
• loginに成功すると、シェルが立ち上がる
• シェルの子プロセスとして、各プログラムが実行される
init
getty
login
tcsh
lsvimpwd
3. MINIX上でのデバイスドライバについて
プロセス管理
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図2-26
ディスク タスク
Tty タスク
クロック タスク
システム タスク
イーサネット タスク …
…
…
メモリ マネージャ
ファイル システム
ネットワーク サーバ
init ユーザ プロセス
ユーザ プロセス
ユーザ プロセス
レイヤ
4
3
2
1
ユーザプロセス
サーバプロセス
入出力タスク
特殊ファイル• 入出力デバイスをファイルのように扱うためのもの
• ブロック型特殊ファイル
• ディスクなど、アドレス指定ができるもの
• キャラクタ型特殊ファイル
• 文字の流れを受信したり出力するもの
• プリンタ, モデムなど
デバイスドライバとは• デバイスに関することを処理するプログラム
• デバイスに依存するコードは、 全てデバドラ内に記述される
• 例)マウス, USBメモリ
• ソフトウェアからの抽象的な要求を受け入れ、具体的な処理をするのが仕事
UNIXでのデバイスドライバの呼び出し
• UNIXでは、すべてのプロセスがユーザ空間とカーネル空間を持っている
• システムコールが発行されると、切り替わる
• UNIXのデバドラは、プロセスのカーネル空間部によって呼び出される手続き
プロセス
ユーザ 空間部ファイル システム
デバイス ドライバ
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図3-14(b)
ユーザ空間
カーネル空間
MINIXでのデバイスドライバ
• プロセスがファイルシステムのプロセスにメッセージを送る
• ファイルシステムがデバイスドライバへメッセージを送る
ユーザ プロセス
ファイル システム
デバイス ドライバ
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図3-14(a)
ユーザ空間
カーネル空間
PUBLIC void driver_task(dp) struct driver *dp; { int r, caller, proc_nr; message mess; …(中略)… while(TRUE) { receive(ANY, &mess); caller = mess.m_source; proc_nr = mess.PROC_NR; …(中略)… switch(mess.m_type) { case DEV_OPEN: r = (*dp->dr_open)(dp, &mess); break; case DEV_CLOSE: r = (*dp->dr_close)(dp, &mess); break; …(中略)… default: r = EINVAL; break; } …(中略)… mess.m_type = TASK_REPLAY; mess.REP_PROC_NR = proc_nr;
mess.REP_STATUS; send(caller, &mess); } }
struct driver { _PROTOTYPE( char *(*dr_name), (void) ); _PROTOTYPE( int (*dr_open), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( int (*dr_close), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( int (*dr_ioctl), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( struct device *(*dr_prepare), (int device) ); _PROTOTYPE( int (*dr_schedule), (int proc_nr, struct iorequest_s) *request ); _PROTOTYPE( int (*dr_finish), (void)); _PROTOTYPE( void (*dr_cleanup), (void) ); _PROTOTYPE( void (*dr_geometry), (struct partition *entry) );
};
スワッピングのイメージ[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図4-3
OS
時間
A
OS
A
B
OS
A
B
C
OS
B
C
OS
B
C
D
仮想メモリとは?• メモリに入りきらないくらい大きいプログラムをどう実行したらいいのか?
• プログラムを分割して、一部をメインメモリに、残りをディスク上に保存すればいい
• 必要に応じて、プログラムの一部をディスクとメモリでスワップする
物理メモリ アドレス
仮想アドレス空間
216043XXX5X7XXXX
0K-4K4K-8K8K-12K12K-16K16K-20K20K-24K24K-28K28K-32K
0K-4K4K-8K8K-12K12K-16K16K-20K20K-24K24K-28K28K-32K32K-36K36K-40K40K-44K44K-48K48K-52K52K-56K56K-60K60K-64K
仮想ページ
ページフレーム
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図4-8
MINIXのメモリ管理• スワッピングもページングも使わない
• プロセス数が少ないことを想定しているから
• IBMのCPUが仮想メモリのサポートしてないから
• 移植性を高めるため
• ユーザ空間内で実行され、 メッセージを使ってカーネルと通信する
MINIXのメモリ管理• メモリが割り当てられるケース
• プロセスがFORKを行うとき、子プロセスに必要な分のメモリ量を割り当てる
• プロセスがEXECシステムコールによってそのメモリイメージを変更したとき、古いイメージを解放して新しく割り当てられる
MINIXのメモリのイメージ
MINIX
A
B
MINIX
A
B
Aの子プロセス
MINIX
A
B
C
[出典] A.S.Tanenbaum 『オペレーティング 設計と理論およびMINIXによる実装』図4-32
上位 メモリ限界
5. MINIXのファイルシステムについて• そもそもファイルシステムとは?
• ファイルはOSが管理する
• OSの、ファイルを扱う部分のこと
• ファイルシステム(一部)
• そもそもファイルとは?
• ディスクへの書き込みの種類
ファイルの種類• 通常ファイル: バイト列で構成される
• ASCII, バイナリ
• ディレクトリ:ファイルシステムの構造を保持するもの
• キャラクタ型特殊ファイル: シリアル入出力デバイスのモデル化に使用
• ブロック型特殊ファイル:ディスクのモデル化に使用
ディスクのアドレスを使う• ディスクブロックの連結リストとしてファイルを保存する
• どこに書き込んでもいい
• ポインタのために数バイト必要
4 5 9
2 14
物理 ブロック
ファイル ブロック
0
ファイル ブロック
1
ファイル ブロック
2
ファイル ブロック
3
ファイル ブロック
4
ちなみに……• このポインタをメモリに置くのがMS-DOS式
• こうすると、ブロック全体をデータに割り当てることができる
• メモリの中にテーブルを置く
012 1434 55 96789 21011121314 015
start
物理 ブロック
MINIXの iノード構造
モード(ファイルタイプとrwxビット)リンク数(このファイルのディレクトリエントリ)
uid(ファイル所有者のID)gid(所有者のグループ)
ファイルサイズ
ファイルサイズ(ファイルのバイト数)
アクセス時刻
更新時刻
状態更新時刻
ゾーン0
ゾーン1
ゾーン2
ゾーン3
ゾーン4
ゾーン5
ゾーン6
単一間接ゾーン
二重間接ゾーン
未使用(三重間接ゾーンに使う予定)
単一間接ゾーンは256個の ブロックを指せるので、 二重間接ゾーンだと 256 x 256 = 65536 [KB] = 64 [MB] までアクセスできる