BTW:我的平台还是用不了这个Makefile
改为:
obj-m :=sem.o
CURRENT_PATH := $(shell pwd)
LINUX_KERNEL := 2.6.24-15-generic
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
>
> niutao.linux 时间:2008-09-22 19:07:23 IP地址:221.11.22.★
> 把这两句
> kernel_thread(thread_print_first,num[0],CLONE_KERNEL);
> kernel_thread(thread_print_second,num[1],CLONE_KERNEL);
> 掉换一下,结果就如你所说。另外kernel_thread()实际上是调用sys_clone(),
我不没找到相关证据,而是看到 linux/arch/ia64/kernel/process.c :
675pid_t
676kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
677{
678 extern void start_kernel_thread (void);
679 unsigned long *helper_fptr = (unsigned long *) &start_kernel_thread;
680 struct {
681 struct switch_stack sw;
682 struct pt_regs pt;
683 } regs;
684
685 memset(®s, 0, sizeof(regs));
686 regs.pt.cr_iip = helper_fptr[0]; /* set entry point (IP) */
687 regs.pt.r1 = helper_fptr[1]; /* set GP */
688 regs.pt.r9 = (unsigned long) fn; /* 1st argument */
689 regs.pt.r11 = (unsigned long) arg; /* 2nd argument */
690 /* Preserve PSR bits, except for bits 32-34 and 37-45,
which we can't read. */
691 regs.pt.cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN;
692 regs.pt.cr_ifs = 1UL << 63; /* mark as valid,
empty frame */
693 regs.sw.ar_fpsr = regs.pt.ar_fpsr = ia64_getreg(_IA64_REG_AR_FPSR);
694 regs.sw.ar_bspstore = (unsigned long) current + IA64_RBS_OFFSET;
695 regs.sw.pr = (1 << PRED_KERNEL_STACK);
696 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0,
®s.pt, 0, NULL, NULL);
697}
698EXPORT_SYMBOL(kernel_thread);
还有在linux/arch/frv/kernel/kernel_thread.S下有:
###############################################################################
26#
27# Create a kernel thread
28#
29# int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
30#
31###############################################################################
32 .globl kernel_thread
33 .type kernel_thread,@function
34kernel_thread:
35 or.p gr8,gr0,gr4
36 or gr9,gr0,gr5
37
38 # start by forking the current process, but with shared VM
39 setlos.p #__NR_clone,gr7 ; syscall number
40 ori gr10,#CLONE_VM,gr8 ; first syscall
arg [clone_flags]
41 sethi.p #0xe4e4,gr9 ; second syscall
arg [newsp]
42 setlo #0xe4e4,gr9
43 setlos.p #0,gr10 ; third syscall
arg [parent_tidptr]
44 setlos #0,gr11 ; fourth syscall
arg [child_tidptr]
45 tira gr0,#0
46 setlos.p #4095,gr7
47 andcc gr8,gr8,gr0,icc0
48 addcc.p gr8,gr7,gr0,icc1
49 bnelr icc0,#2
50 bc icc1,#0,kernel_thread_error
51
52 # now invoke the work function
53 or gr5,gr0,gr8
54 calll @(gr4,gr0)
55
56 # and finally exit the thread
57 setlos #__NR_exit,gr7 ; syscall number
58 tira gr0,#0
--
My Bolg: http://niutao.cublog.cn