C - 使用mmap访问内存

时间:2015-03-25 08:13:13

标签: c linux memory embedded-linux mmap

我有一个327680字符的hex文件,我在ARM linux系统的内存上写入物理地址0x30000000 - 0x3004FFFF。

从内存中读回时,我从起始地址读取64170个字符后得到段错误,即0x3000FAAA。 如果我将起始地址更改为0x3000FA64,那么我也会在64170个字符后得到段错误。

如果数据>我如何确保正确访问数据? 4kB(页面大小)?

我无法理解确切的问题,所以我在下面添加了我的代码片段:

#define MAX_RANGE 327679

int fd;
FILE* fd_table=NULL;
unsigned long int count = 0 ;
void * mem;
void * aligned_vaddr;
unsigned long aligned_paddr;
uint32_t aligned_size;
unsigned long int addr_phys;

uint8_t *addr;
int g_size = 1;
unsigned long int g_paddr = 0x30000000; //Starting physical address

while((count<MAX_RANGE)){
  g_paddr = addr_phys;
  g_paddr &= ~(g_size - 1);

  aligned_paddr = g_paddr & ~(4096 - 1);
  aligned_size = g_paddr - aligned_paddr + (g_count * g_size);
  aligned_size = (aligned_size + 4096 - 1) & ~(4096 - 1);

  /* Align address to access size */
  aligned_vaddr = mmap(NULL, aligned_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, aligned_paddr);
  if (aligned_vaddr == NULL) {
    printf("Error mapping address\n");
    close(fd);
    return 1;
  }

  mem = (void *)((uint32_t)aligned_vaddr + (g_paddr - aligned_paddr));
  addr = mem;
  fprintf(fd_table, "%02X\n",addr[0]);
  addr_phys +=1; //Increment byte address
  count++;
}

注意: 1.写入过程中没有错误,我通过查看memtool的段错误地址进行了验证。 2.系统不使用地址0x30000000(我确保在u-boot中)。

0 个答案:

没有答案