gpt4 book ai didi

linux - mmap 搞砸了 - 导致内核挂起

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:55 25 4
gpt4 key购买 nike

我正在为使用 Microblaze 作为处理器的嵌入式板构建应用程序。我为此交叉编译了 Linux。该板有 512 MB 内存,但内核只知道其中的 256 MB(DDR3 的下半部分)。

这是系统的内存映射:

0x4000_0000 to 0x5FFF_FFFF -> Physical range of DDR3 (verified with cat /proc/meminfo)
0x4000_0000 to 0x4FFF_FFFF -> Known to linux and used by the kernel
0x5000_0000 to 0x5FFF_FFFF -> Mmaped using "/dev/mem" for my application

我必须能够直接访问 DDR 中的某个区域,特别是 DDR 的第二部分。所以我写了一个这样的mmap物理内存的应用程序:

typedef struct 
{
int fd; // File descriptor
unsigned long *hw_addr; // Hardware base address
unsigned long *vaddr; // Virtual address pointer
unsigned long memsize; // Size of physical region
off_t page_offset;
off_t page_address;
off_t page_size;
} mem_region_t ;

mem->vaddr = (unsigned long *) mmap(0,
mem->memsize,
PROT_READ|PROT_WRITE,
MAP_SHARED,
mem->fd,
mem->page_address);

为了测试工作情况,我正在对请求的区域进行简单的内存测试 (memtest)。

以下是我注意到的一些问题:

  1. 我可以分配任意数量的内存并映射它,没问题。当我为 memtest 使用一个小区域 0x100 字节时,测试运行成功。

  2. 当我分配更大的区域(0x1000、0x1_0000 等)时,内核没有出现段错误,而是挂起!这种行为正常吗?

您能建议解决该问题的方法吗?我什至正确映射它了吗?

我怀疑任何小于一页内存的东西都可以工作,而超过那页的东西就会严重出错。我需要在内核中启用某个功能吗?

感谢您的关注。如果您需要更多信息,请告诉我。

资源共享

最佳答案

好的...所以我解决了这个问题。

我看到内核没有足够的页面供我工作。所以我使用“memmap”创建了一个禁区(参见内核参数)。这让我可以使用上面提到的 mmap。

它似乎适用于大量连续物理内存的分配。

关于linux - mmap 搞砸了 - 导致内核挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10905593/

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