91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)核內(nèi)存布局

電子工程師 ? 來源:嵌入式開發(fā)AIoT ? 作者:嵌入式開發(fā)AIoT ? 2022-08-08 17:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、內(nèi)核內(nèi)存布局

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

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

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

  • 內(nèi)核空間:0xffff_0000_0000_0000至0xffff_ffff_ffff_ffff;

QEMU平臺(tái),可以打印ARM64架構(gòu)linux內(nèi)核內(nèi)存分布情況

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

二、堆管理

堆是進(jìn)程中主要用于動(dòng)態(tài)分配變量和數(shù)據(jù)的內(nèi)存區(qū)域,堆的管理對(duì)應(yīng)程序員不是直接可見的。因?yàn)樗蕾嚇?biāo)準(zhǔn)庫提供的各個(gè)輔助函數(shù)(其中最重要的是malloc)來分配任意長度的內(nèi)存區(qū)。malloc和內(nèi)核之間的經(jīng)典接口是brk系統(tǒng)調(diào)用,負(fù)責(zé)擴(kuò)展/收縮堆。

329df57e-16c0-11ed-ba43-dac502259ad0.png
  • 堆是一個(gè)連續(xù)的內(nèi)存區(qū)域,在擴(kuò)展時(shí)自下至上增長。其中mm_struct結(jié)構(gòu),包含堆在虛擬地 址空間中的起始和當(dāng)前結(jié)束地址(start_brk和brk)。
  • brk系統(tǒng)調(diào)用用于指定堆在虛擬地址空間中新的結(jié)束地址(如果堆將要收縮,當(dāng)然可以小于當(dāng)前值)。brk系統(tǒng)調(diào)用通過do_brk增長動(dòng)態(tài)分配區(qū)(內(nèi)核源碼分mm/mmap.c)

三、sys_brk流程

  1. 檢查資源限制;

  2. 將brk值對(duì)齊到頁;

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

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

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

brk機(jī)制不是一個(gè)獨(dú)立的內(nèi)核概念,而是基于匿名映射實(shí)現(xiàn),以減少內(nèi)部的開銷。在檢查過用brk的值的新地址未超出推的限制之后,sys_brk第一個(gè)重要操作是請(qǐng)求的地址按頁長對(duì)齊。brk()用于進(jìn)程向內(nèi)核申請(qǐng)空間,用于擴(kuò)展用戶堆棧空間,或者回收堆??臻g。

  • malloc為小空間申請(qǐng),brk()為大塊空間申請(qǐng)。do_brk()用于增長動(dòng)態(tài)分配區(qū)。do_munmap()釋放動(dòng)態(tài)分配區(qū);
  • 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;

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

flags=VM_DATA_DEFAULT_FLAGS|VM_ACCOUNT|mm->def_flags;

//檢查是否有足夠內(nèi)存空間來分析len大小的內(nèi)存。判斷虛擬地址空間是否足夠
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
*/
//循環(huán)遍歷用戶進(jìn)程紅黑樹中VMA,然后根據(jù)addr來查找合適的插入點(diǎn)
while(find_vma_links(mm,addr,addr+len,&prev,&rb_link,
&rb_parent)){
if(do_munmap(mm,addr,len))
return-ENOMEM;
}

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

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

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

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

/*
*createavmastructforananonymousmapping
*/

//如果沒有辦法合并,只有新創(chuàng)建一個(gè)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所屬于進(jìn)程structmm_struct結(jié)構(gòu)
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://增加進(jìn)程地址空間長度
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 -


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20258

    瀏覽量

    252522
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1470

    瀏覽量

    42894
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11767

    瀏覽量

    219100
  • AIoT
    +關(guān)注

    關(guān)注

    8

    文章

    1644

    瀏覽量

    34135

原文標(biāo)題:接上一篇續(xù)集

