mm_init | --- >mem_init linux4.14/init/main.c 在 mem_init 函數中會初始化伙伴系統和 slab 分配器。 先說兩個概念: 外部碎片 :有一段小內存,夾在兩個大內存中間,兩個大內存已經被分配給進程,這一段小內存由于過小,不夠申請者使用,就一直空閑。 內部碎片 :一個進程申請了一段內存,可是這個進程從來沒有全部使用,一直有最后的一段" />

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

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

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

3天內不再提示

Linux內存方面的初始化和常見的內存分配方式

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:Jasonangel ? 2023-09-28 16:13 ? 次閱讀

在 start_kernel 內核初始化函數中,一共調用 86 個函數去初始化,其中有一個 mm_init 函數,用以初始化內存。

start_kernel
    |--- >mm_init
        |--- >mem_init

linux4.14/init/main.c

圖片

在 mem_init 函數中會初始化伙伴系統和 slab 分配器。

先說兩個概念:

外部碎片 :有一段小內存,夾在兩個大內存中間,兩個大內存已經被分配給進程,這一段小內存由于過小,不夠申請者使用,就一直空閑。

內部碎片 :一個進程申請了一段內存,可是這個進程從來沒有全部使用,一直有最后的一段內存沒有使用。

為了解決這兩個問題,就出現了伙伴系統和 slab 分配器。伙伴系統解決外部碎片問題,slab 分配器解決內部碎片問題。

1、伙伴系統基于頁分配,一次分配多頁,這樣就不會出現夾在中間的小內存。

2、slab 分配器基于字節來分配,特別適用于需要頻繁分配幾十個字節的結構體,我們經常使用的 kmalloc 就是基于 slab 分配器。

3、其實所有的分配方式最底層都是伙伴系統,它先分配好一段大的內存,然后 slab 再從其中分配小的內存。

圖片

這里列出了常見的內存分配 API 接口。

其中最常用的就是 malloc 和 kmalloc,區別在于一個在用戶空間,一個在內核空間,并且 kmalloc 的使用需要注意競爭,需要指明 flag 。

void *kmalloc(size_t size, int flags);

內核編程(驅動編程)一定要注意競爭問題,重要的數據或者內存使用前后一定要加鎖。

在 kmalloc 的使用過程中,常用標志位:GFP_KERNEL、GFP_ATOMIC、GFP_USER、GFP_HIGHUSER、GFP_NOIO、GFP_NOFS。

前兩個最常用,GFP_KERNEL 代表在使用 kmalloc 分配內存時,如果內存準備不足,會等待,也就是會睡眠。GFP_ATOMIC 代表使用 kmalloc 分配內存時,如果內存準備不足,會立刻返回,不會引起睡眠,適合在中斷上下文或者進程上下文中使用。

補充:

1、基于 slab 分配器,出現了 slob 和 slub 分配器。在多核大系統大內存中,一般使用 slub 分配器,在極小的嵌入式系統中,一般使用 slob 分配器(只有600多行代碼)。

2、有的人可能知道 Linux 有一個 bootmem 分配器,這個是在Linux初始化過程中的一個臨時分配器,他會在 setup_arch 函數中初始化,然后在 mm_init 中關掉,只是在伙伴系統出現之前的臨時使用。

bootmem 分配器按塊進行分配,顆粒度很大,不夠精細,比較浪費內存。bootmem 分配器只會在 start_kernel 函數和mm_init 函數之前存在,中間的函數會調用它進行內存分配。

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

    關注

    5095

    文章

    19189

    瀏覽量

    307979
  • 內核
    +關注

    關注

    3

    文章

    1384

    瀏覽量

    40442
  • Linux
    +關注

    關注

    87

    文章

    11351

    瀏覽量

    210504
  • 內存
    +關注

    關注

    8

    文章

    3064

    瀏覽量

    74381
  • 分配器
    +關注

    關注

    0

    文章

    195

    瀏覽量

    25847
