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

                 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值