1. <u id="es55g"><track id="es55g"></track></u>

        <address id="es55g"></address>

        歡迎訪問南京建策科技股份有限公司! 分支機構: 南京 | 廣州 | 上海 | 揚州 | 常州
         最新動態 NEWS     More...
        【喜報】恭喜同學們通過H3C...
        【喜報】新的一周從一篇喜報開...
        【喜報】喜大普奔,恭喜以下同...
        這個暑假真的有點不平凡呢!
        【喜報】叮咚~你有一份郵件待...
        南郵通達-聚策科技“IT菁英...

         

          網站位置:首頁 > 學習交流 > 技術文檔下載
        vmalloc與mmap
        [2019-4-26]

        mmap()系統調用是在用戶進程與內核之間共享內存區域的常用方法。我們最近有個程序,需要應用進程能夠讀取內核驅動獲取的數據,經過簡單的調研,決定采用mmap方式。實現起來不難,在驅動中注冊一個字符設備,實現該設備的mmap()方法即可。但這其中有一點小曲折。


        在實現設備的mmap()方法時,需要將物理內存映射到應用程序通過mmap()系統調用傳下來的vma中。vma代表的是進程的一段虛擬地址空間。在第一版里,考慮的不全面,利用alloc_pages()將整個內存段申請為一段連續的物理地址空間。然后通過remap_pfn_range()函數將這段連續的物理內存映射到vma中。經過長時間的測試,沒有發現問題。直到今天,在部署一個老集群時,遇到了問題。這個集群中有很多老機器,內存只有十多個G,而且長時間運行后產生了大量的內存碎片。從而導致,我們無法獲得足夠的連續物理內存。沒辦法,只好重新調整驅動中分配內存的方式,改用vmalloc獲取地址空間。


        在kernel里,通常有3種申請內存的方式:vmalloc, kmalloc, alloc_pages。kmalloc與alloc_pages類似,均是申請連續的地址空間。而vmalloc則可以申請一段不連續的物理地址空間,并將其映射到連續的線性地址上。每次vmalloc之后,內核會創建一vm_struct,用以映射分配到的不連續的內存區域。vm_struct類似vma,但是又不是一回事。vma是將物理內存映射到進程的虛擬地址空間。而vm_struct是將物理內存映射到內核的線性地址空間?! ?/span>


        既然vmalloc拿到的不是連續的物理內存,那么將這些內存映射到vma時,就不能直接利用remap_pfn_range()了。


        此時可以采用兩種方法,一種是實現vm_operations_struct的fault()方法,用以在缺頁時再映射需要的頁。此方法操作起來較為麻煩。


        另一種方法是直接使用remap_vmalloc_range()函數。該函數的原型為:



        其中參數vma是mmap使用調用傳下來的,addr即為vmalloc()所分配內存的起始地址。而pgoff則為mmap()系統調用里的偏移參數,可以通過vma->vm_pgoff獲得。該函數成功執行后,返回值為0。如果返回值為負數,則說明出錯了。通常是由于所傳的參數不正確。


        需要注意的是,需要映射到用戶空間的內存段,不能直接利用vmalloc()分配,而應該使用vmalloc_user()函數。該函數除了分配內存之外,還會將相應的vm_struct結構標記為VM_USERMAP。否則,remap_vmalloc_range將返回錯誤。


        在這個項目中碰到的教訓是,永遠不要假設系統中一定會有超過一個頁的連續物理內存。


        不過較新的內核具有compact機制,可以整理內存碎片。但是,目前至少有一大部分機器不支持,或未開啟此機制。


        如果您對技術帖內容有任何疑問,請聯系官方郵箱:jcit@jiancenj.com,也歡迎廣大學員踴躍投稿,一經錄用,有稿費酬謝。

        友情鏈接
         
        騰訊云
        華三
        紅帽
        思科
        瞻博網絡
         Copyright @ 2016-2019 www.fqhcryp.com All Rights Reserved. 版權所有 建策科技 蘇ICP備11058165號
         總 部地 址:江蘇省南京市玄武區珠江路222號長發科技大廈16樓 聯系電話: 025-84804339;84804652
         廣州辦事處:廣州市天河區石牌西路8號展望數碼廣場1903室
         上海辦事處:上海普陀區真南路1008號上海信息技術學院8號樓114室
         常州辦事處:常州市武進區科教城創研港3A804 18796950509
         揚州辦事處:揚州市邗江區潤揚南路33號南京郵電大學通達學院2號實驗樓2203-2206室
        日本大胆人GOGO露私艺术影,多人强伦姧人妻完整版,香港三级纶理在线视