从Linux迁移至Green Hills Integrity RTOS:物理内存映射实现问询
Green Hills Integrity RTOS中物理内存映射至虚拟内存的实现方法
背景与需求
需将原Linux环境下的代码迁移至Green Hills Integrity实时操作系统(RTOS),核心需求为:访问PCI设备基地址寄存器(BAR)对应的物理内存,将其映射为虚拟内存后完成寄存器读写操作。
Linux下的实现代码
fd = open("/dev/mem", O_RDONLY); void * virt_addr = mmap(NULL, 0x20000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, physical_addr); int32_t register_access = ((UINT8 *)virt_addr + 0x2000);
注:
physical_addr为PCI基地址寄存器(BAR)的物理地址。
VxWorks下已完成的实现代码
/* lookup table idx 0 */ ret = idt_ntb_peer_mw_get_addr(&ndev->ntb, 0, &ndev->outMemAddr, &ndev->sizeMapReg); ret = devMemCreate("/sw2NTB1Cfg", 0, (PHYS_ADDR)ndev->outMemAddr, ndev->sizeMapReg, MMU_ATTR_SUP_RW | MMU_ATTR_USR_RW | MMU_ATTR_VALID | MMU_ATTR_CACHE_OFF); /* Opening device memory */ fd = devMemOpen("/sw2NTB1Cfg", O_RDWR, S_IRWXU); /* mapping physical to virtual using mmap */ ndev->sw2Ntb1regAddr = mmap(0, 0x200000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); /* Accessing SW2 NTB device id(offset = 0x2000) using this addr */ memcpy(&data, (UINT8 *)ndev->sw2Ntb1regAddr + reg, 4); // reg is offset
问题
如何在Green Hills Integrity RTOS中实现上述相同的物理内存映射及寄存器访问功能?
内容的提问来源于stack exchange,提问作者Rajat Dongre
相关产品推荐
相关产品推荐

