如何将Linux内核缓冲区映射到用户空间?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何将Linux内核缓冲区映射到用户空间?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1327字,纯文字阅读大概需要2分钟。
内容图文
![如何将Linux内核缓冲区映射到用户空间?](/upload/InfoBanner/zyjiaocheng/952/de7d481e4cf347dba95015957b8c72f0.jpg)
假设缓冲区是使用基于页面的方案分配的.实现mmap的一种方法是使用remap_pfn_range,但LDD3表示这对常规内存不起作用.看来我们可以通过使用SetPageReserved标记保留的页面来解决这个问题,以便它被锁定在内存中.但是并非所有内核内存都已经不可交换,即已经保留了吗?为什么需要明确设置保留位?
这是否与从HIGH_MEM分配的页面有关?
解决方法:
在mmap方法中从内核映射一组页面的最简单方法是使用错误处理程序映射页面.基本上你最终得到的结果如下:
static int my_mmap(struct file *filp, struct vm_area_struct *vma)
{
vma->vm_ops = &my_vm_ops;
return 0;
}
static const struct file_operations my_fops = {
.owner = THIS_MODULE,
.open = nonseekable_open,
.mmap = my_mmap,
.llseek = no_llseek,
};
(其他文件操作是模块需要的任何操作).同样在my_mmap中,您可以执行任何范围检查等以验证mmap参数.
然后vm_ops看起来像:
static int my_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
vmf->page = my_page_at_index(vmf->pgoff);
get_page(vmf->page);
return 0;
}
static const struct vm_operations_struct my_vm_ops = {
.fault = my_fault
}
你只需要找出传递给你的故障函数的给定vma / vmf哪个页面映射到用户空间.这取决于模块的确切工作方式.例如,如果你这样做了
my_buf = vmalloc_user(MY_BUF_SIZE);
然后你使用的页面会是这样的
vmalloc_to_page(my_buf + (vmf->pgoff << PAGE_SHIFT));
但是你可以轻松地创建一个数组并为每个条目分配一个页面,使用kmalloc,等等.
[只是注意到my_fault是一个有点迷人的函数名称]
内容总结
以上是互联网集市为您收集整理的如何将Linux内核缓冲区映射到用户空间?全部内容,希望文章能够帮你解决如何将Linux内核缓冲区映射到用户空间?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。