您的位置:首页 > 运维架构 > Linux

linux ------ 时间管理、内存使用及内核与用户间的数据传递

2014-02-26 15:06 597 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