国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    20255

    瀏覽量

    252298
  • 內核
    +關注

    關注

    4

    文章

    1468

    瀏覽量

    42877
  • Linux
    +關注

    關注

    88

    文章

    11760

    瀏覽量

    219036
  • AIoT
    +關注

    關注

    8

    文章

    1643

    瀏覽量

    34118

原文標題:接上一篇續集

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    MangoTree Halo Ultra「全新PXI」,標配自動糾錯內存#

    內存
    芒果樹數字
    發布于 :2026年03月06日 15:59:34

    Linux內核伙伴系統內存申請函數詳解:從原理到實戰

    在 Linux 內核中,內存管理是整個系統穩定運行的基石,而伙伴系統(Buddy System) 作為內核物理內存分配的核心機制,更是驅動開發、內核
    的頭像 發表于 02-10 16:58 ?3631次閱讀
    Linux<b class='flag-5'>內核</b>伙伴系統<b class='flag-5'>內存</b>申請函數詳解:從原理到實戰

    內存條崩了?漲了十倍的內存顆粒賣給誰?內存芯片接下來怎么玩?

    內存
    芯廣場
    發布于 :2026年01月26日 17:48:21

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

    每個內存地址是虛擬的,不是直接指向RAM中的任何地址。當用戶訪問內存中的存儲單元時,都會進行地址轉換以匹配相應的物理內存。書籍的第10章討論了五個主題,對Linux內核
    發表于 01-16 20:05

    內存持續漲價,多重信號預警成本壓力#內存芯片#漲價#行業#消費電子#AI#

    內存芯片
    jf_15747056
    發布于 :2026年01月08日 18:38:35

    rk基于linux/android內存管理

    內核對容量的識別), 64 位平臺上認為所有內存都可 用。然后通過一系列 reserve_xxx() 接口從內存末尾往前預留需要的內存,最后把自己 relocate 到某段 reser
    的頭像 發表于 12-15 10:42 ?214次閱讀
    rk基于linux/android<b class='flag-5'>內存</b>管理

    Linux內核模塊的加載機制

    \"GPL\") bool sig_ok;// 簽名驗證結果 };然后進行內存分配 1、使用vmalloc()在內核空間分配內存,映射模塊的代碼和數據段。 2、標記可執行頁(需
    發表于 11-25 06:59

    開源鴻蒙技術大會2025丨OS內核與視窗分論壇:筑基開源鴻蒙核心內核,共拓視窗技術邊界

    開源鴻蒙技術大會2025 OS內核與視窗分論壇在湖南長沙國際會議中心圓滿舉行。來自西北工業大學、浙江大學、廈門大學、華為等高校和企業的學者專家齊聚一堂,圍繞鴻蒙內核通信機制、智能渲染、內存緩存優化、端云協同備份及空間視窗架構等前
    的頭像 發表于 11-20 17:29 ?867次閱讀
    開源鴻蒙技術大會2025丨OS<b class='flag-5'>內核</b>與視窗分論壇:筑基開源鴻蒙核心<b class='flag-5'>內核</b>,共拓視窗技術邊界

    蜂鳥E203內核優化方法

    。 修改內核參數:對蜂鳥E203的內核參數進行相應修改,可以優化內核運行效率,提高系統性能,比如調整緩存大小、內存分配策略等。 資源管理:進行有針對的資源管理,例如調度算法的修改,調整
    發表于 10-21 07:55

    華邦電子重新定義AI內存:為新一代運算打造高帶寬、低延遲解決方案

    本文將探討內存技術的最新突破、AI 應用日益增長的影響力,以及華邦如何透過策略性布局響應市場不斷變化的需求。
    的頭像 發表于 08-28 11:17 ?4557次閱讀
    華邦電子重新定義AI<b class='flag-5'>內存</b>:為新一代運算打造高帶寬、低延遲解決方案

    強實時運動控制內核MotionRT750(一):驅動安裝、內核配置與使用

    強實時運動控制內核MotionRT750的驅動安裝與內核配置
    的頭像 發表于 07-03 15:48 ?3679次閱讀
    強實時運動控制<b class='flag-5'>內核</b>MotionRT750(一):驅動安裝、<b class='flag-5'>內核</b>配置與使用

    網格布局介紹

    概述 網格布局是由“行”和“列”分割的單元格所組成,通過指定“項目”所在的單元格做出各種各樣的布局。網格布局具有較強的頁面均分能力,子組件占比控制能力,是一種重要自適應布局,其使用場
    發表于 06-25 06:27

    HarmonyOS NEXT應用元服務布局合理使用布局組件

    選擇合適的布局組件 在布局時,子組件會根據父組件的布局算法得到相應的排列規則,然后按照規則進行子組件位置的擺放。不同的布局容器使用的布局算法
    發表于 06-20 15:48

    基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數與變量內存布局優化精控方法

    在嵌入式軟件開發領域,MCU芯片軟件的架構設計與內存布局的精細規劃對系統性能和穩定性起著關鍵作用。本文檔聚焦于IAR Embedded Workbench環境下,為自研MCU芯片軟件提供了一套詳盡
    的頭像 發表于 04-30 16:38 ?762次閱讀
    基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數與變量<b class='flag-5'>內存</b><b class='flag-5'>布局</b>優化精控方法

    C語言中結構體與聯合體的深度解析:內存布局與應用場景

    例: struct Student { char name[20];// 20字節 int age;// 4字節 float score; // 4字節 }; 內存布局:總大小為32字節(考慮
    發表于 04-08 09:18