收藏 人收藏

    評論

    相關推薦

    Linux應用開發之內存分配

    堆是長度可變的連續虛擬內存,始于進程未初始化數據段的末尾,將堆當前的內存邊界稱為 "program break"。
    發表于 05-08 11:17 ?581次閱讀
    <b class='flag-5'>Linux</b>應用開發之<b class='flag-5'>內存</b><b class='flag-5'>分配</b>

    Linux內存系統: Linux 內存分配算法

    · 減少伙伴算法在分配小塊連續內存時所產生的內部碎片· 將頻繁使用的對象緩存起來,減少分配、初始化和釋放對象的時間開銷· 通過著色技術調整對象以更好的使用硬件高速緩存7、slab
    發表于 08-24 07:44

    鴻蒙內核源碼分析(內存分配篇):內存分配方式有哪些

    詳細的描述,這里結合代碼說。Huawei LiteOS的內存管理分為靜態內存管理和動態內存管理,提供內存初始化
    發表于 11-20 10:07

    鴻蒙內核源碼分析(內存分配篇):內存分配方式有哪些

    ; 開發指南> 內核開發指南> 內存> 概述 看,有更詳細的描述,這里結合代碼說。Huawei LiteOS的內存管理分為靜態內存管理和動態內存管理,提供
    發表于 11-20 17:34

    嵌入式系統內存分配方式是怎樣的

    一篇講透嵌入式系統內存分配方式
    發表于 12-17 07:40

    內存管理程序結構

    數據區未初始化的全局,靜態數據初始化的全局,靜態數據代碼區內存分配方式靜態分配代碼區數據區動態分配
    發表于 12-17 07:15

    一文解析Linux系統保留內存初始化流程

    1、Linux系統保留內存初始化流程在啟動過程中會打印出如下信息,這些信息為linux呈現出系統下的保留內存空間。本文只介紹基本的保留
    發表于 06-30 16:27

    用rt_memheap_init分配內存初始化失敗是何原因?怎么解決?

    用rt_memheap_init分配內存,一到初始化任務分配內存的時候就會出現問題請教一下是什么原因導致這種情況
    發表于 02-13 14:18

    Linux內存初始化

    之前有幾篇博客詳細介紹了Xen的內存初始化,確實感覺這部分內容蠻復雜的。這兩天在看Linux內核啟動中內存初始化,也是看的云里霧里的,想嘗
    發表于 10-12 11:16 ?0次下載

    解析內核初始化時根內存盤的加載過程

    2006-12-12 13:54:41 來源:Linux 寶庫 分享到:標簽:loadlin gzip 作者:opera 概述 ==== 1)當內核配置了內存盤時, 內核在初始化時可以將軟盤加載
    發表于 11-08 10:40 ?0次下載

    淺談內存分配方式 避免內存浪費問題

    說到內存分配方式,就不得不提連續分配方式。這種方式是指為一個用戶程序分配一個連續的內存空間,它
    發表于 03-03 11:22 ?1466次閱讀

    什么是堆內存?堆內存是如何分配的?

    在一般的編譯系統中,堆內存分配方向和棧內存是相反的。當棧內存從高地址向低地址增長的時候,堆內存從低地址向高地址
    的頭像 發表于 07-05 17:58 ?1w次閱讀

    保留Linux內存初始化原理及應用實戰

    linux啟動過程中會打印出如下信息,這些信息為我們呈現出系統下的保留內存空間情況。
    的頭像 發表于 06-05 15:07 ?2504次閱讀
    保留<b class='flag-5'>Linux</b><b class='flag-5'>內存</b>的<b class='flag-5'>初始化</b>原理及應用實戰

    heap_1內存分配方

    heap_1 內存分配方法 動 態 內 存 分 配 需 要 一 個 內 存 堆 , FreeRTOS 中 的 內 存 堆 為 ucHeap[] , 大 小 為
    的頭像 發表于 07-30 10:33 ?670次閱讀

    C語言編程時,各種類型的變量該如何初始化

    C語言編程時,各種類型的變量該如何初始化? 在C語言中,每個變量都需要在使用之前進行初始化初始化是為變量分配內存空間并賦予
    的頭像 發表于 12-07 13:53 ?1346次閱讀
    主站蜘蛛池模板: a爱视频| 久久精品亚洲一级毛片 | 日本高清视频一区 | 一级片免费在线播放 | 高清不卡一区二区三区 | 久久综合久色欧美婷婷 | 天堂资源网 | 99久久精品费精品国产一区二 | 日本a级免费 | 亚洲综合在线一区 | 四虎最新免费网址 | 亚洲深爱 | 四虎国产精品永久在线 | 天天鲁天天爽天天视频 | 康熙古代高h细节肉爽文全文 | 韩国三级在线不卡播放 | 天堂资源在线bt种子8 | 色啦啦影院| 久久免费特黄毛片 | 四虎影院精品在线观看 | 五月婷六月丁香 | 亚洲免费色 | 在线观看视频免费 | 视频黄色在线 | 亚洲不卡视频在线观看 | 校园激情综合网 | 黄色网络在线观看 | 毛片网站网址 | 国产一区二区三区在线观看影院 | 天天想夜夜操 | 成人免费无毒在线观看网站 | 99久久99久久免费精品蜜桃 | 经典三级一区在线播放 | 成人伊人| 亚洲 欧美 91| 久久国产精品视频 | 看黄视频免费 | 轻点灬大ji巴太粗太长了爽文 | 亚洲成人免费在线 | 国产丝袜va丝袜老师 | 东北美女野外bbwbbw免费 |