23
1 オオオオオオオオオオオオ i386 オオオオオオオ (3) 2005 オ 10 オ 28 オ オオ オオ

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

  • Upload
    adah

  • View
    67

  • Download
    3

Embed Size (px)

DESCRIPTION

オペレーティングシステム i386 アーキテクチャ (3). 2005 年 10 月 28 日 海谷 治彦. 目次. セグメントとページの保護機能 ページングの詳細 システムコールが実行される道程 プロテクトモード以外のモード. 再録. アドレス変換. マシン語が解釈されて,実際のメモリ回路までたどり着くには,以下のような二段階の変換が行われる.. 物理アドレス. 論理アドレス. リニアアドレス. ページング 回路. セグメンテー ション回路. i386 ではそれぞれの段階で保護チェックが行われ, - PowerPoint PPT Presentation

Citation preview

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

1

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

2005 年 10 月 28 日海谷 治彦

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

2

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

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

3

アドレス変換

論理アドレス リニアアドレス 物理アドレスセグメンテーション回路

ページング回路

マシン語が解釈されて,実際のメモリ回路までたどり着くには,以下のような二段階の変換が行われる.

再録

i386 ではそれぞれの段階で保護チェックが行われ,チェックがコケる ( 許可されてないアクセスがある ) と,例外が発生する.

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

4

セグメントの保護チェック 1/2

• リミットチェック– セグメントはオフセットとサイズがあるので,そ

の範囲の外をアクセスしてないかチェックする.– Linux で使うセグメントでは必ずチェックを通る.

• タイプチェック– 各セグメントは実行可能,読み可能,書き可能の型

の違いで 8 種類に分類される.– CS, DS 等のセグメントレジスタにセグメントを設

定する場合,• CS 実行可能なセグメントか? ( タイプ 4 ~ 7)• DS 読み書き等が可能なセグメントか? ( タイプ 0 ~ 3)を判定し,条件にあわないかどうかをチェックする.• Linux の場合,前述の通り, 1 と 5 しか使ってない.

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

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 が最弱.

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

6

i386 の OS 関係のレジスタ

16bit

48bit

32bit

凡例

EAX

EDI

・・・・

EBP

ESP

CS

BIP

BFLAGS

汎用レジスタ インストラクションポインタ

フラグレジスタ

ベースポインタ

スタックポイタ

セグメントレジスタ

DS

ES

・・・・

CR3

CR2

CR1

CR0

GDTR

IDTR

LDTR TR

システムアドレスレジスタ

コントロールレジスタ

再録

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

7

DS を更新する際の保護機能• 以下の場合は違反となる.

CPL > DPL• 現在の CS の指すセグメントの PL が,扱おうと

するセグメントの PL より大きいと違反になる.• 例えば,ユーザーレベルのコードが,カーネル

のデータを読もうとした場合.RPL > DPL

• システムコールを利用し,ユーザーコードがカーネルコードに実行依頼をすることで,アクセス権限が無いデータにアクセスできてしまうのを防ぐため.

• 例は後述.

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

8

RPL の存在意義の例ユーザープロセスCPL = 3

データセグメントDPL=0

カーネルプロセス内のシステムコールCPL = 0

直接はアクセス不可

迂回すれば読書きできる

システムコール呼び出し

ユーザープロセスCPL = 3

データセグメントDPL=0

カーネルプロセス内のシステムコールCPL = 0RPL ← 3

直接はアクセス不可

迂回しても読書きできない.

システムコール呼び出し

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

9

CS を更新する場合の保護機能• CS レジスタ自体を直接変更する命令は無い.• CS レジスタは JMP, CALL 命令や割込みによ

り変化する ( 可能性がある ) .• 移行先の DPL が CPL と一致している場合に

限り,移動が許される.– それ以外はアクセス違反となる.

• とは言え,このままではユーザープロセス,カーネルプロセスの切り替えが全くできないので,ゲートと呼ばれる機構で CS の PL の移行を可能にする.

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

10

コールゲート• 数種類ある内のゲートの一つ.• CPL を変更する手段の一つ.• GDTR が指す Descriptor Table は,実は Segment Descr

iptor だけでなく, Gate Descriptor というのも列挙できる.

• 個々の Gate Descriptor には,– 他の Segment Descriptor のセレクタ値 ( 番号 )

– その Segment 内での ( オフセット ) アドレス– が記載されており, call 命令 ( サブルーチンを呼ぶアセン

ブラ命令 ) で Gate Descriptor を指定することで, CPL と DPL の一致を無視して他のコードに制御を移行できる.

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

11

1018232B

38

GDTRKERNEL_CSDPL=0

KERNEL_DSDPL=0

USUER_CSDPL=3

USUER_DSDPL=3

コールゲートセレクタ番号 =10オフセット =0011DPL=3

call 0038:00000命令で,実際には,KERNEL_CS 内のオフセット 0011 番にあるコードに制御が移行し,かつ, CPL も ( 現CPL に関係なく )0になる.

オフセット部分は捨てられてい

る.

※ Linux 稼動中にはコールゲートは利用されていないようです. ( 未確認ですが )

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

