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

正文內(nèi)容

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

2025-07-21 16:55本頁面
  

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