HTML5とC++で、それぞれUNIX v6のファイルシステムハック始めました

はじめに

UNIX v6 code readingもファイルシステムに突入しました。

コード読み解いてるだけじゃ物足りないなー。

そうだ、UNIX v6 ファイルシステムをハックしてしまおう!

と思ったのが今回の始まりです。

その前に

UNIX v6ファイルシステム読み込みに関しては偉大なる先駆者がいます。


さて、じゃあ自分はどうオリジナリティを出すか。

んー、HTML5+javascriptで実装してみるか。

というわけでHTML5+javascriptでハックツールを作ることにしました。

(そうすると、今度はPDP11&UNIX v6エミュレータ on javascriptが競合になってくるような気がしないでもない)

それと平行してC++でも作っていこうと思います。コマンドラインで使えると何かと便利だと思うので。

今回作ったもの

とりあえずは超簡単なことから始めてみました。ローカルファイルの処理&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のものと結果が同じであることを確認しました。

ソースコードgoogle codeで取得できます。


HTML5+javascriptのソースがその場しのぎすぎますが、これから改善していきます。今回は「とりあえず」です。

simh+UNIX v6環境構築について(v6rootについて)

上記アプリを使うには、事前にローカルでsimh+UNIX v6環境を作っておくといいです。

このサイトが詳しいです。


環境を作るとv6rootというファイルが出来ているはずなので、それを上記アプリに喰わせてください。

simhで色々遊んだ後に、再度喰わせると変化が見えて楽しいと思います。

終わりに

タイトルからもっとすごいものを想像していた方。すみません。まだ「始めました」な状態です。

細々と作っていく予定なので気長にお待ちください。

とりあえずはjavascriptでのバイナリ処理のオーソドックスな書き方を調べるところからかな〜。