20
xv6 + mist32 + mruby @hktechno

xv6 + mist32 + mruby

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: xv6 + mist32 + mruby

xv6 + mist32 + mruby@hktechno

Page 2: xv6 + mist32 + mruby

@hktechno

● 筑波大学大学院に入院しました● 実時間組み込みアーキテクチャ研究室

○ すでに実時間も組み込みも殆どやってない○ OSSS, Softlab の影に隠れた kernelvm 系研究室○ OS, VMM, 最近 OS + NVM 周りをやっている

● Open Design Computer Project○ mist32 プロセッサ, gcc, binutils...○ http://open-arch.org/

Page 3: xv6 + mist32 + mruby

xv6 とは

● UNIX V6 の現代版 x86 再実装○ V6 != SVR6○ MIT 製, 教育用 OS と言っている, 教科書付き

● 構造が非常にシンプル○ マルチコアも対応○ ファイルシステムもついてる○ 実機でも起動する (最近のマシンだと微妙)○ コード行数は 10,000 行ぐらい

Page 4: xv6 + mist32 + mruby

卒業研究でやったこと

● SSDAlloc のようなもの○ SSDAlloc: SSD をうまく使って Swap より速いハイブ

リッドメモリを提供する

● SSDAlloc の仕組みを、MMU によって支援○ mist32 プロセッサに実装○ なんらかの OS が必要

Page 5: xv6 + mist32 + mruby

xv6 の良い所

● つまらない研究ネタを簡単に実装できる○ 正直 Linux をいじるのは大変○ そこで xv6

● 他のアーキテクチャへの移植も簡単○ 研究室で、配属された直後に振られることが多い○ OS の構造や、プロセッサ仕様の把握にとても良い

Page 6: xv6 + mist32 + mruby

実機で動かすなら

Page 7: xv6 + mist32 + mruby

え?まさか?!

Page 8: xv6 + mist32 + mruby

パッチ書いた

● LGDT 後の動作 (常識)○ CS のクリア

■ ljmp <selector>, 0○ DS, ES… のクリア

■ movw <selector>, %ds

● パッチ: http://pastebin.com/M8SVGSPu

Page 9: xv6 + mist32 + mruby

xv6 を移植しよう

● ARM は研究室内ですでに実績あり● Raspberry Pi 向けもある

○ https://code.google.com/p/xv6-rpi/

● mist32 向けに移植しよう○ 未踏で作ったオリジナルプロセッサ○ http://open-arch.org/hardware/mist32

Page 10: xv6 + mist32 + mruby

xv6 移植の前提

● MMU が必要○ ページングをがっつり使っている○ セグメントはフラットなので要らない

● ディスクは必要がない○ kernelmemfs というバイナリが吐ける○ RAM 上に fs を作るのでなくてもいける

● 実機で動かすなら...○ multiboot 対応の grub とかがあると楽 (無くても可)

Page 11: xv6 + mist32 + mruby

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

Page 12: xv6 + mist32 + mruby

xv6 移植 2

● スタックの構築○ exec() などで、スタックを構築してエントリポイントへ渡

す○ 引数はスタックに構築している (x86 だから)○ レジスタ渡しのプロセッサでは、trapframe をうまく使うと

良いと思う

Page 13: xv6 + mist32 + mruby

xv6 のダメなところ

● メモリマップ○ 0x00000000 - 0x80000000: User○ 0x80000000 - 0x00000000: Kernel○ NULL Pointer を読んでも落ちない!!

● メモリ割り当て○ スタックの位置がなんか変な感じ○ デマンドページング非対応○ スワップとかあるはずがない

.text, .bss, .data...

-- INVALID PAGE --

Stack

Heap

Page 14: xv6 + mist32 + mruby

xv6 のダメなところ

● ファイルシステム○ 最大ファイルサイズが少ない!○ (12 + (512 / 4)) * 512 = 71,680 byte○ 頑張ればもうちょっと増やせるが...○ ブロックサイズを増やすと、色々崩壊する

Page 15: xv6 + mist32 + mruby

詳しいことは

http://open-arch.org/software/porting_xv6https://github.com/techno/xv6-mist32

Page 16: xv6 + mist32 + mruby

移植してみたけど...

シェルしか動かない。

楽しくない。

Page 17: xv6 + mist32 + mruby

xv6 に mruby を移植してみよう

● 用意するもの○ Newlib

■ xv6 の ulib は libc とは言わない○ xv6 の usys.S

● Newlib○ newlib/libc/sys の下辺りに xv6 を移植○ 少しいじって autoconf するだけ○ https://github.com/techno/newlib-xv6

Page 18: xv6 + mist32 + mruby

mruby のバイナリ

● どう頑張っても 400KB ぐらいになる○ ファイルシステムの制限に引っかかる

● kernel に直接リンクしてしまおう○ ld -b binary hoge みたいな○ exec で mruby ならば、そこからコピー

Page 19: xv6 + mist32 + mruby

デモ?

Page 20: xv6 + mist32 + mruby

最後に

● 研究に xv6 を使うのやめよう○ 評価が大変○ 実用性皆無

● PyCon JP 2014 のスタッフやってます○ Call for Proposal を開始したのでネタ募集中○ Web 系以外大歓迎