我需要保留256-512兆的连续物理内存,并从用户空间访问这个内存。
我决定用CMA来预留内存。
以下是必须执行的关于我的想法的步骤:
但是下一段代码会产生分段错误(那里的大小= 1Mb):
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区域?我做错了什么?非常感谢您的帮助!
发布于 2014-01-22 08:25:47
这个问题的解决方案是由Jeff在内核新手邮件列表中向我提出的。
在CONFIG_x86_PAT中禁用.config是必要的,mmap()已经开始工作了!
如果配置了CONFIG_X86_PAT,那么将内存映射到用户空间会有问题。它基本上实现了与CONFIG_STRICT_DEVMEM相同的限制。 杰夫·哈兰
现在我可以在我想要的任何物理地址上映射/dev/mem。
但要小心:
警告之词。CONFIG_X86_PAT的推出可能是有原因的。虽然在我目前的测试中,关闭似乎并没有破坏任何东西,但在我的测试中,可能会有一些性能上的损失。 杰夫·哈兰
https://stackoverflow.com/questions/21256467
复制相似问题