init/main.c에 있는 execve가 정의되어있는 위치는 ?

hongwoo의 이미지

linux kernel 2.6.18.8 init/main.c에 있는 코드입니다.

...
static void run_init_process(char *init_filename)
{
    argv_init[0] = init_filename;
    execve(init_filename, argv_init, envp_init);
}

여기서 execve가 어디에 있는 함수인지 찾지 못하고 있습니다.
찾다찾다 지치다보니 혹시 user level의 execve를 호출하는건 아닌지 의심이 되고 있습니다. ;;
이건 어디에 있는걸까요 ?? 흐음...

참고로 2.6.28.1에는 다음과 같이 되어 있습니다.

init/main.c 
...
static void run_init_process(char *init_filename)
{
    argv_init[0] = init_filename;
    kernel_execve(init_filename, argv_init, envp_init);
}
 
arch/x86/kernel/sys_i386_32.c 
...
int kernel_execve(const char *filename, char *const argv[], char *const envp[])
{
    long __res;
    asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
    : "=a" (__res)
    : "0" (__NR_execve), "ri" (filename), "c" (argv), "d" (envp) : "memory");
    return __res;
}

grassman의 이미지

실제로 컴파일 해 보면 execve 부분이 다음의 코드로 치환되어 있는 것을 확인할 수 있습니다.
이 코드는 glibc의 코드입니다.

00012b0 be404a62c0                     mov         esi, c0624a40                                                              
00012b5 bd0b000000                     mov         ebp, 0xb                                                                   
00012ba 89e8                           mov         eax, ebp       
00012bc 89d9                           mov         ecx, ebx               
00012be 89f2                           mov         edx, esi            
00012c0 53                             push        ebx            
00012c1 89fb                           mov         ebx, edi
00012c3 cd80                           int         0x80