2017-09-28 2 views
1

Je suis un débutant sous Linux et je suis confus au sujet de la fonction sys_execv. Si je comprends bien, sys_execv utilisera load_elf_binary pour charger un nouveau binaire, puis appelez la fonction start_thread pour mettre à jour le nouveau pc et spsr. Après cela, il va passer à ret_fast_syscall, puis avec restore_user_regs il peut revenir à l'espace utilisateur.ARM Linux: comment sys_execv met-il à jour la pile de l'utilisateur

Mais je ne vois nulle part mettre à jour la pile de l'utilisateur. Si personne ne met à jour la pile utilisateur, elle retournera à l'espace utilisateur à l'emplacement de l'ancienne pile utilisateur.

Ai-je raté quelque chose?

Répondre

0

Il vous manque l'étape où le noyau met des choses sur la nouvelle pile de processus. Le format est le même que celui décrit dans ce fichier https://android.googlesource.com/platform/bionic/+/master/libc/private/KernelArgumentBlock.h

glibc fait de la même https://github.com/lattera/glibc/blob/master/csu/libc-start.c

Ceci est appelé 'bloc argument du noyau' et se compose de argc, argv, envp et auxv.

noyau remplit argc, argv et envp à l'aide http://elixir.free-electrons.com/linux/v4.4/source/fs/exec.ccopy_strings.

auxv valeurs sont remplies dans http://elixir.free-electrons.com/linux/v4.4/source/fs/binfmt_elf.c - en utilisant fill_auxv_note

Finalement, sp dans le nouveau processus est défini à l'aide #define start_thread(regs,pc,sp) macro dans http://elixir.free-electrons.com/linux/v4.4/source/arch/arm/include/asm/processor.h#L56 - et appelé de http://elixir.free-electrons.com/linux/v4.4/source/fs/binfmt_elf.c#L1085 en utilisant start_thread(regs, elf_entry, bprm->p);