分类: LINUX
2012-09-17 21:03:40
关键函数:
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传递队列参数的代码: