码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核模块编程可以使用的内核组件

时间:2019-03-10 09:34:41      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:--   block   处理   完成   创建   thread   col   访问   频繁   

2.2.2 在阅读《深入Linux内核架构与底层原理》 作者:刘京洋 韩方,发现一些错误,有些自己的理解,特以此记录

1、工作队列(workqueue)

  队列是一种可以先进先出的数据结构,常常用来将一些工作任务缓冲的情况中。在linux下的workqueue可以用来处理内核中的任务链。

  linux内核有workqueue,用户可以实现自己的workqueue,如果需要workqueue时,都临时创建,会导致系统开销大,为了减少开销,内核使用了workqueue的线程池的技术,将创建好的workqueue,应用完毕后,返回到线程池中,需要新workqueue时,先看池里,如果有则直接使用,否则再新建,避免了频繁的workqueue的创建和销毁。通过这种动态绑定workqueue的机制就是cwmq(Concurrency Managed Workqueue)

见原书上p37页,感觉排版造成的问题不少阿 

 1 #include <linux/module.h>
 2 #include <linux/init.h>
 3 #include <linux/workqueue.h>
 4 
 5 static struct workqueue_struct *queue = NULL;
 6 static struct workqueue_struct work;
 7 
 8 static void work_handler(struct work_struct *data){
 9     printk(KERN_ALERT "work hadler\n");
10 }
11 
12 static init __initqueue_init(void){
13     queue = create_singlethread_workqueue("Hello world");
14     INIT_WORK(&work, work_handler);
15     schedule_work(&work);
16     
17     return 0;
18 }
19 
20 static void __exit queue_exit(void){
21     destroy_workqueue(queue);
22 }
23 
24 MODULE_LICENSE("GPL");
25 module_init(queue_init);
26 module_exit(queue_exit);

2、中断系统和tasklet

  Linux下中断分为3个层次,

  1、最低层次是在linux kernel源码的arch目录下与硬件有关的代码下,我的是在/linux-4.20.6/arch/x86/include/asm/irq_vectors.h,这个文件定义了一些硬件中断号,直接完成硬件的映射

  2、中层是do_IRQ函数,根据下层传来的中断号查找中断函数、处理CPU访问和中断重入等

  3、上层是直接调用真实的中断处理函数

 

  tasklet主要用于专用中断,不能阻塞,耗时长的操作都有tasklet在上下文之外调度执行,常用软中断实现。

 

Linux内核模块编程可以使用的内核组件

标签:--   block   处理   完成   创建   thread   col   访问   频繁   

原文地址:https://www.cnblogs.com/guochaoxxl/p/10504117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!