|
linux 內核創建線程還是kernel_thread(),最終會調用do_fork()
kernel_thread原形在/arch/kernel/process.c中.
(*fn)(void *)爲要執行的函數的指針,arg爲函數參數(可以爲NULL),
flags爲do_fork產生線程時的標誌(上面談到了).
int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
struct pt_regs regs;
memset(®s, 0, sizeof(regs));
regs.ebx = (unsigned long) fn; /* ebx指向函數地址 */
regs.edx = (unsigned long) arg; /* edx指向參數 */
regs.xds = __USER_DS;
regs.xes = __USER_DS;
regs.orig_eax = -1;
regs.eip = (unsigned long) kernel_thread_helper;
regs.xcs = __KERNEL_CS;
regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
/* 利用do_fork來產生一個新的線程,共享父進程地址空間,並且不允許調試子進程 */
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL);
}
struct pt_regs regs;
結構解釋:在一個系統調用時,把寄存器的值保存在堆棧中。
具體作用分析下代碼,然後看看能不能解釋下
|