UNIX 6th code reading - mount
はじめに
前回「ブロックデバイスからコアメモリへのinode割り当てを解説する」と言ったのですが、その前にマウントについてまとめます。
マウントとは?
マウントとはデバイスをOSに認識させ、OSから使えるようにする仕組みです。
mount構造体
mount構造体は272行で宣言され、NMOUT個の要素を持つmount[]配列として定義されています。
struct mount { int m_dev ; // デバイス種を示す int *m_bufp ; // superblockを保持するblock bufferへのポインタ int *m_inodp ; // mountされたinodeを指すポインタ }
mount[ ]の各要素は、各デバイスに割り当てられます。
root deviceのマウント
root deviceのマウントはiinit( )(6922行目)で行われます。mount[0]がroot device用に割り当てられます。
他のデバイスは/etc/mountを叩き、mountシステムコールを使ってマウントを行います。
マウントを解除するときはumountシステムコールを使います。
マウントされたデバイスの扱い
マウントされたデバイスには、root deviceと同じように/から始まる絶対パス、もしくはカレントディレクトリから始める相対パスでアクセスできます。
OS内部では以下のようになっています。
先日のエントリで説明したように、各ファイル(含むディレクトリ)はツリー構造で管理されています。
デバイスがマウントされるとIMOUNT flagの立ったinodeが生成されます。
デバイス種とi_numberからinode構造体(のポインタ)を取得するiget( )では、該当のinodeのIMOUNT flagが立っていた場合、mount[ ]から該当のinodeとm_inodepが一致するmountエントリを探し出します。見つかったらそのmountエントリから、マウントされたデバイスの種類を取得し、root inodeを探しに行きます。
パスの先頭から1要素ずつ取り出し、ディレクトリが持つinodeエントリと比較し、一致したinodeを辿り……という処理を繰り返すことでroot deviceにもその他のマウントされたデバイスにも同じようにアクセスすることができます。
「物理的に別のデバイスを論理的に同じ空間にいるものとして見ることができる」とも言えると思います。
後に扱う予定のnamei( ), iget( ), mountシステムコール, umountシステムコールで、上記の処理を詳細に追っていきます。