process.c :
Enfin la fonction execve qui permet de remplacer l'exécution du thread kernel par le lancement d'un programme est présentée succinctement ci-dessous. Le code de cette fonction a été trouvé sur internet (Alan Cox en est l'auteur), puis modifié par nos soins, car nous aurions été incapable de trouver le bout d'assembleur seul.
int execve(char __user *filename, char **argv, char **envp)
{
int error;
struct pt_regs regs;
memset(®s, 0, sizeof (regs));
regs.eflags = X86_EFLAGS_IF;
error = do_execve(filename,
(char __user * __user *) argv,
(char __user * __user *) envp,
®s);
if (error == 0) {
current->ptrace &= ~PT_DTRACE;
__asm__ __volatile__(
"movl %0,%%esp\n\t"
"movl %1,%%ebp\n\t"
"jmp resume_userspace\n\t"
: : "r" (®s), "r" (current_thread_info()));
}
return error;
}