4

Linuxがexecve()に渡された環境変数をどのように処理するかについて質問があります。

execve()の概要: int execve(const char * filename、char * const argv []、char * const envp []);

execve()を呼び出す前に、現在のプロセスのメモリマッピングからenvs/argsを保持するためのメモリを割り当てます。ただし、execve()の後、呼び出し元プロセスのすべてのtext / data / bss / stackは新しいプログラムによって上書きされ、古いプロセスのすべてのメモリマッピング(渡されたenvs / argsのメモリを含む)は保持されません。

新しいプログラムの場合、envs / argsをどこで読み取るか?カーネルは渡されたenvs/argsのコピーを作成し、それを新しいメモリマッピング、またはその他のトリックに配置しますか?

4

1 に答える 1

9

はい。

プロセスがを呼び出すexecと、カーネルは配列全体argvenvp配列をコピーします。次に、これらは新しいプロセスイメージにコピーされます。特に、プログラムの実行が開始されると、そのスタックは次のようになります。

NULL
...
envp[1]
envp[0]
NULL
argv[argc-1]
...
argv[1]
argv[0]
argc

のGlibcスタートアップコードは、_startこれを適切な形式にマッサージしてを呼び出しmainます。

(詳細については、古いプロセスからのコピーはで行われlinux/fs/exec.c、新しいプロセスへのコピーはで行われ、プログラムの起動は、、、、などのlinux/fs/binfmt_elf.cアーキテクチャ固有のコードで行われます。起動します。)glibc/sysdeps/i386/start.Sglibc/sysdeps/x86_64/start.Sglibc/ports/sysdeps/arm/start.S__libc_start_mainglibc/csu/libc-start.cmain

于 2012-08-18T06:53:24.953 に答える