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

xv6輪講

 xv6輪講

mt_caret

April 26, 2019
Tweet

More Decks by mt_caret

Other Decks in Technology

Transcript

  1. 輪講の流れ - MITの本 https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf に沿って - OSの構成 - ページテーブル -

    トラップ・割り込み・ドライバ - ロック - スケジューリング - ファイルシステム - ブートローダ(※) - 前提知識: OSの基本的な概念(B3講義で扱った範囲程度) - 足りない部分(忘れたところ、x86特有の話等)は適宜復習・補完
  2. struct proc (proc.h, 2336) // Per-process state struct proc {

    uint sz; // Size of process memory (bytes) pde_t* pgdir; // Page table char *kstack; // Bottom of kernel stack for this process enum procstate state; // Process state int pid; // Process ID struct proc *parent; // Parent process struct trapframe *tf; // Trap frame for current syscall struct context *context; // swtch() here to run process void *chan; // If non-zero, sleeping on chan int killed; // If non-zero, have been killed struct file *ofile[NOFILE]; // Open files struct inode *cwd; // Current directory char name[16]; // Process name (debugging) };
  3. 起動 - ブートローダがメモリからロードされ実行 - ブートローダがxv6カーネル(entry.S, 1000)を物理アドレス 0x10_0000へロード - なぜ0x8010_0000にロードしないのか -

    0x8000_0000 = 2G - 物理アドレスがここまであるとは限らない - なぜ0x0にロードしないのか - 0xa_0000:0x10_0000の範囲にIO機器があるため - KERNBASE(memlayout.h, 0207) = 0x8000_0000
  4. entry.S (1000) - ページサイズ拡張を有効化(1045-1048) - ページテーブルのロード(1049-1051) - entrypgdir(main.c, 1305) -

    V2P_WO(memlayout.h, 0213) - ページングの有効化(1052-1055) - ページテーブル実験 - 高アドレスでのmain実行への流れ(1057-1065) - main関数へ(main.c, 1217)
  5. entry.S (1000) - ページサイズ拡張を有効化(1045-1048) - ページテーブルのロード(1049-1051) - entrypgdir(main.c, 1305) -

    V2P_WO(memlayout.h, 0213) - ページングの有効化(1052-1055) - ページテーブル実験 - 高アドレスでのmain実行への流れ(1057-1065) - main関数へ(main.c, 1217)
  6. entry.S (1000) - ページサイズ拡張を有効化(1045-1048) - ページテーブルのロード(1049-1051) - entrypgdir(main.c, 1305) -

    V2P_WO(memlayout.h, 0213) - ページングの有効化(1052-1055) - ページテーブル実験 - 高アドレスでのmain実行への流れ(1057-1065) - main関数へ(main.c, 1217)
  7. main関数(main.c, 1213) - initの準備 userinit(proc.c, 2518) - プロセスの設定 allocproc(proc.c, 2473)

    - forkret(proc.c, 2850) - trapret(trapasm.S, 3324) - struct trapframe(x86.h, 0600) - ユーザ空間の確保 inituvm(vm.c, 1883) - トラップフレームの設定(proc.c, 2532-2539) - プロセスの設定(proc.c, 2541-2552) - initの実行 mpmain(main.c, 1236)
  8. main関数(main.c, 1213) - initの準備 userinit(proc.c, 2518) - initの実行 mpmain(main.c, 1236)

    - スケジューラの起動 scheduler(proc.c, 2750) - メモリ空間の変更 switchuvm(vm.c, 1858) - コンテキストスイッチ swtch(swtch.S, 3059) - initの初期化処理 forkret(proc.c, 2859) - プロセスの開始 trapret(trapasm.S, 3324) - execシステムコール(initcode.S, 8400)