I have a Zynq system where logic in the PL generates a large block of data that needs to be written into PS RAM. In my naive thinking, I would use new
or malloc()
to get a pointer to allocated memory, then translate that pointer virtual address to a physical address.
有几个问题是错误的。 一种是,在我提出申请之前,记忆可能不存在。 另一个问题是,实际地址可能发生变化。 或许还有其他原因。
人民党希望写到同一地方,希望记忆能够存在,显然!
Here is what I ve tried (C++):
size_t length_in_bytes = 4096*8;
uint8_t * memBlockPtr;
const size_t page_boundary = 4096;
int retval = posix_memalign(reinterpret_cast<void**>(&memBlockPtr), page_boundary, length_in_bytes);
if (retval != 0)
{
perror("posix_memalign");
exit(1);
}
uint8_t * physAddr = nullptr;
physAddr = reinterpret_cast<uint8_t *>(mmap(reinterpret_cast<void*>(memBlockPtr),
length_in_bytes, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED, -1, 0));
if (physAddr == MAP_FAILED)
{
perror("mmap");
exit(1);
}
This fails with mmap: Bad file descriptor
.
在<代码>mmap()方面,我没有什么经验,但我们的运用确实利用这一方法,从PL的记忆空间绘制地图,进入应用记忆空间,而这正是我现在需要的。 此外,我很想知道是否有任何与切身有关的问题,就像PL写到缓冲时一样,从PS看,是否立即看到数据?
另有一件事——我在乌本巴托的PC工作站,而不是PetaHCH上持有上述代码。 尚未做好这项工作的准备。 我不知道我是否因不出现在实际平台上而错了。