在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

mmap系統調用和vmalloc獲取地址空間

Linux閱碼場 ? 來源:工程師曾玲 ? 2019-02-02 16:13 ? 次閱讀

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是將物理內存映射到內核的線性地址空間。

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

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

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

int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,unsigned long pgoff)

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

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1402

    瀏覽量

    40898
  • 內存
    +關注

    關注

    8

    文章

    3099

    瀏覽量

    74851
  • malloc
    +關注

    關注

    0

    文章

    53

    瀏覽量

    156

原文標題:vmalloc與mmap

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    linux內核系統調用之參數傳遞

    與普通函數一樣,系統調用通常需要一些輸入/輸出參數,這些參數可能包括實際值(即數字)、用戶模式進程地址空間中的變量地址,甚至包括指向用戶模式
    的頭像 發表于 12-20 09:32 ?1985次閱讀

    拆解mmap內存映射的本質!

    mmap 內存映射里所謂的內存其實指的是虛擬內存,在調用 mmap 進行匿名映射的時候(比如進行堆內存的分配),是將進程虛擬內存空間中的某一段虛擬內存區域與物理內存中的匿名內存頁進行映
    的頭像 發表于 01-24 14:30 ?2191次閱讀
    拆解<b class='flag-5'>mmap</b>內存映射的本質!

    Linux的mmap文件內存映射機制

    一。mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程地址空間后,進程可以像訪問普通內存一樣對文件進行訪問
    發表于 03-08 09:54

    字符設備驅動另一種寫法—mmap方法操作LED

    。經過自己的研究之后,我發現還有另外一種寫法,直接在應用層操作,省去了內核中的地址映射部分,使得用戶可以在應用層直接操作LED。 mmap方法是把設備物理地址直接映射到用戶空間的一種
    發表于 01-02 17:38

    Linux用戶空間與內核空間的區別?

    對于提供了MMU(存儲管理器,輔助操作系統進行內存管理,提供虛實地址轉換等硬件支持)的處理器而言,Linux提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。進程的4GB內存空間
    發表于 06-05 04:35

    labview 中怎么獲取數值的指針(地址)?調用dll時要往里面傳地址

    labview 中怎么獲取數值的指針(地址)?調試一個設備,調用dll時要往里面傳地址,看了官方.h文件,參考了官方的C#代碼,自己用labview試了試,老是不對,所以想先
    發表于 03-15 08:59

    linux drivers中的mmap實現

    將設備驅動內核空間的內存映射到用戶空間里,可以通過用戶空間中的mmap系統調用代替
    發表于 05-15 10:31 ?1657次閱讀

    Linux的mmap文件內存映射機制

    IPC則純粹用于共享目的,當然mmap()實現共享內存也是其主要應用之一。  mmap系統調用使得進程之間通過映射同一個普通文件實現共享內存。普通文件被映射到進程
    發表于 04-02 14:35 ?506次閱讀

    如何主動調用獲取flag

    明明有強大的frida工具,可以無需過反調試,無需IDA去動靜態調試,無需獲取RC4密鑰,直接用主動調用獲取flag,何必走繁瑣的路呢?
    的頭像 發表于 10-10 09:44 ?4257次閱讀
    如何主動<b class='flag-5'>調用</b><b class='flag-5'>獲取</b>flag

    PCI總線地址空間系統地址空間的關系

    于PCI總線統一尋址。每個PCI設備通過PCI寄存器中的基地址寄存器來指定映射的首地址。PCI地址空間對應于計算機系統結構中的PCI總線。
    的頭像 發表于 01-06 08:30 ?2582次閱讀

    內核mmap_sem鎖的危害和相關優化

    mmap_sem鎖是進程為了保護自身虛擬地址空間不受多線程并發訪問影響而設計的。
    的頭像 發表于 02-07 16:01 ?908次閱讀

    Linux內核之物理內存組織結構

    虛擬內存區域使用起始地址和結束地址描述,鏈表按起始地址遞增排序。兩系統調用區別:mmap指定的偏
    的頭像 發表于 02-08 09:47 ?1134次閱讀

    Linux應用開發之共享內存

    mmap() 系統調用調用進程的虛擬地址空間中創建一個新的內存映射,映射分為兩種。
    的頭像 發表于 04-06 09:51 ?545次閱讀

    Linux虛擬地址空間和物理地址空間的關系

    過程,這其實也是MMU的工作原理。 我們知道,在Linux中,每個進程都有自己獨立的地址空間,且互不干擾。每個進程的地址空間又分為用戶空間
    的頭像 發表于 10-08 11:40 ?1448次閱讀
    Linux虛擬<b class='flag-5'>地址</b><b class='flag-5'>空間</b>和物理<b class='flag-5'>地址</b><b class='flag-5'>空間</b>的關系

    mmap原理詳解

    一句話概括mmap mmap的作用,在應用這一層,是讓你把文件的某一段,當作內存一樣來訪問。將文件映射到物理內存,將進程虛擬空間映射到那塊內存。 這樣,進程不僅能像訪問內存一樣讀寫文件,多個進程映射
    的頭像 發表于 11-09 14:59 ?914次閱讀
    <b class='flag-5'>mmap</b>原理詳解
    主站蜘蛛池模板: 久久精品视频免费播放 | 国产一区二区三区 韩国女主播 | 大又大又粗又爽又黄毛片女人 | 国产精品嫩草影院在线播放 | 国产免费人成在线视频视频 | 性色视频在线观看 | 成人黄色网址 | 天天爽天天爽天天片a久久网 | 天天做天天摸天天爽天天爱 | 色综合色综合色综合色综合 | 婷婷综合七月激情啪啪 | 97午夜理伦片在线影院 | 国产成人综合欧美精品久久 | 天堂中文在线资源 | 天天摸日日摸 | 欧美色图色就是色 | 欧美色88 | 丁香激情六月天 | 深爱综合网 | 天天干天天草天天 | 国产综合精品久久亚洲 | 午夜毛片不卡高清免费 | 午夜在线观看免费视频 | 性猛交xxxx乱大交孕妇 | 国产看午夜精品理论片 | 在线亚洲精品中文字幕美乳 | 久久久久久国产精品免费 | ts国产| 一本到卡二卡三卡四卡 | 成人午夜性a一级毛片美女 成人午夜性视频欧美成人 成人小视频在线 | 天天狠狠色噜噜 | 免免费看片 | 米奇精品一区二区三区 | 黄色毛片免费进入 | avtt天堂网永久资源 | 人人草人人爱 | 午夜噜噜噜私人影院在线播放 | 色综合天天综久久久噜噜噜久久〔 | 久久久久久久性潮 | 欧美一级色视频 | 天天干伊人 |