バベルの図書館は完成しない

Extended outer memory module
for my poor native memory.

Posts:
2022/02/13 クラビスの CTO になりました
2020/09/28 gendoc という YAML からドキュメントを生成するコマンドを作った
2020/09/13 ISUCON10 の予選を 7 位で通過した
2019/12/01 Puma の内部構造やアーキテクチャを追う
2019/05/27 Golang の正規表現ライブラリの処理の流れをざっくり掴む
2019/04/29 InnoDB の B+Tree Index について
2019/04/29 InnoDB における index page のデータ構造
2019/04/28 InnoDB はどうやってファイルにデータを保持するのか
2019/01/06 Designing Data-Intensive Applications を読んでいる
2019/01/03 年末年始に読んだ本について、など
2019/01/01 Ruby から ffi を使って Rust を呼ぶ
2018/11/10 ブラウザにおける状態の持ち方
2018/07/01 Rust で web アプリ、 或いは Rust における並列処理
2018/05/14 なぜテストを書くのか
2018/05/13 Rust で wasm 使って lifegame 書いた時のメモ
2018/03/12 qemu で raspbian のエミュレート(環境構築メモ)
2018/03/12 qemu で xv6 のエミュレート(環境構築メモ)
2018/03/03 Ruby の eval をちゃんと知る
2018/02/11 Web のコンセプト
2018/02/03 Rspec のまとめ
2018/02/03 Ruby を関数型っぽく扱う

qemu で xv6 のエミュレート(環境構築メモ)

急に qemu で xv6 動かしてみたくなってしまったので、

どうやったら動いたかをメモする

xv6 は MIT の授業で使われてるっぽいシンプルな OS

詳しくは講義ページとか見ると良さそう

僕の環境

なので elf binary(バイナリの形式の一つ)を使う

x86(Intel の 32-bit CPU アーキテクチャのこと)用にクロスコンパイルするために

toolchain を揃えなきゃいけないみたい

compiler toolchain に関しては講義ページ内のここに書いてある

そして /usr/local とかにぶち込むので基本的に全部 sudo でやればよさそう

必要なもの(Homebrewとか自前ビルドとかで)

必要なもののバージョン

gcc について

とのことで、他のバージョンも色々試したのち 4.6.4 を入れたらうまくいきました

tar xjf gcc-core-4.6.4.tar.bz2  # 解凍する
cd gcc-4.6.4  # できた dir の中に入る
mkdir build  # GCC will not compile correctly unless you build in a separate directory
cd build

# Makefile をつくる
sudo ../configure --prefix=/usr/local \
    --target=i386-jos-elf --disable-werror \
    --disable-libssp --disable-libmudflap --with-newlib \
    --without-headers --enable-languages=c

sudo make all-gcc  # いくつか warning とか error は出るが無視した
sudo make install-gcc         # This step may require privilege (sudo make install-gcc)
sudo make all-target-libgcc
sudo make install-target-libgcc     # This step may require privilege (sudo make install-target-libgcc)
cd ../..

i386-jos-elf-gcc -v  # ここで以下のように出れば ok ぽい
# =>
#  組み込み spec を使用しています。
#  COLLECT_GCC=i386-jos-elf-gcc
#  COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/i386-jos-elf/4.6.4/lto-wrapper
#  ターゲット: i386-jos-elf
#  configure 設定: ../configure --prefix=/usr/local --target=i386-jos-elf --disable-werror --disable-libssp --disable-libmudflap --with-newlib --without-headers --enable-languages=c
#  スレッドモデル: single
#  gcc バージョン 4.6.4 (GCC)

というわけでなんとか クロスコンパイル用の gcc toolchain が入った

gdb について

使えるようにするまでなかなか面倒みたい

qemu での起動

あとは簡単で xv6-public のソースを MIT の github からもらってきて

make qemu

とコマンド叩くだけ

こんな感じで起動する

workspace/xv6-public - [master] ( '-') make qemu
dd if=/dev/zero of=xv6.img count=10000
10000+0 records in
10000+0 records out
5120000 bytes transferred in 0.079054 secs (64765760 bytes/sec)
dd if=bootblock of=xv6.img conv=notrunc
1+0 records in
1+0 records out
512 bytes transferred in 0.000030 secs (17043521 bytes/sec)
dd if=kernel of=xv6.img seek=1 conv=notrunc
315+1 records in
315+1 records out
161452 bytes transferred in 0.001818 secs (88810330 bytes/sec)
qemu-system-i386 -serial mon:stdio -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 -m 512
xv6...
cpu1: starting 1
cpu0: starting 0
sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58
init: starting sh
$  # <- コンソール立ち上がった

start

適当にコマンド叩く

ls コマンド

$ ls
.              1 1 512
..             1 1 512
README         2 2 2290
cat            2 3 12208
echo           2 4 11396
forktest       2 5 7204
grep           2 6 13720
init           2 7 11784
kill           2 8 11348
ln             2 9 11328
ls             2 10 13280
mkdir          2 11 11404
rm             2 12 11388
sh             2 13 21192
stressfs       2 14 11852
usertests      2 15 49048
wc             2 16 12720
zombie         2 17 11136
console        3 18 0
$

ls_in_shell

起動時に開く qemu のウィンドウから直接叩くことも可能

ls_in_qemu

参考:

2018/03/12 23:00
tags: os - qemu - xv6
This site is maintained by furuhama yusuke.
from 2018.02 -