Upgrade to Pro — share decks privately, control downloads, hide ads and more …

xv6 chapter1 first

xv6 chapter1 first

Tomoya Ishizaki

April 08, 2019
Tweet

More Decks by Tomoya Ishizaki

Other Decks in Programming

Transcript

  1. • ハードウェアの抽象化(open, read, write, close) • CPUの抽象化(fork) • メモリの抽象化(exec) •

    共有先の抽象化(ファイルディスクリプタ) 強い独立性を保つために抽象化が必要
  2. モノリシックカーネル • OSの操作は全てカーネルモードで実行する • fork, exec, open, close, read, writeなどは

    全てカーネルコールとして実装 • システムコールがカーネルへのインターフェースとなる
  3. 仮想アドレス空間 ユーザー領域 • 0番地から ◦ 命令 ◦ グローバル変数 ◦ スタック

    ◦ 最後にヒープ(malloc用) カーネル領域 • 0x80100000番地から • カーネルコールはユーザーメモリ を直接参照可能
  4. 各プロセスは二つのスタックを所持 ユーザースタック • プロセスがユーザ命令を実行した時に使用 • カーネルスタックは空 カーネルスタック • プロセスがカーネルモードにスイッチした時に使用 •

    ユーザスタックはデータを保持するだけ カーネルスタックは分離されており, ユーザースタックが破壊されてもカーネルコードを実行可能
  5. • 起動時に呼び出されて、OSを動かす • ブート + ローダ ◦ ブート ▪ OSを起動するために、

    ◦ ローダ ▪ カーネルをハードディスクからメモリに読み込む • 詳細はAppendix B ブートローダ
  6. • 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行目)
  7. entry.S(前半) • (l.46) ページサイズの拡張 ◦ CR4_PSE(0x0000001)を レジスタ%cr4に書き込む • (l.50) ページディレクトリの設定

    ◦ entrypgdrの物理アドレスを レジスタ%cr3に書き込む ◦ V2P_WO(x) ((x) - KERNBASE) • (l.54) ページングを有効化 ◦ CR0_PGをフラグをレジスタ%cr0に 設定してページングハードウェアを 有効化する
  8. entry.S(後半) • (l.58) スタックポインタを設定 ◦ スタックポインタ%espを作成し、 メモリのスタック領域に設定 ◦ .comm stack,

    KSTACKSIZE • (l.61) main関数にジャンプ ◦ プロセッサが低いアドレスから 高いアドレスに遷移する ◦ この間接的なジャンプをするために entry.Sのようなアセンブラが必要 • main関数に遷移して実行を開始