オペレーティングシステム i386アーキテクチャ(3)

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

Ibaraki Univ. Dept of Electrical & Electronic Eng.
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
第6回 仮想記憶とページング ページング ページ取り出し方式 ページ置き換え方式 中間テスト(40分)
オペレーティングシステム 第10回 仮想記憶管理(1)
計算機工学III オペレーティングシステム #9 主記憶管理:ページング 2006/06/09 津邑 公暁
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
計算機システムⅡ 主記憶装置とALU,レジスタの制御
計算機アーキテクチャ特論Chapter.6.6~6.9
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
おおえす作成の手引(いち) きそちしき編 Ver 1.1 Copyright © makihata.
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
ファイルシステムキャッシュを 考慮した仮想マシン監視機構
App. A アセンブラ、リンカ、 SPIMシミュレータ
2006年度 計算機システム演習 第4回 2005年5月19日.
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
プログラムはなぜ動くのか.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第5回 CPUの役割と仕組み3 割り込み、パイプライン、並列処理
問2.9 割り込みB 割り込みA 割り込みC (msec) 開始 停止 終了 走行レベル4 走行レベル3
割 込 み(1) オペレーティングシステム No.5.
第17回カーネル読書会 2001年10月17日 高杉@YLUG YLUG読書会
オペレーティングシステム i386アーキテクチャ(2)
割り込み.
割り込み.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
AMD64の仮想化技術を利用した 仮想マシンモニタの実装
コンピュータを知る 1E16M009-1 梅津たくみ 1E16M017-8 小沢あきら 1E16M035-0 柴田かいと
仮想計算機を用いて OSを介さずに行う安全な ファイルアクセス制御
オペレーティングシステム2006 第1回 概要 2006年10月12日 海谷 治彦.
オペレーティングシステム イントロダクション
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
オペレーティングシステムJ/K (仮想記憶管理)
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
コンピュータの基本構成について 1E16M001-1 秋田梨紗 1E16M010-2 梅山桃香 1E16M013-3 大津智紗子
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
TCP/IPとプロセス間通信 2007年1月12日 海谷 治彦.
コンパイラ資料 実行時環境.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
IaaS環境におけるVMのメモリ暗号化による情報漏洩の防止
Intel SGXを用いた仮想マシンの 安全な監視機構
オペレーティングシステムJ/K 2004年11月15日2時限目
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
オペレーティングシステム i386アーキテクチャ(1)
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
Ibaraki Univ. Dept of Electrical & Electronic Eng.
コンピュータアーキテクチャ 第 4 回.
実装について 前田俊行.
コンピュータアーキテクチャ 第 2 回.
Mondriaan Memory Protection の調査
コンピュータアーキテクチャ 第 5 回.
計算機アーキテクチャ1 (計算機構成論(再)) 第二回 命令の種類と形式
ネットワーク・プログラミング デバイスドライバと環境変数.
第4回 CPUの役割と仕組み2 命令の解析と実行、クロック、レジスタ
コンピュータアーキテクチャ 第 5 回.
オペレーティングシステム 作成 T21R003 荏原 寛太.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
L4-Linux のメモリ管理における問題点とその解決策
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

オペレーティングシステム i386アーキテクチャ(3) 2005年10月28日 海谷 治彦

目次 セグメントとページの保護機能 ページングの詳細 システムコールが実行される道程 プロテクトモード以外のモード

アドレス変換 再録 マシン語が解釈されて,実際のメモリ回路までたどり着くには,以下のような二段階の変換が行われる. 物理アドレス 論理アドレス リニアアドレス ページング 回路 セグメンテー ション回路 i386ではそれぞれの段階で保護チェックが行われ, チェックがコケる(許可されてないアクセスがある)と, 例外が発生する.

セグメントの保護チェック 1/2 リミットチェック タイプチェック セグメントはオフセットとサイズがあるので,その範囲の外をアクセスしてないかチェックする. Linuxで使うセグメントでは必ずチェックを通る. タイプチェック 各セグメントは実行可能,読み可能,書き可能の型の違いで8種類に分類される. CS, DS等のセグメントレジスタにセグメントを設定する場合, CS 実行可能なセグメントか? (タイプ 4~7) DS 読み書き等が可能なセグメントか? (タイプ 0~3) を判定し,条件にあわないかどうかをチェックする. Linuxの場合,前述の通り,1と5しか使ってない.

