More Related Content
Similar to xv6 + mist32 + mruby
Similar to xv6 + mist32 + mruby (20)
More from Hirotaka Kawata
More from Hirotaka Kawata (6)
xv6 + mist32 + mruby
- 3. xv6 とは
● UNIX V6 の現代版 x86 再実装
○ V6 != SVR6
○ MIT 製, 教育用 OS と言っている, 教科書付き
● 構造が非常にシンプル
○ マルチコアも対応
○ ファイルシステムもついてる
○ 実機でも起動する (最近のマシンだと微妙)
○ コード行数は 10,000 行ぐらい
- 8. パッチ書いた
● LGDT 後の動作 (常識)
○ CS のクリア
■ ljmp <selector>, 0
○ DS, ES… のクリア
■ movw <selector>, %ds
● パッチ: http://pastebin.com/M8SVGSPu
- 9. xv6 を移植しよう
● ARM は研究室内ですでに実績あり
● Raspberry Pi 向けもある
○ https://code.google.com/p/xv6-rpi/
● mist32 向けに移植しよう
○ 未踏で作ったオリジナルプロセッサ
○ http://open-arch.org/hardware/mist32
- 10. xv6 移植の前提
● MMU が必要
○ ページングをがっつり使っている
○ セグメントはフラットなので要らない
● ディスクは必要がない
○ kernelmemfs というバイナリが吐ける
○ RAM 上に fs を作るのでなくてもいける
● 実機で動かすなら...
○ multiboot 対応の grub とかがあると楽 (無くても可)
- 11. xv6 移植 1
● cpu-local? storage
○ GS のセグメントに、struct cpu, struct proc のポインタ
が格納されている
○ 何らかの手段で同じことを実現する必要がある
○ 多分高速化?
extern struct cpu *cpu asm("%gs:0"); // &cpus[cpunum()]
extern struct proc *proc asm("%gs:4"); // cpus[cpunum()].proc
- 12. xv6 移植 2
● スタックの構築
○ exec() などで、スタックを構築してエントリポイントへ渡
す
○ 引数はスタックに構築している (x86 だから)
○ レジスタ渡しのプロセッサでは、trapframe をうまく使うと
良いと思う
- 13. xv6 のダメなところ
● メモリマップ
○ 0x00000000 - 0x80000000: User
○ 0x80000000 - 0x00000000: Kernel
○ NULL Pointer を読んでも落ちない!!
● メモリ割り当て
○ スタックの位置がなんか変な感じ
○ デマンドページング非対応
○ スワップとかあるはずがない
.text, .bss, .data...
-- INVALID PAGE --
Stack
Heap
- 14. xv6 のダメなところ
● ファイルシステム
○ 最大ファイルサイズが少ない!
○ (12 + (512 / 4)) * 512 = 71,680 byte
○ 頑張ればもうちょっと増やせるが...
○ ブロックサイズを増やすと、色々崩壊する
- 17. xv6 に mruby を移植してみよう
● 用意するもの
○ Newlib
■ xv6 の ulib は libc とは言わない
○ xv6 の usys.S
● Newlib
○ newlib/libc/sys の下辺りに xv6 を移植
○ 少しいじって autoconf するだけ
○ https://github.com/techno/newlib-xv6
- 18. mruby のバイナリ
● どう頑張っても 400KB ぐらいになる
○ ファイルシステムの制限に引っかかる
● kernel に直接リンクしてしまおう
○ ld -b binary hoge みたいな
○ exec で mruby ならば、そこからコピー
- 20. 最後に
● 研究に xv6 を使うのやめよう
○ 評価が大変
○ 実用性皆無
● PyCon JP 2014 のスタッフやってます
○ Call for Proposal を開始したのでネタ募集中
○ Web 系以外大歓迎