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

正文內(nèi)容

linux內(nèi)存管理以程序員視角(文件)

2024-08-17 16:55 上一頁面

下一頁面
 

【正文】 體系結(jié)構(gòu)中 )大小的頁,從而分配和回收內(nèi)存的基本單位便是內(nèi)存頁了?;锇殛P(guān)系分配算法大家應該不陌生 幾乎所有操作系統(tǒng)方面的書都會提到 ,我們不去詳細說它了,如果不明白可以參看有關(guān)資料。如果現(xiàn)有的內(nèi)存區(qū)域不夠容納堆空間,則會以頁面大小的倍數(shù)為單位,擴張或收縮對應的內(nèi)存區(qū)域,但 brk 值并非以頁面大小為倍數(shù)修改,而是按實際請求修改。 內(nèi)核內(nèi)存使用 Slab 所謂尺有所長,寸有所短。 為了滿足內(nèi)核對這種小內(nèi)存塊的需要, Linux 系統(tǒng)采用了一種被稱為 slab分配器的技術(shù)。 Slab 并非是脫離伙伴關(guān)系而獨立存在的一種內(nèi)存分配方式, slab 仍然是建立在頁面基礎(chǔ)之上,換句話說, Slab 將頁面 (來自于伙伴關(guān)系管理的空閑頁面鏈表 )撕碎成眾多小內(nèi)存塊以供分配, slab 中的對象分配和銷毀使用kmem_cache_alloc 與 kmem_cache_free。 有興趣的話,可以到 /proc/slabinfo 中找到內(nèi)核執(zhí)行現(xiàn)場使用的各種 slab信息統(tǒng)計,其中你會看到系統(tǒng)中所有 slab 的使用信息。 slab 分配器使得一個頁面內(nèi)包含的眾多小塊內(nèi)存可獨立被分配使用,避免了內(nèi)部分片,節(jié)約了空閑內(nèi)存。 Linux 內(nèi)核借用了這個技術(shù),允許內(nèi)核程序在內(nèi)核地址空間中分配虛擬地址,同樣也利用頁表 (內(nèi)核頁表 )將虛擬地址映射到分散的內(nèi)存頁上。 malloc 分配的內(nèi)核虛擬內(nèi)存與 kmalloc/get_free_page 分配的內(nèi)核虛擬內(nèi)存位于不同的區(qū)間,不會重疊。要知道,物理內(nèi)存映射區(qū)中的地址與內(nèi)核頁表是有序?qū)?,系統(tǒng)中的每個物理頁面都可以找到它對應的內(nèi)核虛擬地址 (在物理內(nèi)存映射區(qū)中的 )。它們有可能尚未被映射,在發(fā)生缺頁時才真正分配物理頁面。許多設(shè)備驅(qū)動程序便是利用內(nèi)存映射功能將用 戶空間的一段地址關(guān)聯(lián)到設(shè)備內(nèi)存上,無論何時,只要內(nèi)存在分配的地址范圍內(nèi)進行讀寫,實際上就是對設(shè)備內(nèi)存的訪問。對于具體映射細節(jié)不作介紹了,需要強調(diào)的是 ,建立頁表可以采用remap_page_range 方法一次建立起所有映射區(qū)的頁表,或利用 vma_struct 的nopage 方法在缺頁時現(xiàn)場一頁一頁的建立頁表。因此我們將試圖寫一個虛擬字符設(shè)備驅(qū)動程序,通過它將系統(tǒng)內(nèi)核空間映射到用戶空間 將內(nèi)核虛擬內(nèi)存映射到用戶虛擬地址。我們已經(jīng)看到內(nèi)核物理內(nèi)存映射區(qū)域中的地址可以被內(nèi)核函數(shù)virt_to_phys 轉(zhuǎn)換成實際的物理內(nèi)存地址,但對于 vmalloc 分配的內(nèi)核虛擬地址無法直接轉(zhuǎn)化成物理地址,所以我們必須對這部分虛擬內(nèi)存格外 照顧 先將其轉(zhuǎn)化成內(nèi)核物理內(nèi)存映射區(qū)域中的地址,然后在用 virt_to_phys 變?yōu)槲锢淼刂?。因此需要我們實現(xiàn)內(nèi)存區(qū)域中的 nopaga 操作,以能返回被映射的物理頁面指針,在我們的實例中就是返回上面過程中的內(nèi)核物理內(nèi)存映射區(qū)域中的地址。其中主要的函數(shù)有vaddress_to_kaddress()負責對 vmalloc 分配的地址進行頁表解析 ,以找到對應的內(nèi)核物理映射地址 (kmalloc 分配的地址 ); map_nopage 負責在進程訪問一個當前并不存在的 VMA 頁時,尋找該地址對應的物理頁,并返回該頁的指針。 全部程序下載 (感謝 Martin Frey,該程序的主體出自他的靈感 ) 特別聲明: 1:資料來源于互聯(lián)網(wǎng),版權(quán)歸屬原作者 2:資料內(nèi)容屬于網(wǎng)絡(luò)意見,與本賬號立場無關(guān) 3:如有侵權(quán),請告知,立即刪除。結(jié)果可以看到內(nèi)核虛擬地址的內(nèi)容 (ok! ),被顯示在了屏幕上。 程序組成 ,它是以模塊形式加載的虛擬字符驅(qū)動程序。 b)獲取頁表項對應的頁面指針 c)通過頁面得到對應的內(nèi)核物理內(nèi)存映射區(qū)域地址。我們的例子程序?qū)⒀菔景?vmalloc 分配的內(nèi)核虛擬地址映射到用戶地址空間的全過程。一次調(diào)用所有頁表便定型了,不適用于那些需要現(xiàn)場建立頁表的場合 比如映射區(qū)需要擴展或下面我們例子中的情況。 Linux 中的 X服務(wù)器就是一個利用內(nèi)存映射達到直接高速訪問視頻卡內(nèi)存的例子。 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; } 實例 內(nèi)存映射 (mmap)是 Linux 操作系統(tǒng)的一個很大特色,它可以將系統(tǒng)內(nèi)存映射到一個文件 (設(shè)備 )上,以便可以通過訪問文件內(nèi)容來達到訪問內(nèi)存的目的。每一塊 vmalloc 分配的內(nèi)核虛擬內(nèi)存都對應一個 vm_struct 結(jié)構(gòu)體 (可別 和vm_area_struct 搞混,那可是進程虛擬內(nèi)存區(qū)域的結(jié)構(gòu) ),不同的內(nèi)核虛擬地址被 4k 大小的空閑區(qū)間隔,以防止越界 見下圖 )。進程空間地址分布從 0到 3G(其實是到 PAGE_OFFSET,在 0x86 中它等于 0xC 0000000),從 3G到 vmalloc_start 這段地址是物理內(nèi)存映射區(qū)域 (該區(qū)域中包含了內(nèi)核鏡像、物理頁面表 mem_map 等等 )比如我使用的系統(tǒng)內(nèi)存是 64M(可以用 free 看到 ,那么 (3G3G+64M)這片內(nèi)存就應該映射到物理內(nèi)存,而vmalloc_start 位置應在 3G+64M 附近 (說 附近 因為是在物理內(nèi)存映射區(qū)與vmalloc_start 期間還會存在一個 8M 大小的 gap 來防止躍界 ),vmalloc_end 的位置接近 4G(說 接近 是因為最后位置系統(tǒng)會保留一片 128k 大小的區(qū)域用
點擊復制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1