TODO

  • JTAG-UARTってDE10-Lite+MIPS+xv6で使えるのか。使えなかったらシリアルポート付きFPGAを購入する必要あり?

http://blog.goo.ne.jp/sim00/e/236d685cc29873571051270075449cac

Nios II/eでHello, world! (Quartus IIとQsys) - FPGAがさっぱり分からない人がDE0でFPGAを勉強する

x86のVGA操作について - FPGA開発日記

  • UARTってそもそもなに?(実装)

UART in VHDL and Verilog for an FPGA

  • harvard architectureだとData MemoryとProgram Memoryが別れているけど、kernelからどうやってProgram領域にデータロードするのか

(UNIXv6を読むと)textセグメント、dataセグメントに分けて考えているが、恐らくこれがそのままProgramMemory、DataMemoryに対応づくのだと思う。両Memoryは必ずしも物理的に別個のデバイスでなくとも問題ない。(ただし、回路設計上、アドレスバス、データバスは別々に接続されてなければならない。でないとRISC的な5段パイプラインが実現できないため)

  • User Programとは?

Makefileをみると、ユーザプログラム(cat, mkdir, echo...)は最初の段階でroot inode dirに書き込んでいるようにみえる。fork & execの過程でどうやって主記憶(ディスク)からProgramMemoryへ読み込まれるのだろうか。そもそもMIPS命令セットには「ProgramMemoryへ書き込み」などという命令はないのだから、やはり物理メモリは1本で、ProgramMemoryと呼ばれるものはあくまでキャッシュにすぎない。というイメージだろうか?

UNIXではコンテキストスイッチによってマルチプロセスを実現させる。レジスタは本数も少なく、容量も僅かなのでコンテキストスイッチの際、そのまま退避させたり復帰させたりするのが容易。しかし、物理メモリ上のデータはでかいのでいちいち退避させず、物理アドレスと仮想アドレスの対応関係を実行時に変換する。

各プロセスの仮想アドレス空間のアドレス範囲は同じでありオーバーラップしているのが一般的である。これを多重仮想記憶と呼ぶ。MMUは現に実行中のプロセスの仮想空間のみを認識する。コンテキストスイッチでプロセスを切り替える際、MMUに対して仮想アドレス空間の切り替えも指示する必要があるが、その方式はアーキテクチャによって様々である。

なお、アーキテクチャによっては、多重仮想記憶がオーバーラップしていると捉えず、全仮想空間がフラットに並んだ巨大な仮想空間を想定することもある。この場合、仮想空間識別番号が巨大な仮想空間のアドレスの一部と考えられる。もっとも、これは単にモデル化の手法が違うだけで実装に大きな違いがあるわけではない。実際、各ユーザープロセスが自分の仮想空間識別番号以外の仮想空間にアクセスすることはできない。

R3000の場合、TLBでPIDを識別する6bit情報を持っているので、仮想アドレス+PIDで物理アドレスマッピングする感じ

f:id:varmil:20171105145606p:plain http://www.cqpub.co.jp/dwm/contents/0074/dwm007401330.pdf

  • xv6-mipsにおける、bootloaderではbootasm.Sを使ってない?

YES.使ってない。そもそもbootasmはx86の命令セットを使用しているのでMIPSでは動作しない。

  • "unix v6 bootloader" v6はbootloaderも併せ持つようだが、どういう実装になっているのか
  • xv6-MIPSリンカスクリプトは?
  • メモリマップドのベースアドレスはどうやって決めている?MIPSの仕様?
  • MIPS R4000, 3000, 2000の違い(xv6-mipsはR4000基準のため)