IOMMU:input/output memory management unit。Device的IOMMU類似於CPU的MMU。
要在64位系統上支援32位裝置,比如說網絡卡,如果沒有IOMMU,就需要在物理記憶體底端,也就是32位裝置能夠訪問到的地方設定一個叫做"bounce buffers"的東西,如果裝置要訪問高階記憶體,作業系統就要在高階記憶體和"bounce buffers"之間做一個複製。帶來的效能影響顯而易見。如果有了IOMMU,這個問題就迎刃而解了。在裝置驅動做DMA繫結的時候,系統返回給驅動的不再是物理地址,而是核心空間的某個地址(有的書上叫做匯流排地址),傳輸的時候,這個核心空間地址會經由IOMMU單元,IOMMU將這個地址轉換為物理地址。scatter/gather並不會帶來效能上的好處,但是會簡化裝置驅動程式。例如網絡卡驅動在傳送包的時候,DMA邦定後,系統可能會返回給裝置驅動多個不連續的物理地址,Solaris叫做cookie。這樣的話,每一個cookie都需要佔用一個傳送描述符。如果系統支援IOMMU的話,系統只會返回給裝置驅動一個cookie。當然了有專家提醒,因為這個原因,如果裝置驅動是在沒有IOMMU的情況下開發的,在支援IOMMU的系統上是沒有問題的。但反之不然。IOMMU除了上述功能外還加入了對虛擬化的支援。簡單來說有兩個功能,一個DMA Remapping, 另外一個是Interrupt Remapping。IOMMU在源於SUN公司的SPARC平臺,現在Intel平臺及AMD平臺也支援這一技術。
特麼說白了,就是硬體虛擬化!
IOMMU:input/output memory management unit。Device的IOMMU類似於CPU的MMU。
要在64位系統上支援32位裝置,比如說網絡卡,如果沒有IOMMU,就需要在物理記憶體底端,也就是32位裝置能夠訪問到的地方設定一個叫做"bounce buffers"的東西,如果裝置要訪問高階記憶體,作業系統就要在高階記憶體和"bounce buffers"之間做一個複製。帶來的效能影響顯而易見。如果有了IOMMU,這個問題就迎刃而解了。在裝置驅動做DMA繫結的時候,系統返回給驅動的不再是物理地址,而是核心空間的某個地址(有的書上叫做匯流排地址),傳輸的時候,這個核心空間地址會經由IOMMU單元,IOMMU將這個地址轉換為物理地址。scatter/gather並不會帶來效能上的好處,但是會簡化裝置驅動程式。例如網絡卡驅動在傳送包的時候,DMA邦定後,系統可能會返回給裝置驅動多個不連續的物理地址,Solaris叫做cookie。這樣的話,每一個cookie都需要佔用一個傳送描述符。如果系統支援IOMMU的話,系統只會返回給裝置驅動一個cookie。當然了有專家提醒,因為這個原因,如果裝置驅動是在沒有IOMMU的情況下開發的,在支援IOMMU的系統上是沒有問題的。但反之不然。IOMMU除了上述功能外還加入了對虛擬化的支援。簡單來說有兩個功能,一個DMA Remapping, 另外一個是Interrupt Remapping。IOMMU在源於SUN公司的SPARC平臺,現在Intel平臺及AMD平臺也支援這一技術。
特麼說白了,就是硬體虛擬化!