FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

xv6

RISC-V版xv6における割り込み処理の実装

xv6

xv6の割り込み処理の実装は基本的にx86用に記述されているため、それを他のアーキテクチャに移植するのはなかなか骨が折れる。 RISC-Vのアーキテクチャでは割り込み処理は下記のPrivileged Architecture Manualに従っており、0x100番台のアドレスもしくは、H…

最初のプロセスを起動させるための試行錯誤

xv6

RISC-Vにてxv6を起動させるための続き。トラップフレームと、コンテキストの内容を書き換えることによってまずはswitch()によりforkretが呼ばれるようになるところまで来た。 github.com 最初のプロセスが呼ばれる仕組み まずはuserinit()により最初のプロセ…

xv6がブートしてから最初のプロセスが立ち上がるまでの仕組み

xv6

xv6は最初にブートがかかってから、暫くメモリや外部周辺機器の初期化を行うが、そのあとどのようにして最初のプログラムが立ち上がるのだろうか? まずは、ブートローダが起動を完了すると、mpmain()に入る。 // Bootstrap processor starts running C code…

RISC-Vにおける可変長引数関数cprintf()のデバッグ

xv6

msyksphinz.hatenablog.com RISC-V向けにxv6を移植するのに、cprintf()がないとどうにもうまく行かないので、とりあえず即席でcprintf()の引数を調整するアセンブラを作成した。 前回の記事で試行し、失敗したものを多少修正。可変長引数の場合は引数の位置…

x86のVGA操作について

xv6

