2012-06-05 36 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。

它似乎適用於連續物理內存的大量分配。