色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

內核內存布局

電子工程師 ? 來源:嵌入式開發AIoT ? 作者:嵌入式開發AIoT ? 2022-08-08 17:14 ? 次閱讀

一、內核內存布局

64位Linux一般使用48位表示虛擬地址空間,43位表示物理地址,通過命令:cat /proc/cpuinfo

32401ca6-16c0-11ed-ba43-dac502259ad0.png
  • ARM64架構處理器采用48位物理尋址機制,最大可尋找256TB的物理地址空間。對于 目前應用完全足夠,不需要擴展到64位的物理尋址。虛擬地址也同樣最大支持48位尋址,所以 在處理器架構設計上,把虛擬地址空間劃分為兩個空間,每個空間最大支持256TB,linux內核 在大多數體系結構上都把兩個地址劃分為:用戶空間和內核空間。

  • 用戶空間:0x0000_0000_0000_0000至0x0000_ffff_ffff_ffff;

  • 內核空間:0xffff_0000_0000_0000至0xffff_ffff_ffff_ffff;

QEMU平臺,可以打印ARM64架構linux內核內存分布情況

327151a4-16c0-11ed-ba43-dac502259ad0.png

二、堆管理

堆是進程中主要用于動態分配變量和數據的內存區域,堆的管理對應程序員不是直接可見的。因為它依賴標準庫提供的各個輔助函數(其中最重要的是malloc)來分配任意長度的內存區。malloc和內核之間的經典接口是brk系統調用,負責擴展/收縮堆。

329df57e-16c0-11ed-ba43-dac502259ad0.png
  • 堆是一個連續的內存區域,在擴展時自下至上增長。其中mm_struct結構,包含堆在虛擬地 址空間中的起始和當前結束地址(start_brk和brk)。
  • brk系統調用用于指定堆在虛擬地址空間中新的結束地址(如果堆將要收縮,當然可以小于當前值)。brk系統調用通過do_brk增長動態分配區(內核源碼分mm/mmap.c)

三、sys_brk流程

  1. 檢查資源限制;

  2. 將brk值對齊到頁;

  3. 是否想增加brk值?(這個地方要結合源碼看)

    是-->do_brk();返回新的brk的值;

    否-->do_munmap();返回新的brk的值;

brk機制不是一個獨立的內核概念,而是基于匿名映射實現,以減少內部的開銷。在檢查過用brk的值的新地址未超出推的限制之后,sys_brk第一個重要操作是請求的地址按頁長對齊。brk()用于進程向內核申請空間,用于擴展用戶堆棧空間,或者回收堆棧空間。

  • malloc為小空間申請,brk()為大塊空間申請。do_brk()用于增長動態分配區。do_munmap()釋放動態分配區;
  • do_brk()源碼分析:
staticunsignedlongdo_brk(unsignedlongaddr,unsignedlonglen)
{
structmm_struct*mm=current->mm;
structvm_area_struct*vma,*prev;
unsignedlongflags;
structrb_node**rb_link,*rb_parent;
pgoff_tpgoff=addr>>PAGE_SHIFT;
interror;

//首先對len這個長度進行頁面對齊去判斷頁面對齊之后是否超出邊界
len=PAGE_ALIGN(len);
if(!len)
returnaddr;

flags=VM_DATA_DEFAULT_FLAGS|VM_ACCOUNT|mm->def_flags;

//檢查是否有足夠內存空間來分析len大小的內存。判斷虛擬地址空間是否足夠
error=get_unmapped_area(NULL,addr,len,0,MAP_FIXED);
if(offset_in_page(error))
returnerror;

error=mlock_future_check(mm,mm->def_flags,len);
if(error)
returnerror;

/*
*mm->mmap_semisrequiredtoprotectagainstanotherthread
*changingthemappingsincasewesleep.
*/
verify_mm_writelocked(mm);

/*
*Clearoldmaps.thisalsodoessomeerrorcheckingforus
*/
//循環遍歷用戶進程紅黑樹中VMA,然后根據addr來查找合適的插入點
while(find_vma_links(mm,addr,addr+len,&prev,&rb_link,
&rb_parent)){
if(do_munmap(mm,addr,len))
return-ENOMEM;
}

/*Checkagainstaddressspacelimits*after*clearingoldmaps...*/
//檢查是否要對此虛擬區間進行擴充
if(!may_expand_vm(mm,len>>PAGE_SHIFT))
return-ENOMEM;

if(mm->map_count>sysctl_max_map_count)
return-ENOMEM;
//判斷系統是否有足夠內存
if(security_vm_enough_memory_mm(mm,len>>PAGE_SHIFT))
return-ENOMEM;

/*Canwejustexpandanoldprivateanonymousmapping?*/
//判讀是否可以合并,如果可以合并就合并成為一個vam區
vma=vma_merge(mm,prev,addr,addr+len,flags,
NULL,NULL,pgoff,NULL,NULL_VM_UFFD_CTX);

//如果能合并直接gotoout
if(vma)
gotoout;

/*
*createavmastructforananonymousmapping
*/

//如果沒有辦法合并,只有新創建一個VMA,VMA地址空間是【addr,addr+len】
vma=kmem_cache_zalloc(vm_area_cachep,GFP_KERNEL);
if(!vma){
vm_unacct_memory(len>>PAGE_SHIFT);
return-ENOMEM;
}

//指向匿名域指針
INIT_LIST_HEAD(&vma->anon_vma_chain);
vma->vm_mm=mm;//指向VMA所屬于進程structmm_struct結構
vma->vm_start=addr;
vma->vm_end=addr+len;
vma->vm_pgoff=pgoff;
vma->vm_flags=flags;
vma->vm_page_prot=vm_get_page_prot(flags);
vma_link(mm,vma,prev,rb_link,rb_parent);
out://增加進程地址空間長度
perf_event_mmap(vma);
mm->total_vm+=len>>PAGE_SHIFT;
if(flags&VM_LOCKED)
mm->locked_vm+=(len>>PAGE_SHIFT);
vma->vm_flags|=VM_SOFTDIRTY;
returnaddr;
}

