FPGA開発日記

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

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

前回の続きで、xv6を移植するときのルーチンを修正していこう。現在は、ようやくほとんどすべてのソースコードコンパイルできるようになっている。

さらに、usertests.cでコンパイルエラーが発生したが、これは何のことだかよくわからない。

usertests.c: In function 'validateint':
usertests.c:1553:3: error: unknown register name 'ebx' in 'asm'
   asm("mov %%esp, %%ebx\n\t"
   ^

当該部分はusertests.cの部分だ。突然x86のコードが現れており、なんだか良く分からない。

@@ -1549,14 +1549,14 @@ sbrktest(void)
 void
 validateint(int *p)
 {
-  int res;
-  asm("mov %%esp, %%ebx\n\t"
-      "mov %3, %%esp\n\t"
-      "int %2\n\t"
-      "mov %%ebx, %%esp" :
-      "=a" (res) :
-      "a" (SYS_sleep), "n" (T_SYSCALL), "c" (p) :
-      "ebx");
+  // int res;
+  // asm("mov %%esp, %%ebx\n\t"
+  //     "mov %3, %%esp\n\t"
+  //     "int %2\n\t"
+  //     "mov %%ebx, %%esp" :
+  //     "=a" (res) :
+  //     "a" (SYS_sleep), "n" (T_SYSCALL), "c" (p) :
+  //     "ebx");

とりあえずは現在は省略ということにした。xv6の解説書を読んでも記述がなくよく分からなかった。

github.com

これでとりあえずすべてのソースコードコンパイルできるようになったが、残っているのはBootcodeの部分だ。xv6のブートの部分をどうしようか迷っているのだが、x86の場合はまずはBootcodeと呼ばれるものが走り、起動に最小限必要なルーチンがメモリにコピーされる。それからブート処理が始まるという流れだ。

これをどのようにしてRISC-V版でも対応させるか、という話になる。組込みシステムなどではHDDなど最初からついていないので、SDカードからデータを読み込んで起動しているものと思う。 まずはbootcodeをRISC-Vで記述して、スタートアップのコードを作るしかない。これはxv6ではbootasm.Sとして記述されており、x86アセンブラで記述してあるため、これをRISC-Vに移植する。

まず、RISC-Vはリセット後どこから起動するかというと、それはリセットベクタとして定義されている。

f:id:msyksphinz:20160410141318p:plain

上位アドレスに張り付くモードと、下位アドレスに張り付くモードが存在しているが、とりあえず下位に張り付くモードを使っていてよいと思う。

そんでもってxv6.imgをダンプさせると、その部分にはオブジェクトファイルのヘッダが張り付いているため、うまくブートできていない。

$ hexdump xv6.img (RISC-V版)
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000200 457f 464c 0101 0001 0000 0000 0000 0000
0000210 0002 00f3 0001 0000 0000 8010 0034 0000
0000220 3448 0003 0000 0000 0034 0020 0001 0028
0000230 0014 0011 0001 0000 1000 0000 0000 8010
0000240 0000 0010 d0f8 0000 6bac 0001 0007 0000
0000250 1000 0000 0000 0000 0000 0000 0000 0000
0000260 0000 0000 0000 0000 0000 0000 0000 0000
*
0001200 f073 3000 e117 0000 0113 18c1 5297 0000
0001210 8293 e882 8067 0002 0013 0000 0113 fe01
0001220 2e23 0011 2c23 0081 0413 0201 a7b7 8010
...

まずは、この部分をなんとかしなければならない。x86コンパイルしたxv6にも挿入されている。

$ hexdump xv6.img (x86版)
0000180 144b 438b 8310 0cc4 c139 0c76 c701 c129
0000190 00b8 0000 fc00 aaf3 c383 3920 77de ffd1
00001a0 1815 0100 8d00 f465 5e5b 5d5f 00c3 0000
00001b0 0000 0000 0000 0000 0000 0000 0000 0000
*
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200 457f 464c 0101 0001 0000 0000 0000 0000
0000210 0002 0003 0001 0000 000c 0010 0034 0000
0000220 5cc0 0002 0000 0000 0034 0020 0002 0028
0000230 0011 000e 0001 0000 1000 0000 0000 8010
0000240 0000 0010 b5b6 0000 525c 0001 0007 0000
0000250 1000 0000 e551 6474 0000 0000 0000 0000
0000260 0000 0000 0000 0000 0000 0000 0007 0000
0000270 0010 0000 0000 0000 0000 0000 0000 0000
0000280 0000 0000 0000 0000 0000 0000 0000 0000
*
0001200 b002 1bad 0000 0000 4ffe e452 200f 83e0
0001210 10c8 220f b8e0 a000 0010 220f 0fd8 c020
...

これを除去して、ISSでxv6が起動できるように持っていきたい。