2

我正在为使用 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 等)时,内核不会出现段错误,它会挂起!这种行为正常吗?

你能建议解决这个问题的方法吗?我什至正确地映射它。

我的怀疑是任何小于一页内存的东西都可以工作,而更多的东西会严重搞砸。我需要在内核中启用某个功能吗?

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

RRS

4

1 回答 1

2

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

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

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

于 2012-06-07T15:51:46.357 回答