2

exec()システムコールの引数がどのレジスタに格納されているかを知りたいのですが。

最初にexecシステムコールを実行する単純なCプログラムを実行し、そのオブジェクトダンプを取得したところ、実行するプロセスを含む引数にRDIが使用されており、カーネルでexecveを呼び出すためにsyscall命令が使用されていることがわかりました。私は64ビットのUbuntu12.04OSでこれを行いました

次に、QEMUで実行されているUbuntu 11.10 OS(32ビット)でこのプログラムを実行しました。しかし、現在、0x80のないオブジェクトダンプ割り込みが使用されており、引数はEBXにあります。

私は2つの面で混乱しています..なぜ1つの場所でint80が使用され、もう1つの場所でsyscallが使用され、execveシステムコールのレジスタがどのように選択されるのですか?

4

1 に答える 1

0

表示されているのは、実行中のオペレーティングシステムにサービスを要求するときに、さまざまなチップアーキテクチャがさまざまなシステムコール規則を使用していることです。このような規則は、オペレーティングシステムによって定義されたABI (アプリケーションバイナリインターフェイス)の一部です。ABIによって定義されたその他のものには、次のものがあります。

  • 関数に引数を渡すために使用されるレジスタ(および/またはスタックレイアウト)

  • 関数がスクラッチスペースとして使用できるレジスタと、戻るときに以前の値に復元する必要があるレジスタ

  • プロセッサのアドレス空間内のプログラムの(仮想)メモリレイアウト

多くの場合、両方が同じ物理プロセッサでサポートされていますが(下位互換性の理由から)、Intel 64ビット(IA64)アーキテクチャと32ビット(IA32)アーキテクチャは依然として分離されており、異なる(重複している場合)レジスタが使用可能であり、ABIも異なります。 。お気づきのとおり、これら2つのABIは、システムコールへの引数の配置と、システムコールが行われていることをカーネルに通知する手段の両方で異なります。

最近、オペレーティングシステムのABIは、特定のチップアーキテクチャを提供する会社によって(少なくとも提案として)定義されることが多いため、特定のアーキテクチャで実行されているすべての(またはほとんどの)オペレーティングシステムが同じABIを提供するのが一般的です。しかし、これは常に当てはまるわけではありませんでした。まったく同じハードウェアで実行されている異なるオペレーティングシステム間で、注意したタイプの違いを見つけることは可能です。

于 2013-01-18T15:07:54.167 に答える