xv6の動作検証を行っている最中に、VGAの制御を行っている場所を見付けた。console.cでは、UARTの操作をしているだけだなく、VGAディスプレイに表示する機能もサポートしている。 void consputc(int c) { if(c == BACKSPACE){ uartputc('\b'); uartputc(' ')…

RISC-V版xv6のコンソールデバッグ(cprintfの謎解析)

xv6

xv6をRISC-Vに移植する作業を進めているが、cprintfが上手く表示できずにずっと止まっている。 前回、怪しいと思ったのはここだ。 msyksphinz.hatenablog.com 80100600 <cprintf>: 80100600: fa010113 addi sp,sp,-96 80100604: 02112e23 sw ra,60(sp) 80100608: 0281</cprintf>…

xv6教科書翻訳を(多少)リファクタリング(誤字脱字の修正と怪しい日本語の修正)

xv6

github.com https://pdos.csail.mit.edu/6.828/2014/xv6/book-rev8.pdf xv6の移植を続けていて、ググっているとよく自分自身の文献にぶつかったりするのだが、その時の誤字脱字の多さに絶望するため多少リファクタリングを行った。 xv6の翻訳についてはまだ1…

RISC-V版xv6のコンソールデバッグ

xv6

RISC-Vに移植したxv6のデバッグを引き続き行っているのだが、どうやら表示系の調子がおかしい。 cpu-4096,33554432: init start コア数が多すぎる(笑)。 デバッグしているのだが、ついでなのでxv6の表示系はどのように構成されているのか見ていく。 xv6のUAR…

xv6のブートプロセスにおけるEBDAとBDAについて

xv6

xv6のブートプロセスにおいて、mpinitという関数があり、予想ではマルチプロセッサ関係の初期化を行っている。 その中で、EBDAやBDAというBIOS関連のアクセスに入る部分があるので、具体的に何をしているのかを調べてみた。 void mpinit(void) { ... bcpu = …

xv6のブート時に実行していること(ブート時の初期化とxchg命令)

xv6

自作ISSで少しずつxv6が起動してきた。 最初に実行されるのはmain.cのmain()だが、これはどのようにして起動しているのか少し見て行こう。 そういえば自分でxv6の教科書を翻訳していたのだった。これを参考に進めて行く。 github.com int main(void) { kinit…

xv6のブートアップの仕組み(1. イメージのロードとelfの判定)

xv6

しばらくxv6のRISC-Vへの移植で、ブートアップが上手くいかずに悩んでいた。 msyksphinz.hatenablog.com msyksphinz.hatenablog.com msyksphinz.hatenablog.com どの部分でコケていたかというと、bootmain.cでロードイメージの判定をして、ブートアップをす…

xv6を移植するときに書き換えるルーチンについて調査(7)

xv6

msyksphinz.hatenablog.com xv6のRISC-Vへのインポートの続き。 そういえばISSのRISC-V用ビルドには、IDEモジュールとUARTモジュールを追加していなかった。 x86では、IDEやUARTはinbやoutb命令で操作できるが(つまりポートマップドI/O)、MIPSやRISC-Vではそ…

xv6を移植するときに書き換えるルーチンについて調査(6)

xv6

msyksphinz.hatenablog.com xv6を移植するときに書き換えるルーチンについて調査(5) の続き。 コンパイルはできるようになったのだが、imgファイルを確認すると、まだうまくいっていないところがある。 RISC-Vはリセットベクタが0x0200となっているのだが、i…

xv6を移植するときに書き換えるルーチンについて調査(4)

xv6

引き続き、RISC-Vにxv6を移植するための情報を調査していこう。 github.com initcode.Sは一番最初のプロセスとして実行される。 引数を設定し、システムコールを呼び出す。 RISC-Vにて、システムコールを発生させるには以下の命令を使う。 ecallは、システム…

xv6を移植するときに書き換えるルーチンについて調査(3)

xv6

まずは一折ビルドしていきながら、コンパイルエラーになったところを順番に直していくという作業だった。 trap.cでいくつかのエラーが出てくる。やはり、トラップフレームを書き換えたことによるものだ。 github.com x86の版では、例外の要因を確かめるため…

xv6を移植するときに書き換えるルーチンについて調査(2)

xv6

xv6はx86用に実装されているのだが、それを他のアーキテクチャに移植する場合に、何が必要かについて調査している。 最近は仕事も忙しくて、まったく調査できていなかったのだが、少し時間ができたので、続きをやっていこう。 msyksphinz.hatenablog.com cpu…

xv6を移植するときに書き換えるルーチンについて調査(1)

xv6

xv6はx86をベースに書かれている。当然、プリミティブな部分はx86の命令を使って記述されているのだが、その部分をしっかり理解すれば、他のOSへの移植も簡単に行うことができるのではないだろうか。 今回は、xv6をRISC-Vに移植することを前提に、xv6のどの…

xv6のプロセス切り替えの仕組みと最初のプロセス生成

xv6

xv6のプロセス切り替えの仕組み xv6をMIPSに移植しながら、プロセス切り替えの仕組みを確認しているんだけれども、ISSの機能が実装できてなさ過ぎて泣けてくる。 xv6が最初に立ち上がったとき、処理はmpmain()へと移り、それからスケジューラに移動する。基…

GDBとISSを利用しながらプロセスがSwitchされる挙動を追い掛けていく

xv6

プロセスが開始される前に、xv6ではinitlog()が起動し、ログをディスクに書き込むための準備が行われる。 msyksphinz.hatenablog.com msyksphinz.hatenablog.com proc.c if (first) { // Some initialization functions must be run in the context // of a …

xv6の割り込みに必要な機能を実装する

xv6

xv6のデバッグを進めるためにGDBの整備は進んだのだが、ディスクアクセスなどの機能がまだサポートできていない。 また、重要な問題として、割り込みの機能を実装ができていないのだ。ディスクアクセスについて、ディスクからの読み込みが完了すると割り込み…

ISSとGDBを接続してxv6をデバッグする環境を構築する

xv6

自作ISSに、GDBのインタフェースを追加したので、これを使ってxv6のデバッグを行いたい。何となくMIPSの移植は出来ているので、プロセスの切り替えとか、GDBで観察できれば、よりデバッグが容易になると思うんだ。 xv6のコードは、どなたかがMIPSに移植して…

xv6のソースコード: mpmainから先を追い掛ける

xv6

最近xv6のシミュレーションにあまり手をつけれていなかったが、久し振りに進化したシミュレータを使ってやってみた。 mpmain()までは追い掛けることが出来たので、mpmain以降、プロセスの切り替えなどに焦点を当ててみる。 // Common CPU setup code. static…

xv6が最初のプロセスを立ち上げるまでの勉強(プロセスのロードから立ち上が、、、らなかった)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、switchuvmの中で何が起きているのか見ていこう。 <FunctionCall 59150135: switchuvm(0x8010a994)> <FunctionCall 59150142: pushcli(0x80107538)> <FunctionCall 59150149: disableinterrupt(0x8010717c)> <FunctionCall 59150155: is_interruptible(0x8010713c)> </functioncall></functioncall></functioncall></functioncall>

xv6が最初のプロセスを立ち上げるまでの勉強(mpmainの中を追いかける)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、mpmain()の中で何が起きているのか、階層トレースを見てみながら、追い掛けていこう。 まずは、schedulerが呼ばれて、enableinterrupt()により割り込みが有効になる。 <FunctionCall 59147183: mpmain(0x8010530c)> <Return: mpmain> <FunctionCall 59147195: cprintf(0x801007fc) ...> <Return: cprintf> </return:></functioncall></return:></functioncall>

テキストを読んで、xv6のブートプロセスを理解する(4: MIPS用にバイナリの配置を変更)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、前回まででページの初期化が出来るようになったのだが、途中で落ちてしまう。 ユーザプロセス用の初期化ルーチンで落ちているようだった。具体的には、以下のvm.c内のinituvm()内…

テキストを読んで、xv6のブートプロセスを理解する(3: メモリの確保)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 さて、xv6のmainに足を踏み入れると、以下のようなコードが記述されている。 github.com extern char end[]; // first address after kernel loaded from ELF file // Bootstrap proces…

ページテーブルを有効にするまでのブートローダの起動のしくみ

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 xv6のbootmain.cなどのブートローダは、まだセグメントやページテーブルが有効な状態としては利用されない。 実際にOSを動かすとなれば、ページテーブルが必須となるが、これはどのよう…

ブートセクションをずらしてISSでブートできるようにする(ディスクのロード)

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 xv6のbootmain.cをコンパイルしてブートローダを作ってみたが、何とMIPSのコンパイラではオブジェクトのサイズが1セクタ(512バイト)に入り切らなかった! そこで、今回はアーキテクチャ…

ブートセクションをずらしてISSでブートできるようにする

xv6

※ この記事はまだ勉強中のため、いろいろ間違いがあるかもしれません。 xv6のブートセクションはx86のものに従っているため、ディスクの先頭のセクションに配置されている。 hexdump xv6.img | less -o xv6.img.dmp 0000000 31fa 8ec0 8ed8 8ec0 e4d0 a864 7…

U-bootをMIPSアーキテクチャ向けにビルドする

xv6

OSの勉強の一環として、u-bootがどのようにして動作するのかを見てみることにした。 WebHome < U-Boot < DENX U-bootはOSのブートローダとして、特にマイコンや、マイコンボードなどで利用されているようだ。xv6の勉強をしていると、BIOSからの動作ばかりを…