免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: chouxiaoya9100
打印 上一主题 下一主题

[内核入门] 加载一个内核模块,会不会创建一个内核线程?【已解决】 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
11 [报告]
发表于 2017-02-20 12:43 |只看该作者
不过.so相比于.ko的复杂性,主要影响的应该是编译器,加载时的复杂性区别应该不大了。

论坛徽章:
0
12 [报告]
发表于 2017-02-20 15:47 |只看该作者
本帖最后由 nuclearxin 于 2017-02-21 11:25 编辑

insmod运行 初始化函数。rmmod 运行 c退出函数 。
这个是模块调用的方式: 你如果 init 不返回 就卡哪里~ 相当于你自己的ismod的pid 。
这个例子使用了kthread 所以 不需要等待返回 所有工作在 thread里面运行。insmod马上就结束就是个安装过程。module的工作在thread里面
如果你不用kthread的话。。。。你的codea都写子init里面 那么insmod就是你的task啦~~ 一般没这么做的!

这个code是我自己写着玩的
可以看到自己的task pid

  1. static struct task_struct * thp;
  2. //static struct task_struct * mthp[MAX_T];


  3. //thread function

  4. static int thread_f(void *non)
  5. {
  6.   pid_t tid = current->pid;
  7.   while(!kthread_should_stop()){
  8.     printk(KERN_INFO "Thread id : %d start loop running 3sec sleep! \n",tid);
  9.     ssleep(1);
  10.     }
  11.   
  12.   printk(KERN_INFO "Thread id : %d is going to stop \n",tid);
  13.   do_exit(0);
  14.   return 0;
  15. }

  16. static int create_jerry_thread(void)
  17. {

  18.   printk(KERN_INFO "start to create one thread");
  19.   thp = kthread_run(thread_f,NULL,"JERRH_THREAD: %d ",1);
  20.   if(thp)
  21.     printk(KERN_INFO " create thread !\n");
  22.   else
  23.     printk(KERN_ERR "Error on create thread !\n");
  24.   return 0;

  25. }

  26. static int __init jerry_init(void)
  27. {
  28.         printk(KERN_INFO "Hello, world 2\n");
  29.         printk(KERN_INFO "Hello, world my pid is %d \n",current->pid);
  30.         create_jerry_thread();
  31.         return 0;
  32. }

  33. static void __exit jerry_exit(void)
  34. {
  35.    
  36.   printk(KERN_INFO "try to stop the thread\n");
  37.   if(thp)
  38.   {
  39.     kthread_stop(thp);
  40.     printk(KERN_INFO "send the kill pendding , should stoped\n");
  41.   }
  42.   else
  43.     printk(KERN_INFO "Failed !\n");
  44.     printk(KERN_INFO "Goodbye, world 2\n");

  45. }

  46. module_init(jerry_init);
  47. module_exit(jerry_exit);

  48. MODULE_LICENSE("GPL");
  49. MODULE_AUTHOR("JERRY ");
复制代码

这个是 加载和删除的 效果
insmod jerry.ko
rmmod jerry
  1. [1010859.359699] Hello, world 2
  2. [1010859.359707] Hello, world my pid is 19289
  3. [1010859.359709] start to create one thread
  4. [1010859.360115]  create thread !
  5. [1010859.360144] Thread id : 19291 start loop running 3sec sleep!
  6. [1010860.364112] Thread id : 19291 start loop running 3sec sleep!
  7. [1010861.368129] Thread id : 19291 start loop running 3sec sleep!
  8. [1010862.372116] Thread id : 19291 start loop running 3sec sleep!
  9. [1010863.376112] Thread id : 19291 start loop running 3sec sleep!
  10. [1010864.380098] Thread id : 19291 start loop running 3sec sleep!
  11. [1010865.384115] Thread id : 19291 start loop running 3sec sleep!
  12. [1010865.631066] try to stop the thread
  13. [1010866.388106] Thread id : 19291 is going to stop
  14. [1010866.388146] send the kill pendding , should stoped
  15. [1010866.388148] Goodbye, world 2
复制代码





评分

参与人数 1可用积分 +2 收起 理由
Godbach + 2 赞一个!

查看全部评分

论坛徽章:
2
综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:00
13 [报告]
发表于 2017-02-21 10:34 |只看该作者
回复 5# chouxiaoya9100

论坛徽章:
0
14 [报告]
发表于 2017-03-23 13:35 |只看该作者
单纯加载一个模块这个过程,要么用户态 modprob, 要么内核态kmod调用用户态modprob 都会启动一个用户态进程来加载模块。
模块加载到内核的本质,是给内核提供了更多的可用函数或者变量。可以看成是一个静态的。但是,模块的 init 入口,在加载时会被调用,所以,如果
你故意在module 的register 中创建了一个内核线程的话,就有线程执行。如果你啥也不干,只是声明和定义了一组符号。那肯定不会有内核线程产生。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP