# ソフトウェアシステム論でxv6読み会をした時のメモ(2018/04/16)
# xv6のdebug †
- qemu
- /mnt/dalmore-home/one/src/xv6-rpi/src
|  |  | 
# Boot Sequence
# Boot
|  |  | 
- 
Kernel load - x86ならEFIがある
- ARMだとVersatile(fimware)
 
- 
pagingを設定しなければ動かない 
- 
Boot用のpage table の設定ができた後一連の初期化を行う - memory
- I/O
- process
- file
 
- 
初期化が終わった後 - init process(process番号1番)
- init process は linux だと rc.d/~ の下にある
 
# ls 時の User と System
|  |  | 
- 
10行目 VM の説明 - lsは自分で仮装メモリにアクセスしていくので memory allocation をやる
- malloc は User library だが memory の要求は System でやらなきゃいけない
- break とい System –call で memory を増やす
- memory を増やすと OS は最初に ls のバイナリを生成
- すると、break で取った領域が別にできる
- breakで 取った memory が全部 リアル memory に割り当てられるわけではない
- いくつかは仮想メモリに行く
- memory にアクセスした時に仮装メモリだったらtrapしてmemoryを割り当てる
- memoryが割り当てられなければ、他の実メモリを追い出して書き換える
- VM関係の一連の処理がある
 
- 
fork - forkすると process structure ができる
- process自体は active や waitの状態を持っている
- 複数のactiveがあると順に実行していく(scheduler)
 
- 
kernel の要素 - process management
- scheduler
- file IO
- Virtual Memory
 
この4つの Kernel の要素を読んでいく
# X.v6 の trace
- arm 用の gdb で kernel.elf を開く
- dalmoreに入って
|  |  | 
qemuを立ち上げる 見たいのは Boot Sequence だから qemu-debug を使う
|  |  | 
# makefile-armclang の qemu-debug 部分
|  |  | 
- 
-M versatilepb - 仮想メモリにこの firmwere を使うという指示
- versarilepb は Raspi(ARM) のfirmwereの一種
 
- 
-m 128 - memory の量
 
- 
-cpu ${QEMUCPU} - cpu の種類
- アーキテクチャによって命令違う
- armのxv6を作る時のcompile時にcpuに教えるcpuの種類と合わせる必要がある
- 名前がqemu側とcompile側のcpuの名前が違うので試行錯誤して合わせる
 
- 
-s -S - Boot時に debugger が接続するまで止めるようにする
 
|  |  | 
- memory に直接 load できる値は 長い値だとmemory一旦置かないといけない
- 一番最初に呼び出すのは C で書かれたファイルじゃなくてアセンブラ
- entry.S で行なっている
 
# entry.S
|  |  | 
- B . まで行くとそこを永遠とループする
- ARM fault持ってるので Bではなくfaultにすべき
 
# start.c
166行目
|  |  | 
69行目
|  |  | 
- ARMv6 page table entry
# ソフトウェアシステム論でxv6読み会をした時のメモ(2018/05/27)
# 読んだとこ
- exec
- initcode
- swtch
- flush_tlb
- userスペースにだけflush する(systemにはしない)
 
- fetchint
- kernel 側から指定されたプロセスのアドレスから integer を取ってくるサブルーチン
 
- trapret
- 特権モードを抜ける
 
- coppyout
- current page table に乗ってたら memcopy でできるけど、乗ってないからcopyout必要
 
# exec
- 
xv6-rpi/src から grep で exec を探す - exec.c
- sysecxec の2つがある sysファイルの中で exec 呼んでるので exec から読む
 
- 
gdb側 
|  |  | 
# swtch
|  |  | 
- src 側
|  |  | 
- gdb側
|  |  | 
# trapret
|  |  | 
- src 側
|  |  | 
- gdb側
|  |  | 
- src側
|  |  | 
- gdb側
|  |  | 
|  |  | 
- src側(initcode.S)
|  |  | 
- gdb
|  |  | 
# fetchint
|  |  | 
# copyout
|  |  |