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