问题:
mmap成功返回一个地址,地址g_mmap_addr赋值给整数变量temp。
unsigned int temp;
unsigned int phy_addr = 0xA0000000;
void *g_mmap_addr;
g_fd = open("/dev/mem", O_RDWR | O_SYNC);
if (g_fd < 0)
{
debug("open fail,abort\n");
abort();
}
debug("open mem device succ, fd:%d\n", g_fd);
g_mmap_addr = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED ,g_fd, phy_addr);
debug("mmap , phy addr:%p, iomem ptr:%p\n", phy_addr, g_mmap_addr);
if (g_mmap_addr == MAP_FAILED)
{
debug("no memory\n");
close(g_fd);
abort();
}
debug("test 1:*%x = 0\n", g_mmap_addr);
*(unsigned int *)(g_mmap_addr) = 0;
debug("test 1 pass\n");
temp = (unsigned int )g_mmap_addr;
debug("test 2:*%x = 0\n", temp);
*(unsigned int *)(temp) = 0;
debug("test 2 pass\n");
同样对(unsigned int *)temp和g_mmap_addr地址赋值,(unsigned int *)temp赋值就出错,只是写法不同,报错了,百思不得其解。
root@pynq:~/sdk# ./app
Target C210 On
C210:start section:
C210:open mem device succ, fd:3
C210:mmap , phy addr:0xa0000000, iomem ptr:0x7f9306b000
C210:test 1:*9306b000 = 0
C210:test 1 pass
C210:test 2:*9306b000 = 0
Segmentation fault (core dumped)
猜测
猜测是打印问题,把%x打印变成%p,%p是针对指针的输出打印。
debug("test 1:*%p = 0\n", g_mmap_addr);
*(unsigned int *)(g_mmap_addr) = 0;
debug("test 1 pass\n");
temp = (unsigned int )g_mmap_addr;
debug("test 2:*%p = 0\n", temp);
*(unsigned int *)(temp) = 0;
debug("test 2 pass\n");
打印,发现地址并不相同,一个是0x7f8eec3000,另一个是0x8eec3000。
root@pynq:~/sdk# ./app
Target C210 On
C210:start section:
C210:open mem device succ, fd:3
C210:mmap , phy addr:0xa0000000, iomem ptr:0x7f8eec3000
C210:test 1:*0x7f8eec3000 = 0
C210:test 1 pass
C210:test 2:*0x8eec3000 = 0
Segmentation fault (core dumped)
分析
我的开发板是64位
SMP Mon Apr 25 05:31:58 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
打印一下指针大小和整型大小
unsigned int a;
void *p;
unsigned long l;
printf("size int:%d\n", sizeof(a));
printf("size ptr:%d\n", sizeof(p));
printf("size long:%d\n",sizeof(l));
root@pynq:~/sdk# ./a.out
size int:4
size ptr:8
size long:8
64位的机器,指针大小是8字节,整型int是4字节,当指针赋值给整型就会丢失高4字节数据。long长度位8,指针给long型赋值,就不会丢失数据。重新修改temp类型为long。
unsigned long temp;
unsigned int phy_addr = 0xA0000000;
void * g_mmap_addr;
g_fd = open("/dev/mem", O_RDWR | O_SYNC);
if (g_fd < 0)
{
debug("open fail,abort\n");
abort();
}
debug("open mem device succ, fd:%d\n", g_fd);
g_mmap_addr = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED ,g_fd, phy_addr);
debug("mmap , phy addr:%p, iomem ptr:%p\n", phy_addr, g_mmap_addr);
if (g_mmap_addr == MAP_FAILED)
{
debug("no memory\n");
close(g_fd);
abort();
}
debug("test 1:*%p = 0\n", g_mmap_addr);
*(unsigned long *)(g_mmap_addr) = 0;
debug("test 1 pass\n");
temp = (unsigned long )g_mmap_addr;
debug("test 2:*%p = 0\n", temp);
*(unsigned long *)(temp) = 0;
debug("test 2 pass\n");
root@pynq:~/sdk# ./app
Target C210 On
C210:start section:
C210:open mem device succ, fd:3
C210:mmap , phy addr:0xa0000000, iomem ptr:0x7fbf28c000
C210:test 1:*0x7fbf28c000 = 0
C210:test 1 pass
C210:test 2:*0x7fbf28c000 = 0
C210:test 2 pass
PASS!!