背景
linux内核提供了很多delay的技术,本文是第二篇使用usleep_range的方式,之前还提供过一种用completion的timeout机制实现的。usleep_range提供了一个休眠的时间范围,而不是固定的延迟时间
基础机制
usleep_range 是 Linux 内核中用于微秒级休眠的宏,它接受两个参数,分别是最小和最大微秒数。这个宏在内核的不同版本中可能有所不同,但基本思想是提供一个随机的休眠时间,以避免时钟同步问题。
头文件:
#include <linux/delay.h>
使用方式:
usleep_range(1000, 2000); //表示1000 和 2000 微秒之间
模块代码
C语言代码:simple_sleep_module.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/uaccess.h>
#include <linux/delay.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux module using usleep_range");
MODULE_VERSION("0.01");
static void simple_sleep_function(void) {
printk(KERN_INFO "simple_sleep_function: Sleeping for a random time between 1000 and 2000 microseconds\n");
usleep_range(1000, 2000); // Sleep for a random time between 1000 and 2000 microseconds
printk(KERN_INFO "simple_sleep_function: Woke up\n");
}
static int __init simple_sleep_init(void) {
simple_sleep_function();
return 0;
}
static void __exit simple_sleep_exit(void) {
printk(KERN_INFO "simple_sleep_module: Exiting\n");
}
module_init(simple_sleep_init);
module_exit(simple_sleep_exit);
Makefile
:
obj-m += simple_sleep_module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
实战
- 编译
- 加载
- 卸载
综述
linux内核提供了很多delay的技术,本文是第二篇使用usleep_range的方式,之前还提供过一种用completion的timeout机制实现的。
更多内核中sleep玩法参考兄弟篇:https://blog.youkuaiyun.com/essencelite/article/details/140054928