2023年6月25日日曜日

UNIX V7のブート 1


ブートローダの移植から始めようとしているわけですが、ディスクドライブからカーネルを読み込まないといけないので、まずはファイルシステムを理解する必要があります。この辺りは参考になりそうな書籍やネット上の情報があるので助かります。

技術評論社から出ている「はじめてのOSコードリーディング」は、UNIX V6の説明ですが、基本はV7とほぼ同じなので参考になります。

コードだけを読んで理解するのは難しいので、ディスクイメージと照らし合わせながら理解していきます。SIMHのサイトからUNIX V7のSoftware Kitesをダウンロードし、ZIPファイルに含まれているunix_v7_rl.dskを使います。

http://simh.trailing-edge.com/kits/uv7swre.zip 

このディスクイメージのブロックサイズは512バイトです。

先頭のブロックはブートブロックで、システム起動時に最初に読み込まれるブートプログラムが格納されています。ディスクからカーネルを読み出すコードですが、とりあえずは手をつけずに置いておきます。

ブートブロックに続く1ブロック、ディスクイメージのダンプリストで0x0200から0x03FFまでがスーパーブロックになります。



スーパーブロックの構造の定義は、/usr/sys/h/filsys.h にある filsys 構造体です。NICFREEなどの定数は param.h に定義されてます。

 /*
 * Structure of the super-block
 */
struct	filsys {
	unsigned short s_isize;	/* size in blocks of i-list */
	daddr_t	s_fsize;   	/* size in blocks of entire volume */
	short  	s_nfree;   	/* number of addresses in s_free */
	daddr_t	s_free[NICFREE];/* free block list */
	short  	s_ninode;  	/* number of i-nodes in s_inode */
	ino_t  	s_inode[NICINOD];/* free i-node list */
	char   	s_flock;   	/* lock during free list manipulation */
	char   	s_ilock;   	/* lock during i-list manipulation */
	char   	s_fmod;    	/* super block modified flag */
	char   	s_ronly;   	/* mounted read-only flag */
	time_t 	s_time;    	/* last super block update */
	/* remainder not maintained by this version of the system */
	daddr_t	s_tfree;   	/* total free blocks*/
	ino_t  	s_tinode;  	/* total free inodes */
	short  	s_m;       	/* interleave factor */
	short  	s_n;       	/* " " */
	char   	s_fname[6];	/* file system name */
	char   	s_fpack[6];	/* file system pack name */
};
これらデータは、ブートには直接関係ないのですが、ファイルシステムの構造が含まれています。
0x0200 : s_isize(2バイト)は、inodeブロックのブロック数です。PDP-11はリトル(ミドル)エンディアンなので、0x02D2で722ブロックになります。

0x0202: s_fsize(4バイト)は、ディスクドライブのブロック数です。上位の2バイト、下位の2バイトの順に並んでいます。0x00004650なので18000ブロックです。

スーパーブロックの次のブロックは、inodeブロックでinodeのリストです。このディスクイメージでは、722ブロック続きます。

0 件のコメント:

コメントを投稿