- 论坛徽章:
- 0
|
本帖最后由 Solaris12 于 2010-09-06 14:58 编辑
伙计,谢谢你的回复,但是很遗憾我觉得你猜错了
引用<<Essential.Linux.Device.Drivers>>
void *pci_alloc_consistent(struct pci_dev *pdev,
size_t size,
dma_addr_t *dma_handle);
This function allocates a DMA buffer, generates its bus address, and returns the associated kernel virtual address. The first two arguments respectively hold the PCI device structure (which is discussed later) and the size of the requested DMA buffer. The third argument, dma_handle, is a pointer to the bus address that the function call generates
在《PCI Express体系机构导读》P329种,进行DMA操作的地址是PCI设备使用的,而且这个地址只能是PCI总线的物理地址,尽管在x86中,存储器域物理地址到PCI总线域物理地址的转换非常简单,是直接相等的关系,仅仅是数值相同,但是两者的意义是完全不同的
显然不是host memory地址而是PCI总线地址
我之前没有猜错,只不过没有考虑有IOMMU的情况。
在有IOMMU的时候,是总线地址。在没有IOMMU的时候是Host memory的虚拟地址。
在有IOMMU的时候,总线地址的空间其实是从IOMMU的页表里拿的,而这个地址是否是4G以上取决于IOMMU的能力,而且这个总线地址对应的地址还是host memory物理地址,这是完全和PCI内存空间BAR寄存器没有什么关系的。
而且,这个接口看起来和Solaris的接口思想差不多。 |
|