FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

xv6を試そう(移植のための基礎知識の勉強)

6月に、xv6のテキストを翻訳して、ある程度の知識を手に入れたが、まだまだマスターしたとはいい難い。 そこで、せっかくシミュレータも作ったし、xv6をx86以外のアーキテクチャに移植して、xv6の構造を勉強してみることにしよう。 対象としては、RISC-V、MIPSのどちらかかな。

とりあえず、MIPS版は以下を発見した。

github.com

これをforkして、以下のリポジトリを作成した。

github.com

まずは、ビルド環境の整備からだ。自分の環境では、通常版のgccしか持っていないため、Makefileとkernel.ldを書き換えた。

github.com

これでmakeすると、xv6.imgとfs.imgが作成される。さて、これはどうやって処理すればいいんだろう。RISC-VのSpikeのソースコードとかを読めば、扱い方が分かるかな。

make
...
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _cat usr/cat.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _cat > cat.asm
mipsel-linux-elf-objdump -t _cat | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > cat.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/echo.o usr/echo.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _echo usr/echo.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _echo > echo.asm
mipsel-linux-elf-objdump -t _echo | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > echo.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/forktest.o usr/forktest.c
# forktest has less library code linked in - needs to be small
# in order to be able to max out the proc table.
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _forktest usr/forktest.o lib/ulib.o lib/usys.o
mipsel-linux-elf-objdump -S _forktest > forktest.asm
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/grep.o usr/grep.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _grep usr/grep.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _grep > grep.asm
mipsel-linux-elf-objdump -t _grep | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > grep.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/init.o usr/init.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _init usr/init.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _init > init.asm
mipsel-linux-elf-objdump -t _init | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > init.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/kill.o usr/kill.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _kill usr/kill.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _kill > kill.asm
mipsel-linux-elf-objdump -t _kill | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kill.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/ln.o usr/ln.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _ln usr/ln.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _ln > ln.asm
mipsel-linux-elf-objdump -t _ln | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > ln.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/ls.o usr/ls.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _ls usr/ls.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _ls > ls.asm
mipsel-linux-elf-objdump -t _ls | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > ls.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/mkdir.o usr/mkdir.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _mkdir usr/mkdir.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _mkdir > mkdir.asm
mipsel-linux-elf-objdump -t _mkdir | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > mkdir.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/rm.o usr/rm.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _rm usr/rm.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _rm > rm.asm
mipsel-linux-elf-objdump -t _rm | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > rm.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/sh.o usr/sh.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _sh usr/sh.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _sh > sh.asm
mipsel-linux-elf-objdump -t _sh | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > sh.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/stressfs.o usr/stressfs.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _stressfs usr/stressfs.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _stressfs > stressfs.asm
mipsel-linux-elf-objdump -t _stressfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > stressfs.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/wc.o usr/wc.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _wc usr/wc.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _wc > wc.asm
mipsel-linux-elf-objdump -t _wc | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > wc.sym
mipsel-linux-elf-gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -fvar-tracking -fvar-tracking-assignments -O0 -g -Wall -Wunused-function -MD -gdwarf-2 -march=mips4 -G0 -fno-omit-frame-pointer -I. -fno-stack-protector   -c -o usr/zombie.o usr/zombie.c
mipsel-linux-elf-ld -m elf32elmip -L. -G0 -N -e main -Ttext 0 -o _zombie usr/zombie.o lib/ulib.o lib/usys.o lib/printf.o lib/umalloc.o
mipsel-linux-elf-objdump -S _zombie > zombie.asm
mipsel-linux-elf-objdump -t _zombie | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > zombie.sym
./mkfs fs.img README _cat _echo _forktest _grep _init _kill _ln _ls _mkdir _rm _sh _stressfs _wc _zombie
used 29 (bit 1 ninode 26) free 29 log 30 total 1024
balloc: first 595 blocks have been allocated
balloc: write bitmap block at sector 28
dd if=/dev/zero of=xv6.img count=10000
10000+0 records in
10000+0 records out
5120000 bytes (5.1 MB) copied, 0.012024 s, 426 MB/s
dd if=kernel of=xv6.img seek=1 conv=notrunc
8594+1 records in
8594+1 records out
4400252 bytes (4.4 MB) copied, 0.00675552 s, 651 MB/s