12

トラップゲート再び• トラップゲートは Linux での例外ハンドラを記述

するのに使われていた.• トラップゲートは,コールゲートと同じ性質を持っている.– よって,トラップゲート記述内の飛び先 ( ハンド

ラー ) を KERNEL_CS 内にしておけば, USER_CS から ( レベル 3) からでも,レベル 0 の機能を呼び出せる.

– 例外ハンドリングかサブルーチンコールかの違いだけ.

• ( 前述のように ) システムコールの呼び出しは,この「ゲート」によって i386 では実現されている.

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

13

234

14

128

IDTR割込みゲート : NMI 割込みDPL=0

トラップゲート : ブレークポイント設定DPL=3

トラップゲート : オーバーフローDPL=3

トラップゲート : ページフォルトDPL=0

トラップゲート : システムコールセグメント =KERNEL_CSオフセット =system_callDPL=3

int 128

を CPL3 で実行すると,制御は KERNEL_CS 内の system_call という関数があるアドレスに分岐し,同時に CPL も 0 に変化する.

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

14

システムコールが呼ばれるまで

• 前述のようにトラップゲートを利用して, CPL を変化させることで,システムコールは実現されている.

• では,次項で具体的にユーザープログラム内のシステムコールの呼ばれる手順を追う.

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

15

システムコールの種類( ココでは fork() ) も,引数として渡される.

トラップゲートを使い CPL や CS を変更

例えば fork()

// アプリ

main(){ ・ ・ fork() ・ ・ ・}

// libc 等の// ライブラリfork(){ ・ ・ int 0x80 ・ ・}

プログラマが書く

コンパイル時にリンクされる.

; アセンブラですsystem_call・・・ sys_fork()・・・ret_from_sys_call:・・・iret

// fork処理// の実体

sys_fork(){ ・・・・・}

ユーザーモード (CPL=3) カーネルモード (CPL=0)

KERNEL_CS 内にこのコードは格納されている

※ fork() は返らないので不適切な例でした.

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

16

システムコールの種類( ココでは write() ) も,引数として渡される.

トラップゲートを使い CPL や CS を変更

例えば write()

// アプリ

main(){ ・ ・ write() ・ ・ ・}

// libc 等の// ライブラリfork(){ ・ ・ int 0x80 ・ ・}

プログラマが書く

コンパイル時にリンクされる.

; アセンブラですsystem_call・・・ sys_write()・・・ret_from_sys_call:・・・iret

// write処理// の実体

sys_write(){ ・・・・・}

ユーザーモード (CPL=3) カーネルモード (CPL=0)

KERNEL_CS 内にこのコードは格納されている

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

17

ライブラリのリンク (参考 )• それぞれのアプリケーションは,いく

つかのライブラリがリンクされている.• リンクされているライブラリは ldd コ

マンドで確認できる.• 各ライブラリ内にある関数 ( というか

外部からアクセス可能なシンボル ) は,nm コマンドで確認できる.

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

18

ページのアドレス変換テーブル

• 前述のように,リニアアドレスと実アドレスの変換にテーブルを使っていた.

• しかし, 1 ページが 4KB の場合,4G÷4K=232 ÷ 212 = 220 100≒ 万個もの表項目がいる.

• コレは無駄なので,実際には二段階の表となっている.– ページディレクトリ 一段目の表– ページテーブル 二段目の表

• 実際のページ配置は「すかすか」なので,このほうが効率的.

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

19

例 ( 再録 )

リニアアドレス空間 A リニアアドレス空間 B

物理アドレス空間( 実メモリ )

アドレス変換テーブル

アドレス変換テーブル

CR3

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

20

アドレス変換の概念図

31 2221 1211 0

10bit 1024 個を表現 10bit 1024 個を表現 12bit 4096 個を表現

CR3

ページディレクトリ

ページテーブル ページ

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

21

ページフレームの保護• 4KB に区切られた個々のページをペー

ジフレームと呼ぶ.• i386 のページング機能はオフにできる.• CPU の CPL が

– 0 ~ 2 の場合,スーパーバイザモード– 3 の場合,ユーザーモードと呼ぶ.

• ページフレームには U/S フラグと R/Wフラグの二つがあり,これらの値を CPU のモードによってアクセス権限がかわる.

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

22

U/S フラグと R/W フラグ

CPUのモード U/ S=0 U/ S=1ユーザー アクセス不可 アクセス可スーパーバイザー アクセス可 アクセス可

CPUのモード R/W=0 R/W=1ユーザー 読み出し専用 読書き可能スーパーバイザー 読書き可能 読書き可能

U/S はアクセス可能性を制限

R/W はアクセス可能性を制限

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

23

プロテクトモード以外のモード

• リアルモード– i386 のマシンは電源投入時にはこのモードで動く.– アドレス空間が狭い. 1MB (20bit)

– 保護機能は無い.– Linux では OS起動準備のみに使う.

• 仮想 8086 モード– プロテクトモードでリアルモードのプログラム

を動かすためのモード.– DOS のプログラムが Win のコマンドプロンプト

で動作しちゃうのはこのせい.