hartは最大8つまで設定する用になっており、2-5までがループで回る。pointer)を下図の網掛けの部分の下部にセットする。sbi_scratchのメンバが入ることになる。next_mode(=S-mode)メンバが重要で、最終的にmepcにnext_addrメンバを指定することでS-modeに遷移したとき、next_addrに着地する。FW_PAYLOAD_PATH=../linux-stable/arch/riscv/boot/Image)であった。pointにjumpすることになる。downする)ことと、mtvec=_trap_handlerとしているので、kernel起動後のtrapにてM-modeに遷移する場合は_trap_handlerがentrypointになることに注意すればいいかな。pointのaddressが0x8000_0000で指定されているのは違和感がある。pointに飛べないと言う事態が起こるのではないか?これは、qemuの方で、0x8000_0000をDRAMの開始地点に設定しているからのようだ。Calenderに合わせて記事にする予定。hartid);}どれか一つの(最初に到着した)hartをcoldと選出され、その他のhartをwarmとする。I/Oの初期化をしたりしている(色々やっているが、煩瑣になるので必要なとき以外は飛ばす)。Interrupt)によって同期される。Platformの場合、clint_ipi_clear/clint_ipi_send関数4が実行される。&clint_ipi[target_hart]);}とてもシンプルで、他のhart(target_hart)にinterruptを送りたい場合は、clint_ipi[target_hart]を1と指定する。対して、interruptの受け手は、clint_ipi[target_hart]として、0と指定する5。Pending)をONにする必要がある。INTerruptor)を操作するメモリの先頭アドレスは0x200_0000である。ch.9.1よりsbi_hart_switch_mode関数~mretまですべてのhartの合流先がsbi_hart_switch_modeで最後にmretを実行するので、この処理を追っていく。false)が呼び出し元だが、scratch変数は「boot時の流れ」の節で説明したこの部分が元になっていることを思い出そう。next_addr=payload_binである。各種CSRが以下のように設定されている。Priviledge)はmretを実行したときの遷移先を決めるbitであった。pointerのこと)だった。modeの遷移の記事を参照してください。CSR(=payload_bin)software処理の開始この辺りはReference[6]の「xv6-riscvを例にしたprivilegeの遷移例」の章に書いた。Reference[2]のch.3.1.6.1を参照のこと。いうことでpayload_bin関数に移る。kernelのentrypointに移ることができた。kernel実行開始時のmodeはS-modeになっていることを確認しておく。kernelのentrypointを実行するまでを見た。続いて、bootが終わると、S-mode<->U-modeを行き来するが、どのtrapがトリガーとなり、M-modeに遷移するのかを確認していきたい。delegate_trapsにて実装されているので、この関数を観察することになる。CSRのbitを立てるとそのbitに対応するtrap発動時にS-modeに遷移させることができる。InterruptはM-modeでなく、S-modeに遷移させるようにしている。exceptionはS-modeで処理するようにしている。正確にはcompilerに関数が戻ってこないことを通知するので、compilerが命令を最適化できるgccのoptionである。interruptに相当するもの。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。