64位指针赋值遇到的问题

问题:

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!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值