linux 系统的时间操作分2类:延时与定时。延时是2个动作之前插入一段等待时间,定时是等待一段时间后执行某个动作,定时的典型应用是轮询。
内存分物理内存与虚拟内存,对使用者来说一般指虚拟内存,内核会通过内存管理模块转换成物理内存。
数据传递,是说用户空间与内核空间之间的数据传递方式,由于内核与用户处于2个不同的空间,2者之间不能用内存地址访问的方式,需要用过内核提供的相关函数来处理数据。
一. 时间管理
1. 延时操作
(1). 包含头文件
#include <linux/jiffies.h>
(2). 时间比较函数
time_after(a, b); //如果时间点a在b之后,则返回true
time_before(a, b); //如果时间点a在b之前,则返回true
time_in_range(a, b, c); //如果时间点a在b与c之间(包含时间b, c),则返回true
例子代码:
int demo_jiffies_function()
{
unsigned long timeout=jiffies+2*HZ; //设置比较时间为2秒
if(time_after(jiffies, timeout)) //判断当前最新的jiffies是否在之前设置的2秒之后
return task_timeout();
return 0;
}
(3). 长延时
msleep(unsigned int msecs); //毫秒级别延时,进程进入睡眠等待,时间到达之前不能唤醒。
msleep_interruptible(unsigned int msecs); //毫秒级延时,进程进入睡眠,可以通过信号唤醒。
(4). 短延时
包含头文件
#include <linux/delay.h>
短延时一般都是忙等待,具体函数有:
void mdelay(unsigned long msecs);
void udelay(unsigned long usecs);
void ndelay(unsigned long nsecs);
2. 定时器
(1). 包含头文件
#include <linux/timer.h>
(2). 定义timer 变量
struct timer_list my_timer;
(3). 定义及实现timer处理函数
void my_timer_function(unsigned long data)
{
printk("my timer function handle...\n");
}
(4). 初始化timer
init_timer(&my_timer);
my_timer.expires = jiffies + 5 * HZ;
my_timer.function = my_timer_function;
(5). 把timer加入timer队列
add_timer(&my_timer);
(6). 删除timer
del_timer(&my_timer);
二. 内存使用
1.包含头文件
#include <linux/slab.h>
2. 物理上地址连续的内存
(1). 申请内存
void *kmalloc(size_t size, int flags); //申请一段物理连续内存
void *kzalloc(size_t size, gfp_t flags); //申请一段物理连续内存并清零
(2). 释放内存
void kfree(const void *);
3. 虚拟地址而物理地址不连续的内存
(1). 申请内存
void *vmalloc(unsigned long size);
(2). 释放内存
void vfree(const void *addr);
三. 内核、用户空间数据传递函数
1. 包含头文件
#include <asm/uaccess.h>
2. 从内核读取数据
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
3. 写数据到内核
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)