Chinaunix首页 | 论坛 | 博客
  • 博客访问: 287935
  • 博文数量: 57
  • 博客积分: 1764
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-09 18:14
文章分类

全部博文(57)

文章存档

2012年(24)

2011年(33)

分类: LINUX

2011-11-16 20:39:30

  内核跟线程相关的代码有两部分:
  1、一部分跟平台相关,例如x86下,定义在arch/x86/kernel/process_32.c。提供的接口是kernel_thread。调用daemonize,可以为线程命名。
  2、一部分跟平台无关,定义在kernel/kthread.c,在include/linux/kthread.h中声明。
  1)定义宏kthread_run(threadfn, data, namefmt, ...):包装了kthread_create线程创建和wake_up_process线程运行。
  2)kthread_create,根据调用者的参数内容,将信息整合到kthread_create_info中,然后注册到kthread_create_list链表中,然后唤醒kthreadd_task守护线程(该线程是其它所有创建的线程的祖先,为了让创建的内核子线程有一个干净的环境,该守护线程的上下文是干净的),具体执行的函数体为kthreadd。
  3)kthreadd:在init/main.c中被创建,该线程不断监视kthread_create_list链表,若不为空则调用create_thread,根据kthread_create_info内容,创建线程。
  4)create_thread:调用平台相关kernel_thread创建线程。但是,并不是以threadfn做为线程执行体,而是以kthread做为执行体。通过这层封装,可以更好地对threadfn行为,进行控制。
  5)kthread:对struct kthread进行设置,该结构体用于控制线程的行为(在kthread_stop会改变该结构体中的值),并真正调用threadfn
 
参考资料:
 
阅读(873) | 评论(0) | 转发(0) |
0

上一篇:给终端一点颜色看看

下一篇:jiffies

给主人留下些什么吧!~~