欢迎光临散文网 会员登陆 & 注册

uclinux内核线程的创建

2022-12-13 11:36 作者:有AI野心的电工和码农  | 我要投稿

原地址: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_regsPC指针是指向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)

欢迎转载,但请保留作者信息


uclinux内核线程的创建的评论 (共 条)

分享到微博请遵守国家法律