セグメントの保護チェック 2/2 特権レベルチェック (Privilege Level Check) セグメント毎に設定されたDPLをもとに実行権限をチェックする. 以下の用語に注意 CPL (Current PL: 現行特権レベル) 現時点でCSレジスタが指しているセグメントのDPLの値. DPL (Descriptor PL: デスクリプタ特権レベル) セグメントディスクリプタ毎に記述された特権レベル. Linuxの場合,KERNEL_*は0, UER_* は3 RPL (Requested PL: 要求される特権レベル) 特権レベルを下げるため.(後述) セグメントを指すレジスタ(CS, DS等)の下位2bitにおかれる. PL(特権レベル)は0ほど強いことに注意. 3が最弱.

i386のOS関係のレジスタ 再録 ・・・・ 凡例 EAX EDI EBP ESP CS BIP BFLAGS 汎用レジスタ インストラクションポインタ フラグレジスタ ベースポインタ スタックポイタ セグメントレジスタ DS ES CR3 CR2 CR1 CR0 GDTR IDTR LDTR TR システムアドレスレジスタ コントロールレジスタ 32bit 16bit 凡例 48bit

DSを更新する際の保護機能 以下の場合は違反となる. CPL > DPL RPL > DPL 現在のCSの指すセグメントのPLが,扱おうとするセグメントのPLより大きいと違反になる. 例えば,ユーザーレベルのコードが,カーネルのデータを読もうとした場合. RPL > DPL システムコールを利用し,ユーザーコードがカーネルコードに実行依頼をすることで,アクセス権限が無いデータにアクセスできてしまうのを防ぐため. 例は後述.

RPLの存在意義の例 直接はアクセス不可 迂回すれば読書きできる 直接はアクセス不可 迂回しても読書きできない. データセグメント DPL=0 ユーザープロセス CPL = 3 システムコール 呼び出し カーネルプロセス内の システムコール CPL = 0 迂回すれば読書きできる 直接はアクセス不可 データセグメント DPL=0 ユーザープロセス CPL = 3 システムコール 呼び出し カーネルプロセス内の システムコール CPL = 0 RPL ← 3 迂回しても読書きできない.

CSを更新する場合の保護機能 CSレジスタ自体を直接変更する命令は無い. CSレジスタはJMP, CALL命令や割込みにより変化する(可能性がある). 移行先のDPLがCPLと一致している場合に限り,移動が許される. それ以外はアクセス違反となる. とは言え,このままではユーザープロセス,カーネルプロセスの切り替えが全くできないので,ゲートと呼ばれる機構でCSのPLの移行を可能にする.

コールゲート 数種類ある内のゲートの一つ. CPLを変更する手段の一つ. GDTRが指すDescriptor Tableは,実はSegment Descriptorだけでなく,Gate Descriptor というのも列挙できる. 個々のGate Descriptorには, 他のSegment Descriptor のセレクタ値 (番号) そのSegment内での(オフセット)アドレス が記載されており,call 命令 (サブルーチンを呼ぶアセンブラ命令)でGate Descriptorを指定することで,CPLとDPLの一致を無視して他のコードに制御を移行できる.

例 GDTR call 0038:00000 命令で, 実際には, KERNEL_CS内の オフセット0011番にあるコードに制御が移行し, オフセット部分は捨てられている. GDTR KERNEL_CS DPL=0 call 0038:00000 命令で, 実際には, KERNEL_CS内の オフセット0011番にあるコードに制御が移行し, かつ,CPLも(現CPLに関係なく)0になる. KERNEL_DS DPL=0 10 18 USUER_CS DPL=3 23 2B USUER_DS DPL=3 コールゲート セレクタ番号=10 オフセット=0011 DPL=3 38 ※ Linux稼動中にはコールゲートは利用されていないようです.(未確認ですが)

トラップゲート再び トラップゲートはLinuxでの例外ハンドラを記述するのに使われていた. トラップゲートは,コールゲートと同じ性質を持っている. よって,トラップゲート記述内の飛び先(ハンドラー)をKERNEL_CS内にしておけば,USER_CSから(レベル3)からでも,レベル0の機能を呼び出せる. 例外ハンドリングかサブルーチンコールかの違いだけ. (前述のように)システムコールの呼び出しは,この「ゲート」によってi386では実現されている.

