2011-09-11 7 views
0

関数execve(x86_64 Linuxの下で)の実装を見るには、ライブラリunistdにありますか? execveを呼び出さずに、アセンブラを使用して外部プログラムを呼び出す方法を知りたいので、これが必要です。 私はexecveという名前のシステムコールがあることを知っていますが、私はそれをどのように使うことができるのか分かりません。関数の実装execve(unistd.h)

変数char *と型char * []をレジスタに入れるにはどうすればよいですか?実際の「仕事」のすべてがカーネルで行われ

int execve(const char *filename, char * const argv[], char * const envp[]) { 
    return syscall(SYS_execve, filename, argv, envp); 
} 

答えて

1

ユーザ空間でexecve()関数の実装は次のように見えます。恐らくスレッドクリーンアップの他にlibcで特に興味深いことは何もありません。

+0

ありがとうございますが、どのようにchar *型とchar * []型の変数をレジスタに入れることができますか?私は書き込みと終了のシステムコールを作成する方法しか知りません。例えば、ポインタをレジスタに入れ、バッファサイズを別のものにする必要がありますが、どうすればいいですか? – dv1729

+0

以前と変わることはありません - ファイル名、引数配列、環境配列へのポインタを3つのレジスタに入れます。後者の2つは 'char *'の配列の先頭へのポインタで、NULLで終わるものでなければなりません。 – duskwuff

0

glibcのソースコードには、システムコールの実際の直接的な実装はありません。これは、システムコール番号を定義するさまざまなファイルからビルド時に生成されます。

あなたはそれを理解していれば、関連する情報は(あなたがIIRC、#include <asm/unistd.h>、と__NR_execveをしたい - 私はそれがx86_64の上にあるものぶっきらぼう思い出すことができない)、実際のシステムコール番号を除き、sysdep.hで見つけることができます。

システムコール番号は%raxになり、引数は%rdi%rsi%rdxになります。これらの情報(スタックアライメントやカーネルによるレジスタ使用に関するものなど)はすべてsysdep.hにコメントされています。

1

アーキテクチャー上のシステムコール規則(カーネル番号とパラメータのレジスタおよび/またはスタック)のカーネルソース(より具体的には、arch/YOUR-ARCH/kernel/head * .S) )。

たとえば、__NR_execveをr7にロードし、引数をr0、r1、r2にロードしてからswi 0を使用します。詳細についてはthis explantion of ARM EABI syscallsに興味があるかもしれません。