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)
内存分物理内存与虚拟内存,对使用者来说一般指虚拟内存,内核会通过内存管理模块转换成物理内存。
数据传递,是说用户空间与内核空间之间的数据传递方式,由于内核与用户处于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)
相关文章推荐
- linux 用户空间和内核空间数据传递
- linux 用户空间和内核空间数据传递
- Linux用户和组管理,查看软件缓存,通过命令查看硬件信息(cpu,版本,序列号,内存,主板,内核等)
- Linux用户空间与内核空间数据传递的几点理解和总结
- linux的时间管理(与驱动程序相关,非应用程序使用)内核和普通系统函数和使用c语言库的区别
- linux 内核进程与用户进程的通信 方法一 使用sockopt与内核交换数据
- 对Linux用户空间与内核空间数据传递的几点理解和总结(ZZ)
- linux 内核进程与用户进程的通信 方法一 使用sockopt与内核交换数据
- LINUX2.6内核中用户空间向驱动程序传递的内存大小最大为多少?
- linux 内核进程与用户进程的通信 方法一 使用sockopt与内核交换数据
- 使用navicat 8实现创建数据库和导入数据 管理用户与权限[图文方法]
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度
- linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问
- 使用 /sys 文件系统访问 Linux 内核:比/proc 更为理想的访问内核数据的途径
- 夺命雷公狗---linux NO:27 linux下的密码管理和用户切换以及sudo的使用
- linux 用户管理(3)----查看用户登录时间以及命令历史
- linux 内核学习之—定时器和时间管理
- linux驱动开发之字符设备--内核和用户空间数据的交换(ioctl)
- Linux内核架构 Linux设备驱动 Linux电源管理 Linux音频子系统 Linux中断子系统 Linux时间管理系统 Linux输入子系统
- 在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs