2012-06-05 56 views
1

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

这是系统的内存映射:

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); 

要测试的工作,我做一个简单的内存测试(内存测试)请求区域上。

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

  1. 我可以分配的内存的任意值和mmap的话,没有问题。当我使用memtest的一个小区域0x100字节时,测试运行成功。

  2. 当我分配更大的区域(0x1000,0x1_0000等)时,内核不会段故障,它会挂起!这种行为是否正常?

你能提出解决问题的方法吗?我甚至可以正确地制作它。

我的怀疑是任何小于一页记忆的东西都会起作用,而且比起那个东西更糟。我需要在内核中启用一项功能吗?

感谢您的关注。让我知道你是否需要更多信息。

RRS

回答

1

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

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

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