1. 程式人生 > >Linux記憶體對映——mmap

Linux記憶體對映——mmap

四 總結

1.對於mmap的記憶體對映,是將實體記憶體對映到程序的虛擬地址空間中去,那麼程序對檔案的訪問就相當於直接對記憶體的訪問,從而加快了讀寫操作的效率。在這裡,remap_pfn_range函式是一次性的建立頁表,而nopage函式是根據page fault產生的程序虛擬地址去找到核心相對應的邏輯地址,再通過這個邏輯地址去找到page。完成對映過程。remap_pfn_range不能對常規記憶體對映,只能對保留的記憶體與實體記憶體之外的進行對映。

2.在這裡,要分清幾個地址,一個是實體地址,這個很簡單,就是實體記憶體的實際地址。第二個是核心虛擬地址,即核心可以直接訪問的地址,如kmalloc,vmalloc等核心函式返回的地址,kmalloc返回的地址也稱為核心邏輯地址。核心虛擬地址與實際的實體地址只有一個偏移量。第三個是程序虛擬地址,這個地址處於使用者空間。而對於mmap函式對映的是實體地址到程序虛擬地址,而不是把實體地址對映到核心虛擬地址。而ioremap函式是將實體地址對映為核心虛擬地址。

3.使用者空間的程序呼叫mmap函式,首先進行必要的處理,生成vma結構體,然後呼叫remap_pfn_range函式建立頁表。而使用者空間的mmap函式返回的是對映到程序地址空間的首地址。所以mmap函式與remap_pfn_range函式是不同的,前者只是生成mmap,而建立頁表通過remap_pfn_range函式來完成。