freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

linux內(nèi)存管理以程序員視角-資料下載頁(yè)

2025-07-21 16:55本頁(yè)面
  

【正文】 地址被 4k 大小的空閑區(qū)間隔,以防止越界 見(jiàn)下圖 )。與進(jìn)程虛擬地址的特性一樣,這些虛擬地址與物理內(nèi)存沒(méi)有簡(jiǎn)單的位移關(guān)系,必須通過(guò)內(nèi)核頁(yè)表才可轉(zhuǎn)換為物理地址或物理頁(yè)。它們有可能尚未被映射,在發(fā)生缺頁(yè)時(shí)才真正分配物理頁(yè)面。 這里給出一個(gè)小程序幫助大家認(rèn)清上面幾種分配函數(shù)所對(duì)應(yīng)的區(qū)域。 includelinux/ includelinux/ includelinux/ unsigned char*pagemem; unsigned char*kmallocmem; unsigned char*vmallocmem; int init_modulevoid { pagemem=get_free_page0; printk1 pagemem=%s,pagemem; kmallocmem=kmalloc100,0; printk1 kmallocmem=%s,kmallocmem; vmallocmem=vmalloc 1000000; printk1 vmallocmem=%s,vmallocmem; } void cleanup_modulevoid { free_pagepagemem; kfreekmallocmem; vfreevmallocmem; } 實(shí)例 內(nèi)存映射 (mmap)是 Linux 操作系統(tǒng)的一個(gè)很大特色,它可以將系統(tǒng)內(nèi)存映射到一個(gè)文件 (設(shè)備 )上,以便可以通過(guò)訪問(wèn)文件內(nèi)容來(lái)達(dá)到訪問(wèn)內(nèi)存的目的。這樣做的最大好處是提高了內(nèi)存訪問(wèn)速度,并且可以利用文件系統(tǒng)的接口編程(設(shè)備在 Linux 中作為特殊文件處理 )訪問(wèn)內(nèi)存,降低了開(kāi)發(fā)難度。許多設(shè)備驅(qū)動(dòng)程序便是利用內(nèi)存映射功能將用 戶空間的一段地址關(guān)聯(lián)到設(shè)備內(nèi)存上,無(wú)論何時(shí),只要內(nèi)存在分配的地址范圍內(nèi)進(jìn)行讀寫,實(shí)際上就是對(duì)設(shè)備內(nèi)存的訪問(wèn)。同時(shí)對(duì)設(shè)備文件的訪問(wèn)也等同于對(duì)內(nèi)存區(qū)域的訪問(wèn),也就是說(shuō),通過(guò)文件操作接口可以訪問(wèn)內(nèi)存。 Linux 中的 X服務(wù)器就是一個(gè)利用內(nèi)存映射達(dá)到直接高速訪問(wèn)視頻卡內(nèi)存的例子。 熟悉文件操作的朋友一定會(huì)知道 file_operations 結(jié)構(gòu)中有 mmap 方法,在用戶執(zhí)行 mmap 系統(tǒng)調(diào)用時(shí),便會(huì)調(diào)用該方法來(lái)通過(guò)文件訪問(wèn)內(nèi)存 不過(guò)在調(diào)用文件系統(tǒng) mmap 方法前,內(nèi)核還需要處理分配內(nèi)存區(qū)域 (vma_struct)、建立頁(yè)表等工作。對(duì)于具體映射細(xì)節(jié)不作介紹了,需要強(qiáng)調(diào)的是 ,建立頁(yè)表可以采用remap_page_range 方法一次建立起所有映射區(qū)的頁(yè)表,或利用 vma_struct 的nopage 方法在缺頁(yè)時(shí)現(xiàn)場(chǎng)一頁(yè)一頁(yè)的建立頁(yè)表。第一種方法相比第二種方法簡(jiǎn)單方便、速度快,但是靈活性不高。一次調(diào)用所有頁(yè)表便定型了,不適用于那些需要現(xiàn)場(chǎng)建立頁(yè)表的場(chǎng)合 比如映射區(qū)需要擴(kuò)展或下面我們例子中的情況。 我們這里的實(shí)例希望利用內(nèi)存映射,將系統(tǒng)內(nèi)核中的一部分虛擬內(nèi)存映射到用戶空間,以供應(yīng)用程序讀取 你可利用它進(jìn)行內(nèi)核空間到用戶空間的大規(guī)模信息 傳輸。因此我們將試圖寫一個(gè)虛擬字符設(shè)備驅(qū)動(dòng)程序,通過(guò)它將系統(tǒng)內(nèi)核空間映射到用戶空間 將內(nèi)核虛擬內(nèi)存映射到用戶虛擬地址。從上一節(jié)已經(jīng)看到 Linux 內(nèi)核空間中包含兩種虛擬地址:一種是物理和邏輯都連續(xù)的物理內(nèi)存映射虛擬地址;另一種是邏輯連續(xù)但非物理連續(xù)的 vmalloc 分配的內(nèi)存虛擬地址。我們的例子程序?qū)⒀菔景?vmalloc 分配的內(nèi)核虛擬地址映射到用戶地址空間的全過(guò)程。 程序里主要應(yīng)解決兩個(gè)問(wèn)題: 第一是如何將 vmalloc 分配的內(nèi)核虛擬內(nèi)存正確地轉(zhuǎn)化成物理地址 ? 因?yàn)閮?nèi)存映射先要獲得被映射的物理地址,然后才能將 其映射到要求的用戶虛擬地址上。我們已經(jīng)看到內(nèi)核物理內(nèi)存映射區(qū)域中的地址可以被內(nèi)核函數(shù)virt_to_phys 轉(zhuǎn)換成實(shí)際的物理內(nèi)存地址,但對(duì)于 vmalloc 分配的內(nèi)核虛擬地址無(wú)法直接轉(zhuǎn)化成物理地址,所以我們必須對(duì)這部分虛擬內(nèi)存格外 照顧 先將其轉(zhuǎn)化成內(nèi)核物理內(nèi)存映射區(qū)域中的地址,然后在用 virt_to_phys 變?yōu)槲锢淼刂贰? 轉(zhuǎn)化工作需要進(jìn)行如下步驟: a)找到 vmalloc 虛擬內(nèi)存對(duì)應(yīng)的頁(yè)表,并尋找到對(duì)應(yīng)的頁(yè)表項(xiàng)。 b)獲取頁(yè)表項(xiàng)對(duì)應(yīng)的頁(yè)面指針 c)通過(guò)頁(yè)面得到對(duì)應(yīng)的內(nèi)核物理內(nèi)存映射區(qū)域地址。 如下圖所 示: 第二是當(dāng)訪問(wèn) vmalloc 分配區(qū)時(shí),如果發(fā)現(xiàn)虛擬內(nèi)存尚未被映射到物理頁(yè),則需要處理 缺頁(yè)異常 。因此需要我們實(shí)現(xiàn)內(nèi)存區(qū)域中的 nopaga 操作,以能返回被映射的物理頁(yè)面指針,在我們的實(shí)例中就是返回上面過(guò)程中的內(nèi)核物理內(nèi)存映射區(qū)域中的地址。由于 vmalloc 分配的虛擬地址與物理地址的對(duì)應(yīng)關(guān)系并非分配時(shí)就可確定,必須在缺頁(yè)現(xiàn)場(chǎng)建立頁(yè)表,因此這里不能使用remap_page_range 方法,只能用 vma 的 nopage 方法一頁(yè)一頁(yè)的建立。 程序組成 ,它是以模塊形式加載的虛擬字符驅(qū)動(dòng)程序。該驅(qū)動(dòng)負(fù)責(zé)將一定長(zhǎng)的內(nèi)核虛擬地址 (vmalloc 分配的映射到設(shè)備文件上。其中主要的函數(shù)有vaddress_to_kaddress()負(fù)責(zé)對(duì) vmalloc 分配的地址進(jìn)行頁(yè)表解析 ,以找到對(duì)應(yīng)的內(nèi)核物理映射地址 (kmalloc 分配的地址 ); map_nopage 負(fù)責(zé)在進(jìn)程訪問(wèn)一個(gè)當(dāng)前并不存在的 VMA 頁(yè)時(shí),尋找該地址對(duì)應(yīng)的物理頁(yè),并返回該頁(yè)的指針。 它利用上述驅(qū)動(dòng)模塊對(duì)應(yīng)的設(shè)備文件在用戶空間讀取讀取內(nèi)核內(nèi)存。結(jié)果可以看到內(nèi)核虛擬地址的內(nèi)容 (ok! ),被顯示在了屏幕上。 執(zhí)行步驟 編譯 為 模塊 ,具體參數(shù)見(jiàn) Makefile 加載模塊 生成對(duì)應(yīng)的設(shè)備文件 1在 /proc/devices 下找到 map_driver 對(duì)應(yīng)的設(shè)備命和設(shè)備號(hào):grepmapdrv/proc/devices 2 建立設(shè)備文件 mknodmapfile c254 0(在我的系統(tǒng)里設(shè)備號(hào)為 254 利用 maptest 讀取 mapfile 文件,將取自內(nèi)核的信息打印到屏幕上。 全部程序下載 (感謝 Martin Frey,該程序的主體出自他的靈感 ) 特別聲明: 1:資料來(lái)源于互聯(lián)網(wǎng),版權(quán)歸屬原作者 2:資料內(nèi)容屬于網(wǎng)絡(luò)意見(jiàn),與本賬號(hào)立場(chǎng)無(wú)關(guān) 3:如有侵權(quán),請(qǐng)告知,立即刪除。
點(diǎn)擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1