1、mmap系統調用的實現過程,該系統調用直接將設備內存映射到用戶進程的地址空間。
2、用戶空間內存如何映射到內核中(get_user_pages)。
3、直接內存訪問(DMA),他使得外設具有直接訪問系統內存的能力。
linux中地址類型:用戶虛擬地址、內核虛擬地址、內核邏輯地址(與物理地址是線性關系)、物理地址
用戶空間與內核空間:內核將4G的虛擬地址空間分割為用戶空間與內核空間;在二者的上下文中使用同樣的映射。內核無法操作沒有映射到內核地址空間的內存。在內核地址中有一塊地址空間專門用于用戶空間到內核的虛擬映射。
低端內存:存在于內核空間上的邏輯內存地址。
高端內存:是指那些不存在邏輯地址的內存。
內核中處理內存的函數趨向使用指向page結構的指針,該數據結構用來保存內核需要的所有物理內存的信息
頁表:處理器使用頁表將虛擬地址轉換為相應的物理地址。
虛擬內存區(VMA):用于管理進程地址空間中不同區域的內核數據結構。每個進程在編譯、鏈接后形成的映象文件有一個代碼段、數據段、還有堆棧段(如下圖1所示),所有一個內存映射(至少)包含下面這些區域:
1)程序的可執行代碼區域
2)多個數據區,其中包括初始化數據區、非初始化數據區及程序堆棧。
3)與每個活動的內存映射對應的區域
圖1(進程虛擬空間的劃分)
通常,進程所使用到的虛存空間不連續,且各部分虛存空間的訪問屬性也可能不同。所以一個進程的虛存空間需要多個vm_area_struct結構來描述。
在vm_area_struct結構的數目較少的時候,各個vm_area_struct按照升序排序,以單鏈表的形式組織數據(通過vm_next指針指向下一個vm_area_struct結構)。但是當vm_area_struct結構的數據較多的時候,仍然采用鏈表組織的化,勢必會影響到它的搜索速度。針對這個問題,vm_area_struct還添加了vm_avl_hight(樹高)、vm_avl_left(左子節點)、vm_avl_right(右子節點)三個成員來實現AVL樹,以提高vm_area_struct的搜索速度。
假如該vm_area_struct描述的是一個文件映射的虛存空間,成員vm_file便指向被映射的文件的file結構,vm_pgoff是該虛存空間起始地址在vm_file文件里面的文件偏移,單位為物理頁面。
圖2 進程虛擬地址示意圖
mmap系統調用所完成的工作就是準備這樣一段虛存空間,并建立vm_area_struct結構體,將其傳給具體的設備驅動程序,這些都是由內核完成。
用戶空間進程調用mmap將設備內存映射到他的地址空間時,系統通過創建一個表示該映射的新VMA作為響應,支持mmap的驅動程序,需要幫助進程完成VMA的初始化。
新聞熱點
疑難解答