<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux系統(tǒng)下內(nèi)存申請(qǐng)應(yīng)用的方法原理總結(jié)

          Linux系統(tǒng)下內(nèi)存申請(qǐng)應(yīng)用的方法原理總結(jié)

          作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

          1. 地址空間的管理

          本文引用地址:http://www.ex-cimer.com/article/201610/305763.htm

          物理地址都是有內(nèi)核管理的, node-->zone-->mem_map-->page, 所有的物理頁(yè)面都在mem_map數(shù)組中的頁(yè)幀對(duì)應(yīng), 然后不同的page有分為DMA,normal,highmem三個(gè)zone。

          內(nèi)核線(xiàn)性地址空間, 實(shí)際上只是低端內(nèi)存才有線(xiàn)性地址,0---896MB部分。

          內(nèi)核虛擬地址, 低端內(nèi)存的虛擬地址與線(xiàn)性地址是一樣的。 高端內(nèi)存只有在映射了以后才有虛擬地址

          用戶(hù)空間地址, tast_struct ---> mmap --> mm_struct ---> vm_area_struct

          2.內(nèi)存的申請(qǐng)或使用

          物理內(nèi)存的分配, 在內(nèi)核中最終都要調(diào)用__alloc_pages().它是最核心的分配函數(shù),申請(qǐng)大小最大不超過(guò)2的MAX_ORDER次冪,在現(xiàn)在好像最大定義為4MB。

          線(xiàn)性地址, kmalloc和get_free_pages,線(xiàn)性地址, 對(duì)應(yīng)的物理內(nèi)存就是低端內(nèi)存,kmalloc是基于slab的分配技術(shù), 最大不能超過(guò)128KB。

          虛擬地址, vmalloc申請(qǐng), 他只是在內(nèi)核中建立類(lèi)似與用戶(hù)空間的vm_area的一個(gè)虛擬內(nèi)存空間到vmlist中, 最終的物理內(nèi)存分配還是基于缺頁(yè)的。

          用戶(hù)空間的虛擬內(nèi)存, malloc之類(lèi)的, 最終在內(nèi)核中都是do_map()和do_brk()。實(shí)際上也只是建立了一塊虛擬空間,最終的物理內(nèi)存還是在缺頁(yè)異常時(shí)分配的。

          3. 內(nèi)存的交換問(wèn)題

          在page結(jié)構(gòu)和用戶(hù)層的vm_area_struct結(jié)構(gòu)中, 都包含locked和reserved標(biāo)志。通過(guò)合適的途徑設(shè)置這些標(biāo)志, 可以是頁(yè)面鎖存在物理內(nèi)存中, 不被交換出去。

          4. 設(shè)備內(nèi)存可以通過(guò)ioremap映射到內(nèi)核虛擬地址空間, 也可以通過(guò)mmap方法映射到用戶(hù)空間。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();