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

xv6 chapter1 first

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

xv6 chapter1 first

Avatar for Tomoya Ishizaki

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関数に遷移して実行を開始