Linux系统mmap函数映射物理地址

Linux系统mmap函数映射物理地址

代码

在某些特殊情况下,我们只是想要读取某个寄存器的值或者某个地址的值,不需要去专门写一个驱动模块来实现,可以使用mmap函数配合/dev/mem设备来把物理地址映射到虚拟地址中。
代码中,mmap参数0,代表让系统分配地址(映射的地址)。0x1000为映射区域大小,BASE_ADDR为想要映射的物理地址,CPLD_VER_BCD等是相对于BASE_ADDR的偏移量。

/*read physical address*/
/*author:LK*/
int open_phy_addr()
{
	int map_fd = open("/dev/mem", O_RDWR);
	if(map_fd < 0)
		{
			printf("cannot open /dev/mem.\n");
			return -1;
		}
	void *start = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED, map_fd, (BASE_ADDR));
	
	
	if(start == MAP_FAILED)
		{
			printf("mmap failed!\n");
			return -1;
		}

	//printf("start:0x%x\t\n",start);
	printf("BCD:\t");
	printf("%04x,", *(uint *)(start+CPLD_VER_BCD));
	printf("\n");

	
	printf("B0 :\t");
	printf("%04x,", *(uint *)(start+SEC_CODE_B0));
	printf("\n");

	
	printf("B1 :\t");
	printf("%04x,", *(uint *)(start+SEC_CODE_B1));
	printf("\n");

	
	printf("B2 :\t");
	printf("%04x,", *(uint *)(start+SEC_CODE_B2));
	printf("\n");

	
	printf("B3 :\t");
	printf("%04x,", *(uint *)(start+SEC_CODE_B3));
	printf("\n");

	
	if(munmap(start, 0x1000) == -1)
		{
			printf("munmap error!\n");
			return -1;
		}
	close(map_fd);
	return 0;
}

64位报错

当使用mmap函数在一块板卡上映射物理地址时,始终报错。最终发现mmap函数仅支持32位地址。需要使用mmap64来代替mmap函数。其他代码无需改变。

发布了9 篇原创文章 · 获赞 11 · 访问量 2063

猜你喜欢

转载自blog.csdn.net/u013281532/article/details/103870790