Slide 1

Slide 1 text

xv6輪講 ch.1 mt_caret

Slide 2

Slide 2 text

輪講の流れ - MITの本 https://pdos.csail.mit.edu/6.828/2018/xv6/book-rev11.pdf に沿って - OSの構成 - ページテーブル - トラップ・割り込み・ドライバ - ロック - スケジューリング - ファイルシステム - ブートローダ(※) - 前提知識: OSの基本的な概念(B3講義で扱った範囲程度) - 足りない部分(忘れたところ、x86特有の話等)は適宜復習・補完

Slide 3

Slide 3 text

OSの構成 - 起動 - 最初のアドレス空間作成 - 最初のプロセスの立ち上げ - 最初のシステムコールまで

Slide 4

Slide 4 text

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) };

Slide 5

Slide 5 text

OSの構成 - 起動 - 最初のアドレス空間作成 - 最初のプロセスの立ち上げ - 最初のシステムコールまで

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

起動 - ブートローダがメモリからロードされ実行 - ブートローダがxv6カーネル(entry.S, 1000)を物理アドレス 0x10_0000へロード - なぜ0x8010_0000にロードしないのか - 0x8000_0000 = 2G - 物理アドレスがここまであるとは限らない - なぜ0x0にロードしないのか - 0xa_0000:0x10_0000の範囲にIO機器があるため - KERNBASE(memlayout.h, 0207) = 0x8000_0000

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

OSの構成 - 起動 - 最初のアドレス空間作成 - 最初のプロセスの立ち上げ - 最初のシステムコールまで

Slide 10

Slide 10 text

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)

Slide 11

Slide 11 text

https://wiki.osdev.org/CPU_Registers_x86#CR4

Slide 12

Slide 12 text

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)

Slide 13

Slide 13 text

https://wiki.osdev.org/Paging

Slide 14

Slide 14 text

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)

Slide 15

Slide 15 text

https://wiki.osdev.org/CPU_Registers_x86#CR0

Slide 16

Slide 16 text

OSの構成 - 起動 - 最初のアドレス空間作成 - 最初のプロセスの立ち上げ - 最初のシステムコールまで

Slide 17

Slide 17 text

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)

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

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)