オペレーティング システムが C でアドレス指定できる最小および最大のメモリ アドレスを出力する方法はありますか?
5 に答える
簡単な答えは、32ビットアドレスシステム(たとえば)では、アドレス範囲はであるということです[0x00000000, 0xFFFFFFFF]
。しかし、それはあなたが実際にその範囲内のすべてのバイトにアクセスできるという意味ではありません。オペレーティングシステムとコンパイラがプログラム内のメモリをどのように配置するか、つまり、静的データセグメントがどこにあるか、ヒープがどこにあるか、スタックがどこにあるかなどを知る必要があります。
また、最新のオペレーティングシステムで実行されている特定のプログラムよりも、アドレス空間のほとんどがマッピングされていないことを認識してください。
仮想メモリでは、すべてのプロセスに独自のアドレススペースがあるため、あるプロセスのアドレスのバイト0x0010F444
(たとえば)は、他のすべてのプロセスの同じアドレスのバイトとは完全に異なる物理バイトになります。
Linux では、実行中のプロセスのメモリ マップを調べることができます/proc/[PID]/maps
。proc(5)を参照してください。例えば:
$ cat /proc/self/maps
08048000-0804f000 r-xp 00000000 03:01 63119 /bin/cat
0804f000-08050000 rw-p 00006000 03:01 63119 /bin/cat
08050000-08071000 rw-p 08050000 00:00 0 [heap]
b7c58000-b7e09000 r--p 00000000 03:05 243564 /usr/lib/locale/locale-archive
b7e09000-b7e0a000 rw-p b7e09000 00:00 0
b7e0a000-b7f39000 r-xp 00000000 03:01 63497 /lib/libc-2.7.so
b7f39000-b7f3a000 r--p 0012f000 03:01 63497 /lib/libc-2.7.so
b7f3a000-b7f3c000 rw-p 00130000 03:01 63497 /lib/libc-2.7.so
b7f3c000-b7f40000 rw-p b7f3c000 00:00 0
b7f5b000-b7f5c000 rw-p b7f5b000 00:00 0
b7f5c000-b7f76000 r-xp 00000000 03:01 63276 /lib/ld-2.7.so
b7f76000-b7f78000 rw-p 00019000 03:01 63276 /lib/ld-2.7.so
bfc83000-bfc98000 rw-p bffeb000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
このプロセスでは、メモリ マップの最後のエントリは 0xfffff000 であるため、アドレス指定可能な最後のバイトは 0xfffff000 - 1 です。
いいえ、これは標準 C の機能ではありません。必要なソリューションは、OS 固有である必要があります。
特定の OS を念頭に置いている場合は、それらについて言及する必要があります。しかし、なぜこれが重要なのか疑問に思っています。C プログラムを書ける必要はないので、教えていただけないでしょうか。
あなたのコメントに基づいて:
私が興味を持っているのは、「各プロセスがメモリ内にアドレス空間を取得した場合、そのプロセスのトップアドレスとボトムアドレスを出力できるか?」ということです。
繰り返しますが、これは OS によって異なります。アドレス空間は必ずしも物理メモリではなく、アドレス指定できる場所の全体です。たとえば、x86 ベースのオペレーティング システムは、すべてのプロセスに独自の 4G アドレス空間を与えることができますが、OS に「バッキング」メモリ (そのアドレス空間に配置する実際の実メモリ) を要求する必要があります。
そして、そのアドレス空間の一部は、実際にはすべてのプロセス間で共有されます (たとえば、OS はすべてのプロセスで使用するためにコードの 1 つの物理コピーをロードできます)。
仮想メモリと物理メモリは非常に異なる獣であることを覚えておく必要があります。
ここで最も重要なことは、プロセスメモリとOSメモリは完全に異なるものです。つまり、「Cで」と言えば、プロセスのメモリ空間とは本当に違うことを意味するのでしょうか。
私はこれが役立つかもしれないことを提案します、少なくともあなたにいくらかの方向性を与えます。もう1つはbrk(2)/ sbrk(2)です。これらのメカニズムは、私の経験が示すほど頻繁には使用されません。
仮想メモリとメモリ保護を備えた最新のオペレーティング システムでは、プロセスのアドレス空間の境界は静的ではありません。ヒープからメモリを割り当てると、オペレーティング システムがより多くの物理メモリをアドレス空間にマッピングすることで実装できるため、その空間が大きくなります。