質問: linux OS プロセスの仮想アドレス空間についての質問です。 OSについて学んでいます初学者です。 以下の問題について、授業で自主課題として出されたのですが 解答は出さないということで テスト勉強の際に困っています。 1.プロセスの持つ、機械語、静的データ、スタックなどの配置場所を求めるプログラムを作り、どのような配置かを示せ。 <自分なりの考え> ⇒これはアセンブラで書けば良く、それぞれの領域の先頭にラベルを打ち、そのアドレスを表示させればいいのではないかと考えました。しかし、実際プログラムを作るとなるとアドレスの表示をどうすればいいのか...と悩んでおります。 2.機械語領域などの書き込みができないアドレスへのデータ書き込み、メモリが存在しないアドレスへの読み書きなどを行うと、何が起こるかを示せ。 ⇒これは具体的に「故障してしまう」「エラーがでてしまう」のではないのでしょうか?示し方、というのが今ひとつわかりません。 3.プロセスの親子間でメモリが共有されないことを示すプログラムを作り、結果を示せ。 ⇒これはforkしてアドレスを親と子で比べ、違いを示せばよいということでしょうか? 初めて利用するため、場違いな質問であれば申し訳ありません。ご指摘ください。よろしくおねがいします。
回答: こんにちは。 > > 1.プロセスの持つ、機械語、静的データ、スタックなどの配置場所を求めるプログラムを作り、どのような配置かを示せ。 > > > 各領域の先頭アドレスだと私も分かりませんが、各領域のどこかでよいなら簡単です。C言語でできます。 機械語は要するにプログラム・コードが書かれている領域です。例えばmain()関数はその1つですね。main()関数のアドレスを取ってくれば、それは機械語がロードされているアドレスの1つです。 静的データ領域は、グローバル変数やstaticなローカル変数が記録されます。 非staticなローカル変数や関数の引数はスタックに記録されます。 > > 2.機械語領域などの書き込みができないアドレスへのデータ書き込み、メモリが存在しないアドレスへの読み書きなどを行うと、何が起こるかを示せ。 > > > 故障はしませんので実際にやって、その結果を示せばよいと思いますよ。どちらの場合もその領域へのポインタを作って、そのポインタの指す先に何か書き込めば良いです。 > > 3.プロセスの親子間でメモリが共有されないことを示すプログラムを作り、結果を示せ。 > > ⇒これはforkしてアドレスを親と子で比べ、違いを示せばよいということでしょうか? > > > 無いことを証明するのは悪魔の証明と言ってなかなか難しいです。 メモリ空間は膨大ですが、その一部がもしかすると共有されるかも知れないので。また、共有するための手順を踏めば共有できます。 もう少し詳しい条件がついてないと厳しいですね。 単純にforkして同じ静的領域の変数が共有されていないことを確認するぐらいなら簡単でしょう。例えば、親で特定のグローバル変数に0を書いておき、子は同じグローバル変数に1を書いて終了する。親は子が終了したらそのグローバル変数の値を確認するなどです。 ただ、それで良いのかどうかは、教官しだいですが。