2023年6月29日木曜日

UNIX V7のブート 2

inodeブロックを見ていきます。inodeブロックは、ディスクイメージでは0x0400から始まっています。
inodeの構造は、/usr/sys/h/ino.h の dinode構造体で定義されています。この構造体のサイズは64バイトです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct dinode
{
    unsigned short  di_mode;/* mode and type of file */
    short   di_nlink;       /* number of links to file */
    short   di_uid;         /* owner's user id */
    short   di_gid;         /* owner's group id */
    off_t   di_size;        /* number of bytes in file */
    char    di_addr[40];    /* disk block addresses */
    time_t  di_atime;       /* time last accessed */
    time_t  di_mtime;       /* time last modified */
    time_t  di_ctime;       /* time created */
};
#define INOPB   8   /* 8 inodes per block */
/*
 * the 40 address bytes:
 *  39 used; 13 addresses
 *  of 3 bytes each.
 */
};
inode番号0は未使用で、ルートディレクトリのinode番号は2なので、ルートのinodeの位置は、ディスクイメージでは0x0440からです。


ルートディレクトリのファイルの位置は、0x044cからのdi_addr[]にブロック番号がリストされています。このアドレスは、下のコメントのように3バイトで表され、上位1バイト+下位2バイトで記録されています。最初の3バイトは0x0002d4で1ブロック512バイトなので、0x5a800からファイルのデータが保存されています。
アスキーダンプにunixの文字列が見られます。SIMHでルートを ls してみた結果が下で、対応していることがわかります。

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 に定義されてます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*
 * 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ブロック続きます。

2023年6月24日土曜日

UNIX V7の移植に挑む

PCCをZ8000に対応できそうな目処がたってきたので、UNIXの移植に手をつけていきます。何年越しのプロジェクトやねん、って感じですが、PCCの作業にすこし飽きてきたのと、実際のコードをコンパイルしながらデバッグしていった方が現実的な気がしてきたきたからです。途中で挫折しそうな気がしますが、気長にやっていきます。なにせ趣味(暇つぶし)ですから。

まず第一歩として、githubの unix-history-repo からV7のソースコードをクローンしました。

1
$ git clone git@github.com:dspinellis/unix-history-repo.git -b Research-V7-Snapshot-Development --depth 1
ざっと眺めてみて正直どこから手を付ければ良いのか、ちょっと悩みます。少しでも成果が見えて、進んでいる実感がないと継続は難しいですからね。やはり、ブートローダあたりからかなあ。