我正在为使用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)。
以下是我注意到的一些问题:
我可以分配任意数量的内存并对其进行mmap,没问题。当我使用0x100字节的小区域作为memtest时,测试成功运行。
当我分配更大的区域(0x1000,0x1_0000等)时,内核不会出现段错误,它会挂起!!这种行为是否正常?
您能建议解决问题的方法吗?我甚至正确地将它映射到了它。
我怀疑任何小于一页记忆的东西都会起作用而且不止于此。我是否需要在内核中启用某项功能?
感谢您的关注。如果您需要更多信息,请告诉我。
RRS
答案 0 :(得分:1)
好的......所以我解决了这个问题。
我看到内核没有足够的页面供我工作。所以我使用“memmap”创建了一个禁区(参见内核参数)。这允许我使用上面提到的mmap。
它似乎适用于连续物理内存的大量分配。