【Linux设备驱动程序(第三版)】----延迟:超时(wait_event_interruptible_timeout)
2011-07-08 13:50
483 查看
【Linux设备驱动程序(第三版)】----延迟:超时(wait_event_interruptible_timeout)
jit.c
#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/proc_fs.h> #include <linux/spinlock.h> #include <linux/interrupt.h> #include <asm/hardirq.h> #include <linux/sched.h>//jiffies #include <linux/kernel.h> #include <linux/types.h>//u64 #include <linux/fs.h>//file_operations, file #include <linux/completion.h> #include <asm/uaccess.h>//copy_to_user & copy_from_user int delay = HZ; enum jit_files { JIT_BUSY, JIT_SCHED, JIT_QUEUE, JIT_SCHEDTO }; int jit_fn(char *buf, char **start, off_t offset, int len, int *eof, void *data) { unsigned long j0, j1; wait_queue_head_t wait; init_waitqueue_head(&wait); j0 = jiffies; j1 = j0 + delay; switch((long)data){ case JIT_BUSY: while(time_before(jiffies, j1)) cpu_relax(); break; case JIT_SCHED: while(time_before(jiffies, j1)) schedule(); break; case JIT_QUEUE: wait_event_interruptible_timeout(wait, 0, delay); break; } j1 = jiffies; len = sprintf(buf, "%9li %9li\n", j0, j1); *start = buf; return len; } int jit_currentime(char *buf, char **start, off_t offset, int len, int *eof, void *data) { struct timeval tv1; struct timespec tv2; unsigned long j1; u64 j2; j1 = jiffies; j2 = get_jiffies_64(); do_gettimeofday(&tv1); tv2 = current_kernel_time(); len = 0; len += sprintf(buf,"0x%08lx 0x%016Lx %10i.%06i\n" "%40i.%09i\n", j1, j2, (int) tv1.tv_sec, (int) tv1.tv_usec, (int) tv2.tv_sec, (int) tv2.tv_nsec); *start = buf; return len; } int __init jit_init(void) { create_proc_read_entry("jit_currentime", 0, NULL, jit_currentime, NULL); create_proc_read_entry("jitbusy", 0, NULL, jit_fn, (void *)JIT_BUSY); create_proc_read_entry("jitsched", 0, NULL, jit_fn, (void *)JIT_SCHED); create_proc_read_entry("jitqueue", 0, NULL, jit_fn, (void *)JIT_QUEUE); return 0; } void __exit jit_exit(void) { remove_proc_entry("jit_currentime", NULL); remove_proc_entry("jitbusy", NULL); remove_proc_entry("jitsched", NULL); remove_proc_entry("jitqueue", NULL); } MODULE_LICENSE("Dual BSD/GPL"); module_init(jit_init); module_exit(jit_exit);
Makefile
obj-m:= jit.o modules-objs:= jit.o KDIR:= /usr/src/linux-headers-2.6.31-14-generic/ PWD:= $(shell pwd) default: make -C $(KDIR) M=$(PWD) modules clean: rm -rf *.ko *.mod.c *.mod.o *.o *.markers *.symvers *.order
装载
insmod jit.ko
测试
dd bs=20 count=5 < /proc/jitqueue
卸载
rmmod jit
相关文章推荐
- 【Linux设备驱动程序(第三版)】----延迟:超时(schedule_timeout)
- Linux 设备驱动--- 内核等待队列 --- wait_queue_head --- wait_event_interruptible --- 按键驱动程序优化
- Linux 设备驱动--- 内核等待队列 --- wait_queue_head --- wait_event_interruptible --- 按键驱动程序优化
- Linux设备驱动程序第三版学习(10)- 时间、延迟及延缓操作
- Linux设备驱动程序第三版学习(10)- 时间、延迟及延缓操作
- 【Linux设备驱动程序(第三版)】----延迟:让出处理器
- Linux设备驱动程序第三版学习(10)- 时间、延迟及延缓操作
- 学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序
- 【Linux设备驱动程序(第三版)】----简单休眠 Sleepy
- 【Linux设备驱动程序(第三版)】----异步通知
- 【Linux设备驱动程序(第三版)】----忙等待
- 【Linux设备驱动程序(第三版)】----高速缓存
- Linux设备驱动程序第三版学习(6)- 高级字符驱动程序操作(续1)- 进程休眠 .
- wait_event_interruptible_timeout函数分析
- wait_event_interruptible_timeout和schedule_timeout的区别
- linux内核--wait_event_interruptible_timeout()函数分析
- Linux驱动中的 wait_event_interruptible 与 wake_up_interruptible 深度理解
- Linux设备驱动程序第三版学习(5)- 高级字符驱动程序操作 - ioctl .
- linux设备驱动程序学习(7) 时间、延迟及延缓操作
- linux设备驱动程序第三版中译版