Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46329
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-22 16:26
文章分类
文章存档

2016年(2)

2015年(4)

2014年(1)

我的朋友

分类: LINUX

2015-09-18 14:49:05

原文地址:用户内核无界访问 作者:lli_njupt

    所谓无界访问,就是0拷贝的访问,也即用户与内核空间同时直接访问同一内存区,说白了就是用户空间直接映射内核空间申请的内存(当然内核空间也可映射用户空间内存)这就增加了效率,通常情况下,比如proc或者socket都需要copy_from_user和copy_to_user,但是效率上将肯定要打折扣,毕竟涉及到内存页表的查找和数据的复制,而用户空间对内核空间的映射就完全解决了这个问题。
 
    但是考虑到内存同步使用的问题,如下情况:
    1.用户空间写内存==>告诉内核空间,数据写好了
    2.内核空间处理数据(比如加密,压缩,发送等等...)
    3.内核空间处理完毕==>告诉用户空间,数据处理完了,给我发新数据吧
    4.重复步骤1
 
    这就牵涉到一个用户空间和内核空间通信的过程,首先用户空间可以通过读写proc文件来通知内核,但是又不能让用户空间程序总是胡询(或许可以在内核空间对proc文件做某些处理,然后触发用户空间对应的fd上的select或者poll...),所以可以在内核需要通知进程时调用如下函数:

点击(此处)折叠或打开

  1. int send_sig(int sig, struct task_struct *p, int priv);

   用户空间只要对不同的信号安装不同的信号机制即可!

   内存映射的核心部分在于直接申请连续的整页内存,并通过proc系统传递给用户空间。

点击(此处)折叠或打开

  1. kernel_memaddr =__get_free_pages(GFP_KERNEL, PAGE_ORDER);
  2. SetPageReserved(virt_to_page(kernel_memaddr));

  
   当然对应的释放函数为:

点击(此处)折叠或打开

  1. ClearPageReserved(virt_to_page(kernel_memaddr));
  2.   free_pages(kernel_memaddr, PAGE_ORDER);

   可以发挥聪明才智,思考是否必须申请连续的页内存?

   一个完整的示例在附件 mmap.zip  中可以找到!

 


阅读(1711) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~