Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240345
  • 博文数量: 37
  • 博客积分: 719
  • 博客等级: 上士
  • 技术积分: 325
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-04 10:04
文章分类

全部博文(37)

文章存档

2014年(2)

2013年(5)

2012年(11)

2011年(13)

2010年(3)

2009年(3)

分类: LINUX

2012-09-17 21:03:40

实验代码版本 linux3.0
 
关键修改点2.6.10和3.0版本:
1)队列初始化函数变化
2)延时队列初始化
3)队列回调函数的参数传递
 

关键函数:

1.创建proc文件

第一个参数:文件名 第二个参数:文件权限  第三个参数:文件父目录

第四个参数:read函数 第5个参数:传递给read函数的参数

static inline struct proc_dir_entry *create_proc_read_entry(const char *name,

        mode_t mode, struct proc_dir_entry *base,

        read_proc_t *read_proc, void * data)

{

        struct proc_dir_entry *res=create_proc_entry(name,mode,base);

        if (res) {

                res->read_proc=read_proc;

                res->data=data;

        }

        return res;

}

/*第三个参数设置为NULL,默认在/proc/下建立名字为test_proc的文件*/

2.队列函数

队列初始化函数:

初始化指定工作,目的是把用户指定的函数_func赋给work_struct的func。

INIT_WORK(struct work_struct *work, work_func_t func); 

INIT_DELAYED_WORK(struct delayed_work *work, work_func_t func);

新内核和ldd3的这两个宏已经不一样

队列调度函数:

int schedule_work(struct work_struct *work)

对工作进行调度,即把给定工作的处理函数提交给缺省的工作队列和工作者线程。工作者线程本质上是一个普通的内核线程,在默认情况下,每个CPU均有一个类型为“events”的工作者线程,当调用schedule_work时,这个工作者线程会被唤醒去执行工作链表上的所有工作。

int schedule_delayed_work(struct work_struct *work, unsigned long delay)

延迟执行工作,与schedule_work类似。

3.tasklet函数

    声明自己的tasklet

#define DECLARE_TASKLET(name, func, data) \

struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }

#define DECLARE_TASKLET_DISABLED(name, func, data) \

struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }

      这两个宏都能根据给定的名称静态地创建一个tasklet_struct结构。当tasklet被调度以后,给定的函数func会被执行,它的参数由data给出。这两个宏的区别在于引用计数器的初始值设置不同。前一个宏把创建的tasklet的引用计数器设置为0,该taskelet处于激活状态,另一则设为1,所以处于禁止状态。

tasklet调度:

Tasklet_schedule(struct tasklet_struct *t)

调度执行tasklet。

 

附件中包含一份修改后可以在linux3.0上运行的代码和 使用container_of传递队列参数的代码:

  jiq.rar   

阅读(1547) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~