Messages in this thread | | | Date | Sun, 03 Feb 2002 13:52:08 +0530 | From | "Alpha Beta" <> | Subject | Qn: kernel_thread() and init |
| |
In the code of int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) in arch/i386/kernel/process.c
as can be seen in the code here, a system call is made by trigerring the 0x80 interrupt. this function kernel_thread() is used to launch the init process during booting by start_kernel() //in init/main.c But at that time, the process 0 which calls kernel_thread is executing in Kernel mode, so why should some process in kernel mode make a system call??
ANOTHER BIG DOUBT IS THAT process 0 executes in Kernel mode, it then creates the init process ( process 1)- this process according to BACH ends up running in User mode while process 0 runs in kernel mode. so why should then we have a kernel thread invoked for init when it is to run in User mode ??
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) { long retval, d0;
__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 */ /* Load the argument into eax, and push it. That way, it does * not matter whether the called function is compiled with * -mregparm or not. */ "movl %4,%%eax\n\t" "pushl %%eax\n\t" "call *%5\n\t" /* call fn */ "movl %3,%0\n\t" /* exit */ "int $0x80\n" "1:\t" :"=&a" (retval), "=&S" (d0) :"0" (__NR_clone), "i" (__NR_exit), "r" (arg), "r" (fn), "b" (flags | CLONE_VM) : "memory"); return retval; }
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |