Linux内核线程

释放双眼,带上耳机,听听看~!

内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。

一 线程的创建


1
2
3
4
5
6
7
8
9
10
11
12
13
1struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...);  
2线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process()才能驱动线程。
3也可以使用kthread_run创建线程并启动线程  
4struct task_struct *kthread_run(int (*threadfn)(void *data),void *data,const char *namefmt, ...);  
5#define kthread_run(threadfn, data, namefmt, ...)              \  
6({                                     \  
7 struct task_struct *__k
8= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \  
9if (!IS_ERR(__k))                          \
10 wake_up_process(__k);                      \  
11__k;                                   \  
12})  
13

        可见kthread_run是在调用了kthread_create后执行了wake_up_process.

        在非内核线程中调用kernel_thread,必须在调用daemonize(…)来释放资源,成为真正的内核线程,kthread_create实际调用kernel_thread但是内部已经做了处理,不需要自己调用daemonize。

二 线程的退出

      kthread_stop:设置线程的退出标记(线程函数内应用int kthread_should_stop(void)函数,当返回真时应退出函数),kthread_stop会一直等待至线程结束,线程结束前会发送完成结束给kthread_stop,如果直接使用do_exit直接退出线程那么kthread_stop不会收到完成信号将一直等待下去。如果线程已经退出那么kthread_stop会先设置退出标记再唤醒一下thread,唤醒线程后会判断退出标记因此设定的处理函数不会被调用。如果线程已经被唤醒并已经退出那么kthread_stop会一直等待。


1
2
3
1int kthread_stop(struct task_struct *thread);  
2如果处理函数没用kthread_should_stop判断退出,那么 kthread_stop会一直等待处理函数主动退出。  
3

三 内核线程例程

触摸屏驱动中,内核线程的一个例程。

开启线程:


1
2
3
4
5
6
7
8
9
1i2c.thread = kthread_create(ilitek_i2c_polling_thread, NULL, "ilitek_i2c_thread");
2if(i2c.thread == (struct task_struct*)ERR_PTR){
3   i2c.thread = NULL;
4   printk(ILITEK_ERROR_LEVEL "%s, kthread create, error\n", __func__);
5}
6else{
7   wake_up_process(i2c.thread);
8}
9

1
2
1  线程函数:
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1static int i2c_polling_thread(void *arg)
2{
3
4   int ret=0;
5   // mainloop
6   while(1){
7       // check whether we should exit or not
8       if(kthread_should_stop()){
9           break;
10      }
11      // this delay will influence the CPU usage and response latency
12      msleep(10);
13      // when i2c is in suspend or shutdown mode, we do nothing
14      if(i2c.stop_polling){
15          msleep(1000);
16          continue;
17      }
18      // read i2c data
19      if(ilitek_i2c_process_and_report() < 0){
20          msleep(3000);
21          printk(ILITEK_ERROR_LEVEL "%s, process error\n", __func__);
22      }
23  }
24  printk(ILITEK_DEBUG_LEVEL "%s, exit\n", __func__);
25  return ret;
26}
27

kthread_should_stop()会去判断是不是有某人调用了kthread_stop去终止你的内核线程,如果是就会退出无限循环, 然后内核会通知kthread_stop,表明线程退出了,kthread_stop函数等到线程退出后才会返回。

给TA打赏
共{{data.count}}人
人已打赏
安全运维

WordPress网站专用docker容器环境带Waf

2020-7-18 20:04:44

安全运维

运维安全-Gitlab管理员权限安全思考

2021-9-19 9:16:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索