Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
xv6 chapter1 first
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Tomoya Ishizaki
April 08, 2019
Programming
170
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
xv6 chapter1 first
Tomoya Ishizaki
April 08, 2019
More Decks by Tomoya Ishizaki
See All by Tomoya Ishizaki
Chompyらくとく便のこれまでとこれから
zaq1tomo
0
2.2k
【輪講】Ray: A Distributed Framework for Emerging AI Applications
zaq1tomo
2
300
xv6 chapter5 first
zaq1tomo
0
280
Hybrid Casper FFG
zaq1tomo
3
710
Other Decks in Programming
See All in Programming
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
さぁV100、メモリをお食べ・・・
nilpe
0
140
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
340
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
230
dRuby over BLE
makicamel
2
340
3Dシーンの圧縮
fadis
1
770
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
11
4.1k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
680
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
OSもどきOS
arkw
0
570
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
180
AIで効率化できた業務・日常
ochtum
0
140
Featured
See All Featured
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Embracing the Ebb and Flow
colly
88
5.1k
Abbi's Birthday
coloredviolet
2
8.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
180
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
730
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Become a Pro
speakerdeck
PRO
31
6k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Transcript
xv6 chapter1 first Tomoya Ishizaki
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
本題に入る前に
OSは大きく分けて三つの機能が要求される 1. multiplexing(多重化) 2. isolation(独立性) 3. interaction(相互作用)
1. multiplexing
1. multiplexing • time-share(時分割) 一つのCPUで複数のプロセスが同時に動いているように見せる CPU時間 プロセスB プロセスA
2. isolation
2. isolation • それぞれのプロセスを独立させる • あるプロセスがバグなどで異常終了したとしても その他のプロセスに影響を与えない
3. interaction
3. interaction • パイプなど • プロセスとプロセスの間でやり取りして 複雑なタスク処理を実現する
オペレーティングシステムの三要求 1. multiplexing 2. isolation 3. interaction
では本題
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
物理的資源の抽象化
OSによる抽象化がなかったら?
A. 「強い独立性」を保てない 各自でハードウェア資源の獲得・解放をしなければなら なず, それぞれのアプリケーションは互いを信用する必 要がある. ただし、組み込み・リアルタイムシステムではパフォーマ ンスのため採用されることも.
CPUの抽象化 forkなど アプリケーションは... • スイッチングを気にしなくて済む OSは... • 悪いプログラムを強制スイッチできる
OSによる抽象化
例えば... • ハードディスクの抽象化 • CPUの抽象化 • メモリの抽象化 • 共有先の抽象化
open, read, write, close アプリケーションは... • パス名を用いて資源にアクセスできる OSは... • ハードディスクを管理できる
ハードディスクの抽象化
メモリの抽象化 execなど アプリケーションは... • 簡単にイメージを保存できる OSは... • 物理メモリを管理できる
共有先の抽象化 ファイルディスクリプタ • ターミナル, ファイルシステム, パイプ間での 相互的な操作が簡単に • アプリケーションは共有先の詳細を知る必要がない
• ハードウェアの抽象化(open, read, write, close) • CPUの抽象化(fork) • メモリの抽象化(exec) •
共有先の抽象化(ファイルディスクリプタ) 強い独立性を保つために抽象化が必要
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
ユーザーモード, カーネルモード, システムコール
強い独立性のためには強い境界が必要 ハードウェア オペレーティングシステム アプリケーション ユーザー システムを利用 システムを実装
プロセッサのサポートによって二つのモードを実現 1. user mode(ユーザーモード) 2. kernel mode(カーネルモード) カーネルモードでは, privileged instruction(特権命令)が実行できる
具体例:I/O処理 ユーザー空間 カーネル空間 ① 読み書き命令 割込み ② 命令をチェック ③ 命令を実行
④ 終わったら戻る
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
カーネルの構成
どの部分をカーネルとするかで二つのタイプに分けられる https://techdifferences.com/difference-between-microkernel-and-monolithic-kernel.html
モノリシックカーネル • OSの操作は全てカーネルモードで実行する • fork, exec, open, close, read, writeなどは
全てカーネルコールとして実装 • システムコールがカーネルへのインターフェースとなる
モノリシックカーネルの利点 • OSの操作全てがハードウェアの全権限で実行される • それぞれの部分の権限範囲について考える必要がない • OSの異なる部分が協調して動作することも容易 ◦ バッファキャッシュ ◦
ファイルシステムと仮想メモリによる協調
モノリシックカーネルの欠点 • 異なる部分間のインターフェースは複雑であり, OS開発者はミスを生みやすい • しかしモノリシックカーネルにおいてバグは致命的 • バグによってカーネルが異常終了するとコンピュータは 動作不能となり, アプリケーションも動作不能
• コンピュータは再起動せざるを得なくなる
マイクロカーネル • カーネルは, I/O操作やメッセージの送信など いくつかの低レイヤの関数のみで構成 • ほとんどのオペレーティングシステムの機能は ユーザレベルのサーバーとして実装される • サーバーがマイクロカーネルを介してメッセージを
やり取りすることで動作する
xv6はモノリシックカーネル • 古典的なUnix派生のOSはモノリシック • それに習いxv6もモノリシックで作られている • Tanenbaum–Torvalds debate ◦ “LINUX
is obsolete” ◦ https://en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
プロセスの概要
プロセスは独立性を提供 • プロセスは抽象化された一つのマシンのように実現 • プログラムにaddress space(アドレス空間)を提供 ◦ プライベートなメモリシステムを使える • それぞれ固有のCPUを持つように動作できる
プロセスの恩恵 • メモリの内容を見られることを防ぐ • 他のプロセスから破壊されることを防ぐ • カーネルを破壊してしまうことを防ぐ • 悪意のあるプログラムによる攻撃を防ぐ
xv6でのアドレス空間の実現 • ページテーブルを利用 • 仮想アドレスを物理アドレス にマップする • プロセスが固有のアドレス 空間を持つことを可能に •
詳しくは2章
仮想アドレス空間 ユーザー領域 • 0番地から ◦ 命令 ◦ グローバル変数 ◦ スタック
◦ 最後にヒープ(malloc用) カーネル領域 • 0x80100000番地から • カーネルコールはユーザーメモリ を直接参照可能
proc構造体 • それぞれのプロセスの状態の多くを管理する • カーネルの重要な情報 ◦ pgdir(ページテーブル) ◦ kstack(カーネルスタック) ◦
state(実行状態)
スレッド • プロセスはスレッドを保持する • スレッドはプロセスの命令を実行 • スレッドは停止させたり再開させたりすることが可能 • 状態の多くはスレッドのスタックに保存される ◦
ローカル変数、関数呼び出しのリターンアドレスなど
具体例:プロセスの状態遷移 実行可能状態 (ready) 実行状態 (running) 終了状態 (exiting) 待ち状態 (waiting) CPUの解放
CPUの獲得 実行が終了 入出力待ち 入出力の終了 • 詳しくは5章
各プロセスは二つのスタックを所持 ユーザースタック • プロセスがユーザ命令を実行した時に使用 • カーネルスタックは空 カーネルスタック • プロセスがカーネルモードにスイッチした時に使用 •
ユーザスタックはデータを保持するだけ カーネルスタックは分離されており, ユーザースタックが破壊されてもカーネルコードを実行可能
具体例:システムコールの実行 • 詳しくは後半と2章 1. プロセスがシステムコールを発行する 2. プロセッサがカーネルスタックにスイッチ 3. ハードウェアの権限レベルを上げる(カーネルモード) 4.
カーネル命令を実行 5. 実行が完了 6. ハードウェアの権限レベルを戻す(ユーザーモード) 7. 再びユーザスタックにスイッチ
オペレーティングシステムの構成(前半) • 物理的資源の抽象化 • ユーザーモード, カーネルモード, システムコール • カーネルの構成 •
プロセスの概要 • コード:最初のアドレス空間
コード:最初のアドレス空間
カーネルによる最初のアドレス空間の生成 • 強力な独立性のため、自身のアドレス空間を作る必要 • カーネルがアドレス空間をどのように作っていくか • entry.S ◦ 50行弱のアセンブラ ◦
https://github.com/mit-pdos/xv6-public/blob/master/entry.S
PCの電源を入れた時に起こること ざっくりと流れを追うと、 1. BIOSを起動 2. ブートローダ(boot loader)を実行 3. OSが動き始める
• 起動時に呼び出されて、OSを動かす • ブート + ローダ ◦ ブート ▪ OSを起動するために、
◦ ローダ ▪ カーネルをハードディスクからメモリに読み込む • 詳細はAppendix B ブートローダ
• カーネルを物理アドレスの0x100000へロード • 0x80100000ではないの? ◦ 小さなマシンの可能性がある • 0x0ではないの? ◦ BIOSやブートローダで使用済
xv6のカーネルをロードする
• カーネルを物理アドレスの0x100000へロード • 0x80100000ではないの? ◦ 小さなマシンの可能性がある • 0x0ではないの? ◦ BIOSやブートローダで使用済
xv6のカーネルをロードする
ブートページテーブル https://github.com/mit-pdos/xv6-public/blob/master/main.c#L102
• entry0 (main.c 105行目) ◦ 仮想アドレスの [0x0:0x400000) を物理アドレスの [0x0:0x400000) に
◦ entryが低いアドレスで動いている間だけ使用する ◦ entryが終了すると消去 • entry512 (main.c 107行目) ◦ KERNBASE>>PDXSHIFT ◦ 仮想アドレスの [KERNBASE:KERNBASE+0x400000) を物理アドレスの [0x0:0x400000) に ◦ entry.Sが終了した後にカーネルが使用する ◦ ※ 命令やデータがブートローダより低いアドレスで実行されることを想定 ◦ → カーネルの命令やデータは、 4メガバイト以内でなけれないけない pde_t entrypgdir[NPDENTRIES] (main.c 103行目)
entry.S(前半) • (l.46) ページサイズの拡張 ◦ CR4_PSE(0x0000001)を レジスタ%cr4に書き込む • (l.50) ページディレクトリの設定
◦ entrypgdrの物理アドレスを レジスタ%cr3に書き込む ◦ V2P_WO(x) ((x) - KERNBASE) • (l.54) ページングを有効化 ◦ CR0_PGをフラグをレジスタ%cr0に 設定してページングハードウェアを 有効化する
entry.S(後半) • (l.58) スタックポインタを設定 ◦ スタックポインタ%espを作成し、 メモリのスタック領域に設定 ◦ .comm stack,
KSTACKSIZE • (l.61) main関数にジャンプ ◦ プロセッサが低いアドレスから 高いアドレスに遷移する ◦ この間接的なジャンプをするために entry.Sのようなアセンブラが必要 • main関数に遷移して実行を開始
後半へ
ご清聴ありがとうございました