2009-08-24 17 views

答えて

11

あなたは一般的にポインタについて質問していますか?

ほとんどのオペレーティングシステムでは、論理アドレスです。

オペレーティングシステムは、仮想メモリとページングメカニズムを使用してオペレーティングシステムを物理アドレスに変換する役割を担います。これはプログラムにとって透過的です。そういうわけで、間違ったプログラムが「境界線に当たった」とGPFが原因です。

一部の古いシステム(DOSなど)では、メモリが物理的になり、メモリの他の部分にあるものを上書きすることができます。

7

OSおよびコードの実行レベルによって異なります。

最新のOS上の通常のユーザーランドプログラムでは、仮想アドレスを取得します。

+1

私は次のプログラムを実行する場合:int main(){int(* p)(); それは0x80483c4のようなアドレスを与えています、それは物理的なアドレスだと思います、なぜこのような大きなアドレスでメインの仮想アドレスが始まりますか? 私はlinux.plzでこれを実行していますが、私が間違っているかどうかを明確にしていますか? – mawia

+4

あなたは間違っています。これは仮想アドレスです。あなたのmain()関数が仮想アドレス0にロードされるとは誰も言われませんでした。実際、ELFバイナリ(Linuxで使用される)では、コードセグメントは仮想アドレス0x80482c0から始まります。 main()の前のコード)。仮想アドレス空間は頻繁に不連続であり、仮想アドレスは使用時にのみ割り当てられることに注意してください。あなたのプログラムが0x80482c0でロードされているからといって、そこと0x0の間のすべてが既に割り当てられているわけではありません。 –

+0

あなたのプログラムがLinux環境下でどのようにメモリ内でどのように編成されているかを知りたい人は、こちらをお読みください。 –

関連する問題