トップ «前の日記(2003年03月09日) 最新 次の日記(2003年03月14日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2003年03月10日

CAT709

一昨日くらいの日記に書いた ext2fs から直接zImageファイルを読むプログラムが出来上がった。2日で完成した。最初はきれいに汎用的に書こうと思っていたがだんだん志が下がってきて、「/zImageを読む専用プログラムでいいやぁ」になってしまった。結果Cソースで261行でかけた。objファイルで約19kbyte。なんだこのくらいでかけるなら、PCもliloなんて使わずにext2から直接ブートしてくれてもよさそうなものなのに。ちなみに制限事項は
・/zImageであること(サブディレクトリに未対応)
・symlinkも対応していない
・ファイルサイズは63.55Mバイトまで(3重間接ブロックに対応してないから。苦笑)
まぁ必要最低限といったところでしょうか。

inode->i_blocks[12]、[13]、[14]の多重間接ブロックの部分、もうちっと上手く書けると思うんだけど、組み込みのしかもipl部分で再帰を使うとスタックが足りなくなりそうなので力ワザになってしまった。再帰でかければコードはもっと美しくなりそう。

さっそく ipl+g に組み込んでみたけども一発では上手く動かなかった。理由は自明で、ipl+gはスタックが 1536バイトしかないが とりあえず作ったプログラムはかなりのローカルバッファを使う。こんなかんじで↓ここでSECTOR_SIZEは512バイトだ。当然スタックオーバーフローするだろうな。やれやれ。明日リンカースクリプトを再調査する。もう眠いし。もうすぐ5時だし。(>_<)

//  filename で検索して inode番号を返す
//  [入力] inode ...    ディレクトリのinode番号
//         filename ... ファイル名
//  [出力] 検索した結果のinode番号
//         見つからなかったら0を返す
int ipl_ext2_serch_dir(struct ext2_inode *inode, const char *filename){
  int i;
  int block;
  unsigned char buf[SECTOR_SIZE*2*12];
  struct ext2_dir_entry_2 dirent;
  unsigned char *p;
  // ディレクトリを読む
  for(i=0; i<12; i++){
    block=inode->i_block[i];
    if(block==0)
      break;
    ipl_read_block(block, buf + i*EXT2_BLOCK_SIZE);
  }
  p=buf;
  while(p < buf + EXT2_BLOCK_SIZE*12){
    memcpy(&dirent,p,sizeof(struct ext2_dir_entry_2));
    if(dirent.inode==0)
      return 0;
    dirent.name[dirent.name_len]=0; // nullターミネート
    printf("inode %d:%s\n",dirent.inode, dirent.name);
    if(strcmp(dirent.name,filename)==0){
      return dirent.inode;
    }
    p += dirent.rec_len;
  }
  return 0;
}