mmap映射内核层内存到用户层

dannys0302 2017-09-14 10:38:58
环境:ARM-Linux 3.1.0

内核模块中实现mmap调用,使用remap_pfn_range映射内存

现象:
1、映射的内核内存地址,为驱动模块中定义的全局变量,应用层读出数据为错误的,即映射错误
2、映射的内核内存地址,由kmalloc分配,使用GFP_KERNEL标志,应用层读出数据有时候正确,有时候错误,即错误的时候,卸载模块再重新加载(即kfree后再kmalloc),可能会映射成功
3、映射的内核内存地址,由kmalloc分配,使用GFP_HIGHUSER标志,映射成功,应用层读出数据正确,暂未发现失败情况

问题:
为什么只有使用GFP_HIGHUSER(GFP_USER不行),才能稳定的映射到正确的地址,读出正确的数据?看网上mmap使用范例,都是使用GFP_KERNEL来分配的。
...全文
675 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
KimenWu 2017-09-16
  • 打赏
  • 举报
回复
只能映射高端地址,remap函数里有判断。另外,可以使用remap_vmalloc_range,不过申请函数用vmalloc_user。 另外仔细看看LDD里的描述,怎么按页映射,讲得很清楚了
dannys0302 2017-09-14
  • 打赏
  • 举报
回复
另外,我判断过kmalloc和remap_pfn_range的返回值,是正常的

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