我有一个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中)。