筑波大 Softlab Hackathlonに参加してきました

8/17〜8/19に富士Calmで開催された@oza_x86さん(id:big-eyed-hamster)主催の筑波大 Softlab Hackathlonに飛び入り参加して来ました。

参加者:
@oza_x86id:big-eyed-hamster
@n_kane(id:kayn_koen
@go_vm
@d_kami(id:d-kami
@syuu1228(id:syuu1228
他1名

8/16 出発前夜

セプキャン帰りの@daiki41ti君に羽田空港で会おうと約束してたので羽田で待つも延々と来ないので研究で作ってるネットワークシミュレータの実装をMacbook開いてやってて、その模様をTwitterで呟いたら@oza_x86氏に「羽田ハッカソン!」と突っ込まれる。


それに対して「そういえばハッカソンいったことないな、行ってみたい。でもどこに行けば良いんだろ?」ってつぶやいたら、「研究室の仲間と明日からはっかそんやってきます!」との事だったので「殴り込みに行きます」、と返す。
が、上司に許可を取ろうにもプライベートな連絡先はTwitterしか知らない罠。
DM送ってみるけど返事帰って来ず。この時点では参加を断念する。

8/17 出発当日

朝5時、何故かTwitter経由で上司許可が降りる。
朝7時、起床してTwitterを見て速攻@oza_x86氏に電話しようとする。が、またもや連絡先をTwitterしか知らない罠。 仕方ないから「許可降りたんだけど無理だよね〜」ってDMを送る。
朝9時、電車で24みながら通勤している間に@oza_x86氏から大丈夫かもしれないので宿泊施設に連絡とってみます!とのDMが。
朝10時、会社に着いてMac起動しTweetieを開いてDMに気付き慌てて電話(DMで初めて連絡先を教えてもらう。Twitter最高)。 部屋が取れたとの事。 速攻会社を出て駅へ向かう。途中、二泊三日分の着替えや洗顔フォームなど一式を購入。
午後12時半、分倍河原にて@oza_x86氏ご一行様と落ち合って車に乗せてもらう。ご飯を食べて一路富士吉田へ。


おやつの時間ごろに到着。

建物は結構立派。


目の前に富士山が見える!
少し標高があるのかそういう気候なのか、やたらめったら涼しい。虫も少ない。


取りあえず皆で集まり、この3日間で何を作るのか宣言を行う。
私は本当に飛び入りで参加したので全く何のアイディアも無く、車の中で色々雑談していた時に適当に話していた「VM作ってみるとか」を宣言してしまう。
いやいや、2泊3日じゃ無理でしょww と言われる。俺もそうだと思う。


早速、皆で各々の作業を開始。
特にチームで取り組む人は居なくて、皆バラバラの事をやってるみたい。
ハッカソンって皆で一つの事をやらなくてもいいのかー(※まずそこから分かってない


ばたばたしていた事もあり、割とすぐに夕食の時間に。


量は多い。味は普通。見た目はホテルの夕食。値段もホテルの夕食。高くね?という意見が続出。
翌日の夕食はキャンセルと相成った。


夕食後も各自の部屋で静かにハック。


私の場合、この日はまず何をやるかという所から考え始め、qemuのsystem-x86_64にAMD-V(SVM)のエミュレーション機能がある事が分かったのでFreeBSDカーネル上でSVMを弄ってゲストOSモードで数命令のコードを動かしてみよう、という目標を立ててみた。
しかし持っていたのは特に何も入ってないMacBookなので、まずqemuをインストール、その上にFreeBSDをインストールしてカーネルソースコードからビルド、とか環境整備にやたらと手間をかけてしまった。
まずFreeBSDqemuにインストールする所から色々とトラブる。結局七転八倒してpreinstalledイメージを探し出し、これを使う方向へ転換。
Macで動くqemuはフルエミュレーションな為、ものっすごい遅くて一向にカーネルビルドが終わらない。
時間との戦いな中で無駄に初日を浪費してしまった。


SVMのサンプルコードと言ったら当然KVMXenだろうな、と思って色々ダウンロードして読んでみる。
しかしまず仕様が分からなきゃ話にならない。AMD SVMの資料って一体どこ?という所でまたまたハマる。
AMDのVirtualizationのページには仕様書は置いてないのよね。かといって資料のページにはVirtualizationとかSVMとかいう言葉の資料も見当たらず。
結局「AMD64 Technology AMD64 Architecture Programmer’s Manual Volume 2: System Programming」という資料の中に書いてある事に気づくまで1日近くを要した。


お風呂は皆で大浴場に。
風呂場にあった体重計に乗ったら数ヶ月前に測った時の体重+5kgな数字が出て衝撃を受ける。
ほら、ジーンズが重いんだよね?そうそう。服着てるから正確に測れないよ。


風呂上がりは速攻ビール。普段家でそういう事はしないが、こういう所にくると飲みたくなるよな〜。


この日は最近の健康的な生活習慣のせいで12時過ぎに眠くなってしまい、普通に寝てしまった。
どうも@oza_x86氏はその後もハックしていた気がするがぐっすり寝てたので記憶に無い。

8/18 本気で頑張る日

いつもの習慣で午前7時に目を覚まし、速攻ハックに戻る。
窓を開けると清々しい風。というか、少々寝冷えして昼までずっと鼻水たらしてた。
@oza_x86氏が起きない。
もぞもぞもぞもぞしてるけど寝てる。
結局朝飯だよ〜って他の部屋の人が起こしにくるまで寝てた。



朝食は和風。納豆おいしいです。が、また値段に対する文句が噴出。まぁ確かにオトク感は無いけどね。
味は普通、量は多いがおかずは割としょぼい。


歯を磨いて速攻ハック。
が、@oza_x86君は速攻ベッドへ横たわり、マジ寝。この子何時までやってたんだろう…?
空気を通して伝わってくる強烈な眠気に襲われ、私も寝落ちしかける。
AMDの資料を読み込む。Guestモードでもリアルモードがハード処理出来るらしい。Intel VTでは出来ないんだって。



会議室(有料)とか借りなくても普通に休憩スペースで良いよねって話になる。
が、電源が足りません。同じ型のMacBookが3人も居て、皆同じ頃に電池がヤバくなって自室へ戻る。


この時までに調べた事をはてダにまとめる。
AMD-V(SVM)についてちょっと勉強してみた まとめ - かーねる・う゛いえむにっき


お昼ご飯はたらこスパ。 え、これ朝飯じゃね?って文句が出る。 3日間を通して飯の文句は出続ける。


お昼食べて速攻ハックに戻る皆々。 流石、筑波大の学生さんたちはすげー真面目です。



予約時間をたっぷり1時間も過ぎた頃に会議室へ向かう。
…あれ? 来ない人がいるぞ?ハックに没頭するあまり会議室に来るの忘れちゃったんだね、きっと♪
皆エラいなぁ。


@oza_x86氏にAMD SVMを使うコードを読むなら何読んだらいい?と聞いたら古いKVM読むのが良いんじゃない?と言われる。
KVM-1をダウンロードして読み始めるが、これ、Intel VT専用ですね。
結局32bitでAMD SVMが動くようになるのはKVM-6かららしいのでこのコードを読み始める。
この辺りで読みながら真剣に自力実装する事をあきらめ始める。時間的に無理だ。


方向転換してKVMのコードから必要最低限な所を抜き出しコピペして動作させる事にした。
何が必要最低限なのか?という所を攻めてみる。
夕方までにコピペしたコードで初期化→実行の流れを作り、コンパイルを通す所までは行けた。


なんか別室でSI2009という団体が素粒子宇宙論という意味フな難しそうな事をやってる団体が。
雑談も宇宙語だった。注目すべきはMac率の高さ。8割近いように見えた。
SI2009 (phenomenology)


夕食はキャンセルしちゃったので自己調達に。
食べログで調べるとうどん屋ばかり出てくる。
じゃ、うどんでも食うかと思ったが、全部昼過ぎに閉まってやがる。
ようやく一軒近場に見つけたので行ってみた。


こうちゃん食堂


冷やしカツ丼定食(!!)


肉うどん(何故か鳥肉)


唐揚げ


もつ

速い。安い。マズい。
が、冷やしカツ丼定食のみ一向に出て来ない。
やっと出て来たら。カツ丼に氷が乗っててとろろがかかってる。斬新すぐる。
食べた本人に聞いてみたら、「これは温かくてもいいんじゃないかなぁ?」と笑顔だった。心が広いなぁ。


食後はコンビニに行って色々買い込む。
デザートとか飲み物とか。


何故か宿泊施設へ戻って夜中の8時だというのにキャッチボールをする事に。
玉が見えね〜!!しかし皆でたっぷり30分くらいやってしまうのであった。


そんなこんなでお風呂入る。アイスの会に誘われたので風呂上がりアイス。
なんかそんな事してるともうコード書く気しませんけど、明日の9時には発表なんすよね。
徹夜ですか、ほんとうにありがとうございました。


風呂上がりにはビールだろ、とアイスのみならずビールまでも。

ビール&ハック。


腰を落ち着けて頑張るか〜、と思ってたのに、しばらくしたら@oza_x86君が夜食欲しいなぁとTwitterでつぶやくので、じゃあ買いに行きましょうと返す。いくいく〜と返事が返ってくる。ここまで無言(隣に座っているにも関わらず)。僕らの素晴らしいコミュニケーション能力。



夜食と言ったらカップ麺。麺力で夜通し頑張る。


この頃になってようやくVM実行時のインターセプトがどのように行われるかについて理解しだす(遅い)。
ついでにCPL, CR0, CR3などの各レジスタの意味も調べだしてみたり(むしろ知らないでVMとか言ってるのが絶望的)。

8/19 最終日

VMCBを用意してVMRUN命令を実行するコードは書けたんだけど、VMの仮想的なメモリ領域がどのように定義されているのかが良く分からず。
さんざん調べまくって、結局シャドーページングかネステッドページングを使ってるだけだという結論に至る。
じゃ、起動した瞬間のリアルモードでの物理メモリアドレスはどこを指しているのか?という疑問が残る。
当然実際に指すべきアドレスのオフセットをどこかで指定出来るようになってるに違いないと思いVMCBを調べるがどこをどう読んでもそんな事書いていない。
が、さらによくよく読んでみると「15.18 Paged Real Mode」とか聞き捨てならない項目が。
ゲストでのリアルモードはページング出来るそうで、これを使ってオフセットを実現しろと書いてある。うひょ〜。
実際にKVMのコードではCR0へページングのビットが立ってた。
ここに気づいたのが2:30くらい。
今からページテーブルの初期化コード実装するの?無理じゃね?


資料調査にばかり時間を食ってしまってここまで一度も作ったコードを実行してないので、まずはめちゃくちゃなメモリ領域で実行されるんでも良いから走らせてみようと思い立つ。
実際に走らせてみるとVMCBの為のメモリアロケートのコードが間違ってて途中で落ちる罠。
他にも色々手直し必要だったりして、うとうとしながらコード直してるだけで7時になってしまった。


@oza_x86君は起きたり寝落ちしたり、良く分からない作業法を採用しているらしい。


何人かにいやそれは無いだろと否定されたような気がするが、僕はAMD SVMではネステッドページングのみを使ってメモリ空間を仮想化しているならばページングを切ればホスト空間の物理メモリがそのまま見えるに違いないという仮説を立て、ページングには一切触れないという一か八かの賭けに出る事にした。

ここで朝飯。徹夜明けの暴飲暴食後(夜食:ビール&カップ麺&コーヒー2缶&おかし)で胃が辛い(;_;)/ 思わず残さず食べちゃった。

Guestのripは0x0から始まっている。
qemuのモニタやトレースログでGuestへ入った瞬間0x0の辺りでどんな命令が実行されるか/どんな値がメモリに入っているか調べ、その上でホストモードでも0x0から数バイトどんな値が入っているかprintfしてみた。
そうしたら、やはり同じ値が見えている。これは、普通にGuestからHostのメモリが読めているという事に違いない。
では、Hostで0x0から何バイトか書き換えてVMRUNしたらGuestで実行される命令は変わるか?
という実験をやってみた所、想像した通り実行される命令が変わった。
という事は、とてもとても行儀が悪いが、Guestで実行したいプログラムを0x0を先頭に書き込んであげれば良い訳だ。
ってな感じで僕は何とかFreeBSDカーネルを乗っ取りGuestモードで小さな小さなプログラムを走らせる行為に成功した。
成功したが、VMEXITした瞬間にqemuがtriple faultして死ぬ現象が結局解決出来なかった。

昨日の会議室が予約してあったので、皆で時間ギリギリまでハックを頑張る。
隣のSI2009から素粒子論の講義がインドなまりの英語で聞こえてくる。
全く聞き取れないが、何となく頭が良くなったような気がしてくる。

ここで既に11時。発表の時間なり。




最初の発表は、Erlangで実装されたdistributedなBrainfuck
とてもとても変態的で素晴らしい。


お次はなんと、自作OSにシステムコールを実装してみた話/GWTで研究室のwebサイトを作ってみた話/SmallLetter JというJVMで動く変態言語を実装してみた話の三本立て。いつそんな時間があった。


GWTのWebページ。ぐりぐり動く。かわいい。


この符号化されているような文字列を実行すると、、、、


なんとGoogleへHTTP接続してWebページの最初の一行を画面に表示出来ちゃう!(んなアホな、、、


この言語、0を変数へ代入/aを変数に代入/++,--/Javaオブジェクトの各種操作(メソッド呼び出しなど)くらいしか出来ない。
文字列を直接打てないので、System.out.println()を呼び出すにはまずaを代入し、Sまで++してスタックに積んで、またaを代入して++して、、、、、、となる。
これもBrainfuck的な言語だが、JVMで動いててJava APIが全て呼び出し可能だから上述のようにGoogleへHTTPリクエスト送るとかで期てしまうって所が凄い。
しかしプログラムの肥大化の度合いはJavaの比ではない。


わずか二人発表した所で会議室がタイムアウト
休憩スペースへ移って発表を続行。


ファイルにタグ付けをしてFUSE を用いてファイルシステムとして見せるというシステムの話。
フォルダがタグになり、フォルダへのファイル書き込みがタギングになるという構想。
WindowsDokanを使いC#で書いているそうな。
これはこれで面白い。



アンドロイドの電話帳を拡張してSIPアドレスを入れられるようにするという話。
ちょっと他の人より実用寄り。実際にアプリとしてリリースするつもりかな?



iPhone/iPodTouchを情報ハブのように使うための仕組みを作っている途中だよ、という話。
iPhoneアプリを立ち上げるとコンピュータのリストがグラフィカルに現れ、これをタップするとリモートデスクトップみたいに画面が操作出来、そこからファイルをドラッグして持ってくるとiPhone内のローカルストレージにコピーされる。
コピーされたファイルをアプリ内で別のコンピュータへドラッグするとこんどはそのコンピュータへコピーされる。
この仕組みの通信インタフェースとしてRPCから書き始めており、今回はモックレベルのGUIを書いたそうな。
XCodeのInterface Builderが気に食わないから全部手で書いたとか(!)


最後、私の発表は今まで書いてきた通りFreeBSD上でAMD SVMを動かしてみたよって話。
何となく概要を説明し、実際にqemuを走らせトレースログを見せ、ホラね、VMRUN/VMEXITが出てるでしょ?と言って終わり。
もちろん予定通りqemuはtriple fault。


発表が終わり、皆で撤退。



途中、談合坂SAで佐世保バーガーを食べる。でかい。900kcalもある。


行きと同様、分倍河原まで送り届けてもらい、そこから電車で帰った。


参加者の皆様、お疲れ様でした!!