kernel_thread简析

1.3.100
static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
    long retval;

    __asm__ __volatile__(
        "movl %%esp,%%esi\n\t"
        "int $0x80\n\t"        /* Linux/i386 system call */
        "cmpl %%esp,%%esi\n\t"    /* child or parent? */
        "je 1f\n\t"        /* parent - jump */
        "pushl %3\n\t"        /* push argument */
        "call *%4\n\t"        /* call fn */
        "movl %2,%0\n\t"    /* exit */
        "int $0x80\n"
        "1:\t"
        :"=a" (retval)
        :"0" (__NR_clone), "i" (__NR_exit),
         "r" (arg), "r" (fn),
         "b" (flags | CLONE_VM)
        :"si");
    return retval;
}

1. 执行系统调用 __NR_clone
2. 父进程走1f,子进程调fn
3. fn完成后执行__NR_exit系统调用
4.注:%eax=__NR_clone, %ebx是参数,flags带上了CLONE_VM

posted @ 2017-12-07 09:26  mull  阅读(602)  评论(0编辑  收藏  举报