我正在爲使用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);
要測試的工作,我做一個簡單的內存測試(內存測試)請求區域上。
下面是一些我注意到的問題:
我可以分配的內存的任意值和mmap的話,沒有問題。當我使用memtest的一個小區域0x100字節時,測試運行成功。
當我分配更大的區域(0x1000,0x1_0000等)時,內核不會段故障,它會掛起!這種行爲是否正常?
你能提出解決問題的方法嗎?我甚至可以正確地製作它。
我的懷疑是任何小於一頁記憶的東西都會起作用,而且比起那個東西更糟。我需要在內核中啓用一項功能嗎?
感謝您的關注。讓我知道你是否需要更多信息。
RRS