2010-12-31 4 views
1

「スタックは、すべてのプログラムのために同じアドレスから始まります」。また、すべてのプロセスにテキスト、データ、スタックセクションがあります。マシン上で実行中のすべてのプロセスは、それはそれで実行されている唯一のプロセスであるという錯覚を与えている

しかし、私は、すべてのプロセスのスタックアドレスが同じアドレス(何のカーネルパッチがインストールされていないと仮定し、アドレスのランダム化が無効になっている)でオフを開始する理由を理解することができません。

誰かがいくつかの読書資源に向けて私を指すか、この問題が発生した理由を説明できますか?

+3

私が理解することはありません理解していません。なぜ他の場所から始めるのだろう?プロセスが始まる前に起こったことは毎回同じように起こります。錯覚はプロセスのために新たに作成されたアドレス空間を持つことを伴います。 –

+1

私はKarlに同意します。あなたが見逃しているのはおそらくアドレス空間の概念です(そして私は栄光を奪いたくないので、@ Karl Knechtel、あなたは答えを書くべきです)。 – zneak

+0

スタックサイズを設定できるので、開始アドレスはプロセスごとに異なる場合があります。 – ruslik

答えて

2

ヒープが育つと、ほとんどのオペレーティングシステム上の仮想空間がどのように見えるので、スタックは、ダウン成長:したがって

Program text 
Program data/bss 
Heap 
(dynamically grows up) 
... 
... 
(dynamically growing down) 
stack 

プログラムのサイズに応じて、ヒープの移動の場所が、スタックの開始スペースがありますプログラムに関する何かに依存しない。

+0

ありがとう、ちょうど私が探していたもの。しかし、スタックの開始アドレスは何に依存していますか?どのように計算され、それは何に依存していますか? –

1

実際のアドレスとそのがありますので、私は「仮想」アドレスを使用するつもりです。あなたが言ったように、それは錯覚です。開始アドレスは実際には同じではありません。

1

これは、オペレーティングシステムに依存し、実際にASMの質問ではありません。

/* 
* Place the stack at the largest stack address the architecture 
* supports. Later, we'll move this to an appropriate place. We don't 
* use STACK_TOP because that can depend on attributes which aren't 
* configured yet. 
*/ 
vma->vm_end = STACK_TOP_MAX; 

以降:

stack_top = arch_align_stack(stack_top); 
stack_top = PAGE_ALIGN(stack_top); 

ランダム化がarch_align_stackで行われているLinux用 は(オープンソースである、あなたが知っている)FS/exec.cに見えます。

関連する問題