例 IDTR 2 3 4 14 128 割込みゲート: NMI割込み DPL=0 トラップゲート: ブレークポイント設定 DPL=3 トラップゲート: オーバーフロー DPL=3 4 int 128 をCPL3で実行すると,制御はKERNEL_CS内のsystem_callという関数があるアドレスに分岐し,同時にCPLも0に変化する. トラップゲート: ページフォルト DPL=0 14 トラップゲート: システムコール セグメント=KERNEL_CS オフセット=system_call DPL=3 128

システムコールが呼ばれるまで 前述のようにトラップゲートを利用して,CPLを変化させることで,システムコールは実現されている. では,次項で具体的にユーザープログラム内のシステムコールの呼ばれる手順を追う.

例えばfork() ユーザーモード(CPL=3) カーネルモード(CPL=0) プログラマ が書く // アプリ main(){ ・ fork() } // libc等の // ライブラリ fork(){ ・ int 0x80 } ; アセンブラです system_call ・・・ sys_fork() ret_from_sys_call: iret // fork処理 // の実体 sys_fork(){ ・・・・・ } KERNEL_CS内に このコードは 格納されている プログラマ が書く コンパイル時に リンクされる. システムコールの種類(ココではfork() )も,引数として渡される. トラップゲートを使いCPLやCSを変更 ※ fork()は返らないので不適切な例でした.

例えばwrite() ユーザーモード(CPL=3) カーネルモード(CPL=0) プログラマ が書く コンパイル時に リンクされる. // アプリ main(){ ・ write() } // libc等の // ライブラリ fork(){ ・ int 0x80 } ; アセンブラです system_call ・・・ sys_write() ret_from_sys_call: iret // write処理 // の実体 sys_write(){ ・・・・・ } KERNEL_CS内に このコードは 格納されている プログラマ が書く コンパイル時に リンクされる. システムコールの種類(ココではwrite() )も,引数として渡される. トラップゲートを使いCPLやCSを変更

ライブラリのリンク (参考) それぞれのアプリケーションは,いくつかのライブラリがリンクされている. リンクされているライブラリは ldd コマンドで確認できる. 各ライブラリ内にある関数(というか外部からアクセス可能なシンボル)は,nm コマンドで確認できる.

ページのアドレス変換テーブル 前述のように,リニアアドレスと実アドレスの変換にテーブルを使っていた. しかし,1ページが4KBの場合, 4G÷4K=232 ÷ 212 = 220 ≒ 100万個 もの表項目がいる. コレは無駄なので,実際には二段階の表となっている. ページディレクトリ 一段目の表 ページテーブル 二段目の表 実際のページ配置は「すかすか」なので,このほうが効率的.

例(再録) CR3 物理アドレス空間 (実メモリ) アドレス変換 アドレス変換 テーブル テーブル リニアアドレス空間B p18 図19 改 リニアアドレス空間B リニアアドレス空間A CR3

アドレス変換の概念図 ページ CR3 10bit 1024個を表現 10bit 1024個を表現 12bit 4096個を表現 31 22 21 12 11 ページ テーブル ページ ページ ディレクトリ CR3

ページフレームの保護 4KBに区切られた個々のページをページフレームと呼ぶ. i386のページング機能はオフにできる. CPUのCPLが 0~2 の場合,スーパーバイザモード 3の場合,ユーザーモードと呼ぶ. ページフレームにはU/SフラグとR/Wフラグの二つがあり,これらの値をCPUのモードによってアクセス権限がかわる.

U/SフラグとR/Wフラグ U/Sはアクセス可能性を制限 R/Wはアクセス可能性を制限

プロテクトモード以外のモード リアルモード 仮想8086モード i386のマシンは電源投入時にはこのモードで動く. アドレス空間が狭い.1MB (20bit) 保護機能は無い. LinuxではOS起動準備のみに使う. 仮想8086モード プロテクトモードでリアルモードのプログラムを動かすためのモード. DOSのプログラムがWinのコマンドプロンプトで動作しちゃうのはこのせい.