gpt4 book ai didi

linux - mmap CMA 区域 on/dev/mem

转载 作者:太空狗 更新时间:2023-10-29 12:17:00 26 4
gpt4 key购买 nike

我需要保留 256-512 Mb 的连续物理内存,并且可以从用户空间访问此内存。
我决定使用 CMA 来保留内存。
以下是我的想法必须执行的步骤:

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

但下一段代码会导致段错误(大小 = 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 上更改 offset = 0x27400000 时,此代码运行良好并且程序显示垃圾。它也适用于我在/proc/iomem 中查看的许多偏移量。根据来自/proc/iomem 的信息,CMA 区域的物理地址(在我的系统上为 0x27400000)始终位于系统 RAM 中。

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

最佳答案

Jeff Haran 在 kernelnewbies 邮件列表中向我建议了这个问题的解决方案。
有必要在 .config 中禁用 CONFIG_x86_PAT 并且 mmap() 已开始工作!

If CONFIG_X86_PAT is configured you will have problems mapping memory to user space. It basically implements the same restrictions as CONFIG_STRICT_DEVMEM.
Jeff Haran

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

Word of caution. CONFIG_X86_PAT was likely introduced for a reason. There may be some performance penalties for turning this off, though in my testing so far turning if off doesn’t seem to break anything.
Jeff Haran

关于linux - mmap CMA 区域 on/dev/mem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21256467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com