文章出處:【微信號(hào):嵌入式開發(fā)AIoT,微信公眾號(hào):嵌入式開發(fā)AIoT】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核驅(qū)動(dòng)開發(fā)的技術(shù)核心精要

    嵌入式Linux驅(qū)動(dòng)開發(fā)是連接硬件與操作系統(tǒng)的關(guān)鍵環(huán)節(jié)。隨著內(nèi)核演進(jìn)(如Linux 6.13)和硬件復(fù)雜度提升,開發(fā)者需掌握并發(fā)控制、中斷分層、內(nèi)存管理、設(shè)備樹、調(diào)試工具等核心知識(shí)。本文提煉出驅(qū)動(dòng)
    發(fā)表于 03-10 13:56

    MangoTree Halo Ultra「全新PXI」,標(biāo)配自動(dòng)糾錯(cuò)內(nèi)存#

    內(nèi)存
    芒果樹數(shù)字
    發(fā)布于 :2026年03月06日 15:59:34

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    在 Linux 內(nèi)核中,內(nèi)存管理是整個(gè)系統(tǒng)穩(wěn)定運(yùn)行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機(jī)制,更是驅(qū)動(dòng)開發(fā)、內(nèi)核
    的頭像 發(fā)表于 02-10 16:58 ?3638次閱讀
    Linux<b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)<b class='flag-5'>內(nèi)存</b>申請(qǐng)函數(shù)詳解:從原理到實(shí)戰(zhàn)

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個(gè)內(nèi)存地址是虛擬的,不是直接指向RAM中的任何地址。當(dāng)用戶訪問內(nèi)存中的存儲(chǔ)單元時(shí),都會(huì)進(jìn)行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書籍的第10章討論了五個(gè)主題,對(duì)Linux內(nèi)核
    發(fā)表于 01-16 20:05

    rk基于linux/android內(nèi)存管理

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

    開源鴻蒙技術(shù)大會(huì)2025丨OS內(nèi)核與視窗分論壇:筑基開源鴻蒙核心內(nèi)核,共拓視窗技術(shù)邊界

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

    蜂鳥E203內(nèi)核優(yōu)化方法

    。 修改內(nèi)核參數(shù):對(duì)蜂鳥E203的內(nèi)核參數(shù)進(jìn)行相應(yīng)修改,可以優(yōu)化內(nèi)核運(yùn)行效率,提高系統(tǒng)性能,比如調(diào)整緩存大小、內(nèi)存分配策略等。 資源管理:進(jìn)行有針對(duì)的資源管理,例如調(diào)度算法的修改,調(diào)整
    發(fā)表于 10-21 07:55

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

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

    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750(一):驅(qū)動(dòng)安裝、內(nèi)核配置與使用

    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制內(nèi)核MotionRT750的驅(qū)動(dòng)安裝與內(nèi)核配置
    的頭像 發(fā)表于 07-03 15:48 ?3695次閱讀
    強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制<b class='flag-5'>內(nèi)核</b>MotionRT750(一):驅(qū)動(dòng)安裝、<b class='flag-5'>內(nèi)核</b>配置與使用

    網(wǎng)格布局介紹

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

    HarmonyOS NEXT應(yīng)用元服務(wù)布局合理使用布局組件

    選擇合適的布局組件 在布局時(shí),子組件會(huì)根據(jù)父組件的布局算法得到相應(yīng)的排列規(guī)則,然后按照規(guī)則進(jìn)行子組件位置的擺放。不同的布局容器使用的布局算法
    發(fā)表于 06-20 15:48

    基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量內(nèi)存布局優(yōu)化精控方法

    在嵌入式軟件開發(fā)領(lǐng)域,MCU芯片軟件的架構(gòu)設(shè)計(jì)與內(nèi)存布局的精細(xì)規(guī)劃對(duì)系統(tǒng)性能和穩(wěn)定性起著關(guān)鍵作用。本文檔聚焦于IAR Embedded Workbench環(huán)境下,為自研MCU芯片軟件提供了一套詳盡
    的頭像 發(fā)表于 04-30 16:38 ?770次閱讀
    基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量<b class='flag-5'>內(nèi)存</b><b class='flag-5'>布局</b>優(yōu)化精控方法

    C語言中結(jié)構(gòu)體與聯(lián)合體的深度解析:內(nèi)存布局與應(yīng)用場(chǎng)景

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