HTML5とC++で、それぞれUNIX v6のファイルシステムハック始めました
はじめに
UNIX v6 code readingもファイルシステムに突入しました。
コード読み解いてるだけじゃ物足りないなー。
そうだ、UNIX v6 ファイルシステムをハックしてしまおう!
と思ったのが今回の始まりです。
その前に
UNIX v6ファイルシステム読み込みに関しては偉大なる先駆者がいます。
さて、じゃあ自分はどうオリジナリティを出すか。
んー、HTML5+javascriptで実装してみるか。
というわけでHTML5+javascriptでハックツールを作ることにしました。
(そうすると、今度はPDP11&UNIX v6エミュレータ on javascriptが競合になってくるような気がしないでもない)
今回作ったもの
とりあえずは超簡単なことから始めてみました。ローカルファイルの処理&HTML5+javascriptでのバイナリ処理です。
このURLにアクセスして(chrome+Windowsでのみ動作確認済)
http://gachapin.jp/html5/v6/file.html
お持ちのv6rootファイル(後述)をブラウザにドラッグ&ドロップすると
こんな感じにsuperblock情報が表示されます。
Webにファイルをアップロードしているわけではありません。ローカルで全て処理しています。
C++ではこんなコードを書いて、superblockの情報を表示させてみました。
// v6.h #include <stdint.h> typedef struct filsys { int16_t s_isize ; int16_t s_fsize ; int16_t s_nfree ; int16_t s_free[100] ; int16_t s_ninode ; int16_t s_inode[100] ; uint8_t s_flock ; uint8_t s_ilock ; uint8_t s_fmod ; uint8_t s_ronly ; int16_t s_time[2] ; int16_t s_pad[48] ; } filsys ;
// main.cpp #include <stdio.h> #include "v6.h" int main( int argc, char **argv ) { FILE *fp ; int c ; unsigned int i ; filsys superblock ; fp = fopen( "v6root", "rb" ) ; fseek( fp, 0x200, SEEK_SET ) ; fread( &superblock, sizeof( superblock ), 1, fp ) ; printf( "s_isize %X\n", superblock.s_isize ) ; printf( "s_fsize %X\n", superblock.s_fsize ) ; printf( "s_nfree %X\n", superblock.s_nfree ) ; for( i = 0; i < 100; i++ ) printf( "s_free[%d] %X\n", i, superblock.s_free[i] ) ; printf( "s_ninode %X\n", superblock.s_ninode ) ; for( i = 0; i < 100; i++ ) printf( "s_inode[%d] %X\n", i, superblock.s_inode[i] ) ; printf( "s_flock %X\n", superblock.s_flock ) ; printf( "s_ilock %X\n", superblock.s_ilock ) ; printf( "s_fmod %X\n", superblock.s_fmod ) ; printf( "s_ronly %X\n", superblock.s_ronly ) ; for( i = 0; i < 2; i++ ) printf( "s_time[%d] %X\n", i, superblock.s_time[i] ) ; fclose( fp ) ; return 0 ; }
% g++ -o main main.cp % ./main s_isize 55 s_fsize FA0 s_nfree 55 s_free[0] BE5 s_free[1] BE2 ... snip ... s_inode[98] 177 s_inode[99] 177 s_flock 0 s_ilock 0 s_fmod 0 s_ronly 0 s_time[0] ADC s_time[1] 522
HTML5+javascriptのものと結果が同じであることを確認しました。
HTML5+javascriptのソースがその場しのぎすぎますが、これから改善していきます。今回は「とりあえず」です。
simh+UNIX v6環境構築について(v6rootについて)
上記アプリを使うには、事前にローカルでsimh+UNIX v6環境を作っておくといいです。
このサイトが詳しいです。
環境を作るとv6rootというファイルが出来ているはずなので、それを上記アプリに喰わせてください。
simhで色々遊んだ後に、再度喰わせると変化が見えて楽しいと思います。
終わりに
タイトルからもっとすごいものを想像していた方。すみません。まだ「始めました」な状態です。
細々と作っていく予定なので気長にお待ちください。
とりあえずはjavascriptでのバイナリ処理のオーソドックスな書き方を調べるところからかな〜。