# ソフトウェアシステム論で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
|
|