システムコールを使用して子プロセスを作成すると、fork()
親プロセスのアドレス空間が子プロセスにコピーされます。以下のコードはこれをはっきりと示しています。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
int *mem = (int*)malloc( sizeof(int) * 1 );
pid_t pid = fork();
if( pid == 0 ){ // child process
printf("Child address = %ld\n", mem);
}
else{ // parent process
printf("Parent address = %ld\n", mem);
}
return 0;
}
ただし、これは仮想アドレス空間です。つまり、このコードが出力するアドレスは仮想アドレスです。
仮想アドレスから物理アドレスを取得する機会があるかどうか疑問に思います。
実行中のプロセスの開始物理アドレスを格納するベースアドレスレジスタがあると思います。この仮想アドレスをデフォルトのレジスタ値に追加すると、変数の物理アドレスを見つけることができます。これは本当ですか?
ベストアンサー1
はい、プロセス自体が直接見るものはすべて仮想アドレスです。
一般にページングされるシステムは、仮想アドレスと物理アドレスとのマッピングがページ単位で行われ、順次である必要がないため、「ベースアドレスレジスタ」はない。 (たとえば、仮想ページ1は物理ページ4563に設定できますが、仮想ページ2は物理ページ2413に設定できます。)ページテーブルのウィキペディアページ。
私はプロセスがページテーブルに直接アクセスできないと思いますが、Linuxは次の.kernelドキュメントを通してそれをやっているようです。
/proc/<pid>/pagemap
Documentation/vm/pagemap.txt
。ページマップを読むときに別の問題があります。プロセスのページテーブルの表示。