6月に、xv6のテキストを翻訳して、ある程度の知識を手に入れたが、まだまだマスターしたとはいい難い。 そこで、せっかくシミュレータも作ったし、xv6をx86以外のアーキテクチャに移植して、xv6の構造を勉強してみることにしよう。 対象としては、RISC-V、MIPSのどちらかかな。
とりあえず、MIPS版は以下を発見した。
これをforkして、以下のリポジトリを作成した。
まずは、ビルド環境の整備からだ。自分の環境では、通常版のgccしか持っていないため、Makefileとkernel.ldを書き換えた。
これで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