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函數。其他代碼無需改變。

發佈了14 篇原創文章 · 獲贊 13 · 訪問量 5659
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章