首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/dev/mem上的mmap CMA区域

/dev/mem上的mmap CMA区域
EN

Stack Overflow用户
提问于 2014-01-21 11:13:09
回答 1查看 1.9K关注 0票数 2

我需要保留256-512兆的连续物理内存,并从用户空间访问这个内存。

我决定用CMA来预留内存。

以下是必须执行的关于我的想法的步骤:

  1. 在系统启动期间,CMA需要预留大量的内存量。
  2. 解析CMA补丁输出,例如:" CMA :保留256个MiB at 27400000“,并保存两个参数: CMA区域大小= 256*1024*1024字节和phys地址CMA区域= 0x27400000。
  3. 使用mmap()在/dev/mem文件上使用偏移量= 0x27400000映射CMA区域。(当然,CONFIG_STRICT_DEVMEM是禁用的)它可以让我直接从phys内存中从用户空间读取数据。

但是下一段代码会产生分段错误(那里的大小= 1Mb):

代码语言:javascript
复制
int file;
void* start;

file=open("/dev/mem", O_RDWR | O_SYNC);

if ( (start = mmap(0, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0x27400000)) == MAP_FAILED ){
    perror("mmap");
}

for (int offs = 0; offs<50; offs++){
    cout<<((char *)start)[offs];
}

此代码的输出:"mmap:无效参数“。

当我在0上更改偏移量= 0x27400000时,这段代码运行良好,程序显示垃圾。它也适用于许多偏移量,我查看了/proc/iomem。根据/proc/iomem提供的信息,CMA区的phys地址(我的系统上有0x27400000)总是位于系统RAM中。

有没有人有任何想法,如何在/dev/mem上映射CMA区域?我做错了什么?非常感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 08:25:47

这个问题的解决方案是由Jeff在内核新手邮件列表中向我提出的。

在CONFIG_x86_PAT中禁用.config是必要的,mmap()已经开始工作了!

如果配置了CONFIG_X86_PAT,那么将内存映射到用户空间会有问题。它基本上实现了与CONFIG_STRICT_DEVMEM相同的限制。 杰夫·哈兰

现在我可以在我想要的任何物理地址上映射/dev/mem。

但要小心:

警告之词。CONFIG_X86_PAT的推出可能是有原因的。虽然在我目前的测试中,关闭似乎并没有破坏任何东西,但在我的测试中,可能会有一些性能上的损失。 杰夫·哈兰

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21256467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档