所谓无界访问,就是0拷贝的访问,也即用户与内核空间同时直接访问同一内存区,说白了就是用户空间直接映射内核空间申请的内存(当然内核空间也可映射用户空间内存)这就增加了效率,通常情况下,比如proc或者socket都需要copy_from_user和copy_to_user,但是效率上将肯定要打折扣,毕竟涉及到内存页表的查找和数据的复制,而用户空间对内核空间的映射就完全解决了这个问题。
但是考虑到内存同步使用的问题,如下情况:
1.用户空间写内存==>告诉内核空间,数据写好了
2.内核空间处理数据(比如加密,压缩,发送等等...)
3.内核空间处理完毕==>告诉用户空间,数据处理完了,给我发新数据吧
4.重复步骤1
这就牵涉到一个用户空间和内核空间通信的过程,首先用户空间可以通过读写proc文件来通知内核,但是又不能让用户空间程序总是胡询(或许可以在内核空间对proc文件做某些处理,然后触发用户空间对应的fd上的select或者poll...),所以可以在内核需要通知进程时调用如下函数:
- int send_sig(int sig, struct task_struct *p, int priv);
用户空间只要对不同的信号安装不同的信号机制即可!
内存映射的核心部分在于直接申请连续的整页内存,并通过proc系统传递给用户空间。
- kernel_memaddr =__get_free_pages(GFP_KERNEL, PAGE_ORDER);
- SetPageReserved(virt_to_page(kernel_memaddr));
当然对应的释放函数为:
- ClearPageReserved(virt_to_page(kernel_memaddr));
- free_pages(kernel_memaddr, PAGE_ORDER);
可以发挥聪明才智,思考是否必须申请连续的页内存?
一个完整的示例在附件 mmap.zip 中可以找到!
阅读(1428) | 评论(0) | 转发(0) |