dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。如果没有特殊情况,会调用dma_direct_map_page()、dma_direct_unmap_page()。 arm64的特殊情况包括iommu和Xen虚拟机。 iommu和Xen虚拟机都需要提供dma_map_ops,于是使用其中的map、unmap函数。iommu的dma_map_ops是drivers\iommu\D...
DMA_TO_DEVICE : DMA_FROM_DEVICE); DMA_TO_DEVICE从内存搬移数据到device,DMA_FROM_DEVICE从device搬移数据到内存 return 0; } dma_map_single—》dma_map_single_attrs—》dma_map_single—》ops-\>map_page-》__swiotlb_map_page static dma_addr_t \__swiotlb_map_page(struct device \*dev, struct...
dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。如果没有特殊情况,会调用dma_direct_map_page()、dma_direct_unmap_page()。 arm64的特殊情况包括iommu和Xen虚拟机。 iommu和Xen虚拟机都需要提供dma_map_ops,于是使用其中的map、unmap函数。iommu的dma_map_ops是drivers\iommu\D...
dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。如果没有特殊情况,会调用dma_direct_map_page()、dma_direct_unmap_page()。 arm64的特殊情况包括iommu和Xen虚拟机。 iommu和Xen虚拟机都需要提供dma_map_ops,于是使用其中的map、unmap函数。iommu的dma_map_ops是drivers\iommu\D...
dma_map_single()和dma_unmap_single()都在include\linux\dma-mapping.h里定义。如果没有特殊情况,会调用dma_direct_map_page()、dma_direct_unmap_page()。 arm64的特殊情况包括iommu和Xen虚拟机。 iommu和Xen虚拟机都需要提供dma_map_ops,于是使用其中的map、unmap函数。iommu的dma_map_ops是drivers\iommu\D...
在内核进行page初始化以及mmu配置之前,首先需要知道整个memory map。 1. ARM Memory Layout PAGE_OFFSET Start address of Kernel space 0xC000_0000 lowmem Kernel direct-mapped RAM region (1:1 mapping) Maximum 896M HIGH_MEMORY End address of lowmem ...
在内核进行page初始化以及mmu配置之前,首先需要知道整个memory map。 1. ARM Memory Layout PAGE_OFFSET Start address of Kernel space 0xC000_0000 lowmem Kernel direct-mapped RAM region (1:1 mapping) Maximum 896M HIGH_MEMORY End address of lowmem PAGE_OFFSET + MEMORY_SIZE pkmap 用来把HI...
但如上所述,DMA mapping和VFIO使用场景中,设备的ASID和VMID与CPU并不共享。设备的SMMU TLB中具有同样ASID,VMID的TLB项不应该受到CPU发过来的TLBI broadcast的影响。实际上,SMMU driver会设置CD.ASET, [47] ASET ASIDSet. Selects typeforASID, between setssharedandnon-sharedwithPE ASIDs. This flag affects ...
ffff000008a50000 r arm64_swiotlb_dma_ops ffff000008a50000 R vdso_end 例:驱动使用ops的map_page函数: [ 421.258031] dump_backtrace+0x0/0x1b8 [ 421.265029] show_stack+0x24/0x30 [ 421.271647] dump_stack+0x90/0xb4 [ 421.278219] __swiotlb_map_page+0x60/0xf0 [ 421.285523] e1000_alloc_rx...
smmu的重要的用来dma地址翻译的数据结构都是放在内存中的,由smmu的寄存器保存着这些表在内存中的基地址,首先就是Stream Ta ble (STE),这ste 表既包含stage1的翻译表结构也包含stage2的翻译结构,所谓stage1负责VA 到 PA的转换,stage2负责 IPA 到PA的转换。