Upload
hirotaka-kawata
View
1.299
Download
4
Embed Size (px)
DESCRIPTION
Citation preview
xv6 + mist32 + mruby@hktechno
@hktechno
● 筑波大学大学院に入院しました● 実時間組み込みアーキテクチャ研究室
○ すでに実時間も組み込みも殆どやってない○ OSSS, Softlab の影に隠れた kernelvm 系研究室○ OS, VMM, 最近 OS + NVM 周りをやっている
● Open Design Computer Project○ mist32 プロセッサ, gcc, binutils...○ http://open-arch.org/
xv6 とは
● UNIX V6 の現代版 x86 再実装○ V6 != SVR6○ MIT 製, 教育用 OS と言っている, 教科書付き
● 構造が非常にシンプル○ マルチコアも対応○ ファイルシステムもついてる○ 実機でも起動する (最近のマシンだと微妙)○ コード行数は 10,000 行ぐらい
卒業研究でやったこと
● SSDAlloc のようなもの○ SSDAlloc: SSD をうまく使って Swap より速いハイブ
リッドメモリを提供する
● SSDAlloc の仕組みを、MMU によって支援○ mist32 プロセッサに実装○ なんらかの OS が必要
xv6 の良い所
● つまらない研究ネタを簡単に実装できる○ 正直 Linux をいじるのは大変○ そこで xv6
● 他のアーキテクチャへの移植も簡単○ 研究室で、配属された直後に振られることが多い○ OS の構造や、プロセッサ仕様の把握にとても良い
実機で動かすなら
え?まさか?!
パッチ書いた
● LGDT 後の動作 (常識)○ CS のクリア
■ ljmp <selector>, 0○ DS, ES… のクリア
■ movw <selector>, %ds
● パッチ: http://pastebin.com/M8SVGSPu
xv6 を移植しよう
● ARM は研究室内ですでに実績あり● Raspberry Pi 向けもある
○ https://code.google.com/p/xv6-rpi/
● mist32 向けに移植しよう○ 未踏で作ったオリジナルプロセッサ○ http://open-arch.org/hardware/mist32
xv6 移植の前提
● MMU が必要○ ページングをがっつり使っている○ セグメントはフラットなので要らない
● ディスクは必要がない○ kernelmemfs というバイナリが吐ける○ RAM 上に fs を作るのでなくてもいける
● 実機で動かすなら...○ multiboot 対応の grub とかがあると楽 (無くても可)
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
xv6 移植 2
● スタックの構築○ exec() などで、スタックを構築してエントリポイントへ渡
す○ 引数はスタックに構築している (x86 だから)○ レジスタ渡しのプロセッサでは、trapframe をうまく使うと
良いと思う
xv6 のダメなところ
● メモリマップ○ 0x00000000 - 0x80000000: User○ 0x80000000 - 0x00000000: Kernel○ NULL Pointer を読んでも落ちない!!
● メモリ割り当て○ スタックの位置がなんか変な感じ○ デマンドページング非対応○ スワップとかあるはずがない
.text, .bss, .data...
-- INVALID PAGE --
Stack
Heap
xv6 のダメなところ
● ファイルシステム○ 最大ファイルサイズが少ない!○ (12 + (512 / 4)) * 512 = 71,680 byte○ 頑張ればもうちょっと増やせるが...○ ブロックサイズを増やすと、色々崩壊する
詳しいことは
http://open-arch.org/software/porting_xv6https://github.com/techno/xv6-mist32
移植してみたけど...
シェルしか動かない。
楽しくない。
xv6 に mruby を移植してみよう
● 用意するもの○ Newlib
■ xv6 の ulib は libc とは言わない○ xv6 の usys.S
● Newlib○ newlib/libc/sys の下辺りに xv6 を移植○ 少しいじって autoconf するだけ○ https://github.com/techno/newlib-xv6
mruby のバイナリ
● どう頑張っても 400KB ぐらいになる○ ファイルシステムの制限に引っかかる
● kernel に直接リンクしてしまおう○ ld -b binary hoge みたいな○ exec で mruby ならば、そこからコピー
デモ?
最後に
● 研究に xv6 を使うのやめよう○ 評価が大変○ 実用性皆無
● PyCon JP 2014 のスタッフやってます○ Call for Proposal を開始したのでネタ募集中○ Web 系以外大歓迎