- END -


審核編輯 :李倩


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

    關注

    68

    文章

    19535

    瀏覽量

    231860
  • 內核
    +關注

    關注

    3

    文章

    1391

    瀏覽量

    40602
  • Linux
    +關注

    關注

    87

    文章

    11373

    瀏覽量

    211299
  • AIoT
    +關注

    關注

    8

    文章

    1435

    瀏覽量

    31301

原文標題:接上一篇續集

文章出處:【微信號:嵌入式開發AIoT,微信公眾號:嵌入式開發AIoT】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux服務器卡頓救星之一招釋放Cache內存

    為了加速操作和減少磁盤I/O,內核通常會盡可能多地緩存內存,這部分內存就是Cache Memory(緩存內存)。根據設計,包含緩存數據的頁面可以按需重新用于其他用途(例如,應用程序)。
    的頭像 發表于 01-16 10:04 ?652次閱讀

    Linux下如何管理虛擬內存 使用虛擬內存時的常見問題

    在Linux系統中,虛擬內存管理是操作系統內核的一個重要功能,負責管理物理內存和磁盤上的交換空間。以下是對Linux下如何管理虛擬內存以及使用虛擬
    的頭像 發表于 12-04 09:19 ?768次閱讀

    虛擬內存不足如何解決 虛擬內存和物理內存的區別

    虛擬內存不足的解決方案 虛擬內存不足是計算機用戶經常遇到的問題,尤其是在運行大型軟件或多任務處理時。以下是一些解決虛擬內存不足問題的方法: 增加物理內存(RAM) : 這是最直接的解決
    的頭像 發表于 12-04 09:14 ?853次閱讀

    Linux內存泄露案例分析和內存管理分享

    作者:京東科技 李遵舉 一、問題 近期我們運維同事接到線上LB(負載均衡)服務內存報警,運維同事反饋說LB集群有部分機器的內存使用率超過80%,有的甚至超過90%,而且內存使用率還再不停的增長。接到
    的頭像 發表于 10-24 16:14 ?831次閱讀
    Linux<b class='flag-5'>內存</b>泄露案例分析和<b class='flag-5'>內存</b>管理分享

    邏輯內存和物理內存的區別

    邏輯內存和物理內存是計算機系統中兩個重要的概念,它們在計算機的運行和數據處理中起著至關重要的作用。 1. 物理內存(Physical Memory) 物理內存,也稱為RAM(Rando
    的頭像 發表于 09-27 15:38 ?1145次閱讀

    內存管理的硬件結構

    常見的內存分配函數有malloc,mmap等,但大家有沒有想過,這些函數在內核中是怎么實現的?換句話說,Linux內核內存管理是怎么實現的?
    的頭像 發表于 09-04 14:28 ?449次閱讀
    <b class='flag-5'>內存</b>管理的硬件結構

    內存時鐘是什么意思

    內存時鐘是內存模塊中一個至關重要的參數,它直接關聯到內存模塊能夠工作的最高頻率。以下是對內存時鐘的詳細解析,包括其定義、作用、與內存頻率的關
    的頭像 發表于 09-04 11:45 ?1649次閱讀

    Linux內核測試技術

    Linux 內核是Linux操作系統的核心部分,負責管理硬件資源和提供系統調用接口。隨著 Linux 內核的不斷發展和更新,其復雜性和代碼規模也在不斷增加。因此,確保內核的穩定性和可靠性變得尤為重要
    的頭像 發表于 08-13 13:42 ?688次閱讀
    Linux<b class='flag-5'>內核</b>測試技術

    操作系統的內存布局介紹

    32位操作系統的內存布局很經典,很多書籍都是以32位系統為例子去講解的。32位的系統可訪問的地址空間為4GB,用戶空間為1GB ~ 3GB,內核空間為3GB ~ 4GB。
    的頭像 發表于 08-07 15:47 ?551次閱讀
    操作系統的<b class='flag-5'>內存</b><b class='flag-5'>布局</b>介紹

    ESP-IDF內核中的內存管理如何驗證?

    請教一下,ESP-IDF 內核中的內存管理如何驗證
    發表于 06-19 06:30

    臺灣地區DRAM內存產能受地震影響停止報價

    報告顯示,美光在臺灣擁有豐富的產能布局,包含位于新北林口及臺中的工廠,主要生產尖端的 1-beta 內存產品以及預定將陸續推出的 1-gamma 制程內存
    的頭像 發表于 04-07 15:19 ?606次閱讀

    微軟發布Linux內核Rust模塊優化補丁

    在此之前,Linux 內核中要想實現模塊初始化,必須先創建一個實例,再將其移至特定內存空間。然而,經過新補丁調整后,各模塊可直接在預設定好的內存地址上完成初始化工作。
    的頭像 發表于 04-02 15:11 ?541次閱讀

    linux內核常用調優參數

     1. vm.swappiness:該參數控制系統在內存不足時,內核將頁面交換到磁盤的程度。默認值為60,建議值為10-30。   2. vm.overcommit_memory:該參數控制系統是否允許超額分配內存。默認值
    的頭像 發表于 04-01 10:31 ?2502次閱讀

    瑞薩推出采用自研CPU內核的通用32位RISC-V MCU 加強RISC-V生態系統布局

    瑞薩推出采用自研CPU內核的通用32位RISC-V MCU 加強RISC-V生態系統布局 RISC-V MCU為開發人員帶來低功耗、高性能的全新選擇以及全面工具鏈支持。 全球半導體解決方案供應商瑞薩
    發表于 03-28 19:00 ?693次閱讀

    什么是HBM3E內存?Rambus HBM3E/3內存控制器內核

    Rambus HBM3E/3 內存控制器內核針對高帶寬和低延遲進行了優化,以緊湊的外形和高能效的封裝為人工智能訓練提供了最大的性能和靈活性。
    發表于 03-20 14:12 ?3020次閱讀
    什么是HBM3E<b class='flag-5'>內存</b>?Rambus HBM3E/3<b class='flag-5'>內存</b>控制器<b class='flag-5'>內核</b>
    主站蜘蛛池模板: 国产成人小视频 | 总裁呻吟双腿大开男男H | 动漫美女搞鸡 | 亚洲精品成人A8198A片漫画 | 欧美zzo交| 亚洲人成人毛片无遮挡 | 国精产品一区二区三区有限公司 | 久久视热频国只有精品 | 大陆老太交xxxxxhd在线 | 成人午夜精品无码区久久漫画日本 | 久久香蕉国产线看观看首页 | 男男腐文污高干嗯啊快点1V1 | 秋霞电影院午夜伦高清 | 无羞耻肉动漫在线观看 | 波多野结衣 无码片 | 国产精品网红女主播久久久 | 秋霞伦理电影在2017韩国在线伦 | 快插我我好湿啊公交车上做 | vr亚洲成年网址在线观看 | 娇小亚裔被两个黑人 | 少妇的肉体AA片免费观看 | 国产午夜在线视频 | 亚洲欧美另类无码专区 | 双腿打开揉弄高潮H苏安安秦慕深 | 在线观看免费小视频 | 边摸边吃奶边做带声音 | yy4408午夜场理论片 | 免费三级现频在线观看 | 2019在秋霞理论 | 国产精品久久久久久久久99热 | 大香伊蕉在人线国产最新 | 吃胸亲吻吃奶摸下面免费视频 | 国产午夜婷婷精品无码A片 国产午夜视频在永久在线观看 | 最美白嫩的极品美女ASSPICS | 美丽的姑娘BD在线观看 | 成人性视频全过程 | ppypp日本欧美一区二区 | 天天爽夜夜爽8888视频精品 | 粉嫩无套白浆第一次jk | 亚洲国产精品免费线观看视频 | 入禽太深在线观看免费高清 |