2017-09-28 10 views
1

を更新sys_execvない私は、Linuxでの初心者だと私はsys_execv機能について困惑しています。ARM Linuxは:どのようにユーザスタック

私が理解しているように、はload_elf_binaryを使用して新しいバイナリを読み込み、start_thread関数を呼び出して新しいpcとspsrを更新します。その後、ret_fast_syscallにジャンプし、restore_user_regsでユーザスペースに戻ることができます。

しかし、私はどこでもユーザーのスタックを更新することはできません。誰もユーザースタックを更新しない場合、古いユーザースタックの場所にあるユーザースペースに戻りますか?

何か不足していますか?

答えて

0

カーネルが新しいプロセススタックに何かを置くステップがありません。 このファイルhttps://android.googlesource.com/platform/bionic/+/master/libc/private/KernelArgumentBlock.h

glibcに記載されるようにフォーマットが同じで、同様https://github.com/lattera/glibc/blob/master/csu/libc-start.c

これは「カーネル引数ブロック」と呼ばれ、 argcから構成されている

argvenvp、及びauxvありません。

argc,argvおよびenvphttp://elixir.free-electrons.com/linux/v4.4/source/fs/exec.cに、copy_stringsを使用してください。

auxv

値はhttp://elixir.free-electrons.com/linux/v4.4/source/fs/binfmt_elf.cに充填されている - とstart_thread(regs, elf_entry, bprm->p);

http://elixir.free-electrons.com/linux/v4.4/source/fs/binfmt_elf.c#L1085を使用してから呼び出された - 最終的に、新しいプロセスにおける sphttp://elixir.free-electrons.com/linux/v4.4/source/arch/arm/include/asm/processor.h#L56#define start_thread(regs,pc,sp)マクロを使用して設定され fill_auxv_note

を使用して

関連する問題