前回まででfork()をざっと見ましたので、新しく作ったプロセスを別プロセスに化けさせるexec()です。
ソースコードはこちら
http://www.tamacom.com/tour/kernel/unix/S/98.html#L22
Wikiによれば
http://ja.wikipedia.org/wiki/Fork#Fork-Exec
fork()によって子プロセスが親プロセスのコピーとして生成され、exec()システムコールを呼び出すことで(子プロセス)自身の内容を置き換える。
子プロセスがexec()を呼び出すと、そのアドレス空間の内容は全て失われ、指定されたプログラムを実行するためのアドレス空間のマッピングが設定される。これをオーバーレイと呼ぶ。
とあります。
→なのでexec()するとfork()した時にコピーした(環境変数:スタック?)が消えてしまうので、とっといて積み直す。
exec()をまたがって保持するようにしている。
ソースのどこだったか、ちょっと不明です。
ではソースコードを見ていきますと
22 exec()
23 {
24 ((struct execa *)u.u_ap)->envp = NULL;
25 exece();
26 }
実体はexece()ですがパラメータがない?
放送では、filename, agrc, argp, envを渡すと言われたような?
37 if ((ip = namei(uchar, 0)) == NULL)
namei関数でOSのファイルをサーチする機能をコールします。
ファイル名からinodeを読み込んで、それのメモリ上のポインタを返します。inodeについては後述。
●inodeに関して
UNIXではファイル名はファイルの実体を示していない。
PATHもファイル名の拡張でしかない。
例えばハードリンクを使えば同じ実体に複数のファイル名を付与することが可能になる。
そのため、ファイル名では実体を特定できない。
ファイルの実体はinode(iはindexのi)で管理している。
inodeについては、inode.hを参照
http://www.tamacom.com/tour/kernel/unix/S/61.html
構造体inodeにファイルを管理するための情報(userid,groupid,inode)などを保持しています。
13個(NADDR)分のエントリ?を確保しているとのことでしたが、ちょっと理解が追いついてないです。
lsの-iオプションでinode番号が見られる。
inodeの個数はファイルシステムを作るとき(mkfs)に決まる。
→以前inodeの数が上限に達してDISK容量が余っていたにも関わらずファイルが作れなくなったことがあります。
DISKはあっても管理情報がいっぱいになるとファイルが作れなくなります。
v7の時にはファイルシステムは一種類しかなかった。
当時の他のOSではファイルを作る時にファイル名の他にあらかじめサイズを決めるとか色々制約があった。Unixではサイズを自動的に拡張できるので画期的だった。
現在のUnixのファイルシステムは全てv7の頃のものの派生。
→そのためまずV7でファイルシステムを勉強してから他のファイルシステム(LongFileName,NFS)の理解も早くなる。
Ext2,3はBSDの拡張のひとつ。
カーネルの中でのファイルの読み込み:User構造体に情報をセットしてreadi を呼ぶ。
readi
http://www.tamacom.com/tour/kernel/unix/S/94.html#L19
inodeについてはWiki参照
http://ja.wikipedia.org/wiki/Inode
41 if(access(ip, IEXEC))
access関数で実行権限をチェックします。
50~93行 余りわかりませんでした。
96 if (getxfile(ip, nc) || u.u_error)
gettxfile: 新しいテキストをinodeから読み込む。
168 readi(ip);
としている。
execはreadの変形といえます。
text領域(機械語のコードを格納)にも読み込める。
そのため他のプロセスに化けるというか、自分自身を他のプロセスのイメージで塗り替えるというのが実体?
プログラムを実行するには、PC(プログラムカウンタ)に次に実行するアドレス(例:関数呼び出ししたらリターンしたときに戻る場所をセットしておく)を指定した実行ファイルのものに書き換えてやるってことになる?
実行ファイルのヘッダにエントリポイントが書いてあってそれをプログラムカウンタにセットするするってことのようですがそれだと実行ファイルを生成(コンパイル)した際に実行するアドレスが決まっているということ?
別プログラムなら別の仮想空間で実行されるので同じアドレスでも問題なし。
同じプログラムを複数実行しても、実体は別として複数のプロセスが動くので同じアドレスでも問題なし。
ってことのように思えます。
0 件のコメント:
コメントを投稿