22

2 つの整数を追加する小さなプログラムを作成し、readelf -a executable_nameそれを使用すると、elf ヘッダーのエントリ ポイント アドレスが次のように表示されました。

Entry point address: 0x8048330

ローダーがメモリにロードする前であっても、実行可能ファイルはどのようにしてこのアドレスを事前に知ることができますか? elf_format.pdfこのメンバーは、システムが最初に制御を転送する仮想アドレスを提供し、プロセスを開始します。このステートメントの意味と、ここでの仮想アドレスの意味を説明できる人はいますか?

また、実行可能ファイルが0x8048330エントリ ポイント アドレスとして値を取得する場所から教えてください。クロスチェックのために別のプログラムをコンパイルしましたが、そのためにもエントリポイントアドレスは同じ値のままです(セクション0x8048330のオフセットは両方の場合にあります)。.text0x330

4

3 に答える 3

13

最初の質問の場合:

表示されたエントリポイント0x8048330は、仮想メモリアドレスです(反対に、物理メモリです)。これは、エグゼクティブがマップする物理アドレスを知る必要がないことを意味します。(ローダーでロードした後)物理メモリにアクセスすることさえできません。プログラムのプロセスでは、.textセクションは常にから始まり0x8048330、システム(OSおよびハードウェア)は実行時にそれ(仮想アドレス)を物理メモリにマップします。

物理メモリのマッピングと管理は多くのことです。詳細については、Googleで確認できます。

2番目の質問について

どの部分があなたを混乱させたかわからないので、それらすべてをカバーしようとします:

  • 複数のプログラムに同じエントリポイントを設定できますか?

はい、同じエントリポイントを持つ別のプログラムが存在する可能性があります0x8048330。このアドレスは仮想であるため、プログラムを同時に実行しようとすると、実行時にプログラムは異なる物理メモリにマップされます。

  • エントリは常にあり0x8048330ますか?

Linuxの幹部はから始まり0x8048000ますが、.textセクションのオフセットは他のセクションの長さに関連しています。だから、いや、それは0x8048034何か他のものである可能性があります。

  • なぜそれはいつもから始まるの0x8048000ですか?

それは一種の歴史的なことだと思います。Linuxの設計者は、未知の、あるいはランダムな理由でこれを選びました。このスレッドを参照して、その領域の下にあるものを確認できます。

于 2012-09-21T05:49:44.870 に答える
13

エントリ アドレスは、リンカーが実行可能ファイルを作成するときに、リンカーによって設定されます。ローダーは、制御をエントリ アドレスに転送する前に、ELF ヘッダーで指定されたアドレスにプログラム ファイルをマップします。

具体的な例を使用するには、次のことを考慮してください。

% file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, \
    for GNU/Linux 2.6.15, not stripped
% readelf -e a.out
... snip ...
Elf file type is EXEC (Executable file)
Entry point 0x8048170
There are 6 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x08048000 0x08048000 0x7cca6 0x7cca6 R E 0x1000
  LOAD           0x07cf98 0x080c5f98 0x080c5f98 0x00788 0x022fc RW  0x1000
... snip ...

最初のプログラム ヘッダーは、ファイル オフセット 0 にあるファイルの内容を仮想アドレス 0x08048000 にマップする必要があることを指定します。このセグメントのファイルとメモリのサイズは 0x7cca6 バイトです。このセグメントは、読み取り可能および実行可能にマップされますが、書き込み可能ではありません (プログラムのコードが含まれます)。

ELF ヘッダーで指定されているエントリ ポイント アドレスは 0x8048170 で、プログラム コードを含む領域内にあります。

John Levine著の「Linkers and Loaders」という本は、リンク エディターとローダーに関連する問題について相談するための優れたリソースです。

于 2012-09-19T19:16:22.167 に答える
3

仮想アドレスの質問について:

通常のユーザーランド アプリケーションは仮想アドレスで動作します。つまり、メモリ空間に直接アクセスすることはありません。OS は (一部のマイクロプロセッサの特別な機能を利用して)、この仮想アドレスを物理アドレスにマップします。

このようにして、OS は、アプリケーションが他のアプリケーション メモリまたは OS 予約メモリに読み書きできないようにします。また、これにより、アプリケーションに対して透過的な方法でメモリのページング (メモリとしてハードディスクを使用) が可能になります。

于 2012-09-19T08:54:25.677 に答える