uclinux内核线程的创建

原地址:http://blog.csdn.net/lights_joy/archive/2009/04/23/4102575.aspx
0. kernel_thread
创建内核线程可以使用kernel_thread函数:
注意这里的pc值的设置,它指向了kernel_thread_help,这将是这个内核线程要执行的第一行语句:
在这段代码中,将跳转到用户指定的函数,然后调用do_exit进行一些清理工作。
具体的创建工作由do_fork完成,此时传递进去的stack_start和stack_size的值都为0。
1. do_fork
这个函数完成线程的创建,它的关键代码如下:
它首先为此线程分配一个pid号,然后复制出一个新的task_struct,最后唤醒此线程,当然此时还不会进入执行状态。
2. copy_process
这个函数用于从当前线程复制一个task_struct出来。
它首先调用dup_task_struct得到一个task_struct,同时也给这个新的线程分配了一个thread_info的结构体,这也是这个新线程的栈,使用BUDDY算法分配,保证以8K对齐。
接着调用copy_thread进行线程的复制。
注意这里在新线程的栈的底端复制了一份pt_regs,而这份pt_regs的PC指针是指向kernel_thread_helper的。且新线程的PC指针是指向ret_from_fork函数。
3. wake_up_new_task
这个函数用于把线程放到一个CPU核的任务队列中。
这个函数挺长的,但实际上将新线程加入队列的工作是由 __activate_task 这个函数完成的:
再看 enqueue_task :
快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
uclinux-2008r1.5-RC3(移植到vdsp5)
Visual DSP++ 5.0(update 5)
欢迎转载,但请保留作者信息