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

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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5141

    文章

    19526

    瀏覽量

    314857
  • 內核
    +關注

    關注

    3

    文章

    1409

    瀏覽量

    41090
  • Linux
    +關注

    關注

    87

    文章

    11457

    瀏覽量

    212766
  • 內存
    +關注

    關注

    8

    文章

    3108

    瀏覽量

    74983
  • 分配器
    +關注

    關注

    0

    文章

    203

    瀏覽量

    26140
收藏 0人收藏
  • jf_753400421

評論

相關推薦
熱點推薦

Linux應用開發之內存分配

堆是長度可變的連續虛擬內存,始于進程未初始化數據段的末尾,將堆當前的內存邊界稱為 "program break"。
發表于 05-08 11:17 ?651次閱讀
<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 ?1541次閱讀

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

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

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

linux啟動過程中會打印出如下信息,這些信息為我們呈現出系統下的保留內存空間情況。
的頭像 發表于 06-05 15:07 ?2761次閱讀
保留<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 ?857次閱讀

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

C語言編程時,各種類型的變量該如何初始化? 在C語言中,每個變量都需要在使用之前進行初始化初始化是為變量分配內存空間并賦予
的頭像 發表于 12-07 13:53 ?1757次閱讀
主站蜘蛛池模板: 超碰97人人做人人爱亚洲尤物 | 国产色婷婷精品人妻蜜桃成熟时 | 国内精品免费久久影院 | 91亚洲精品福利在线播放 | 久久久这里有精品999 | 久久综合色一综合色88中文 | 真实处破女全过程完免费观看 | 国产免费不卡 | 国产99r视频精品免费观看 | 成人在线免费视频 | 青柠在线观看视频在线 | 久久视频精品38在线播放 | 国产女人喷潮视频免费 | 小草影院免费 | 最近中文字幕MV免费高清在线 | 国产h视频在线观看免费 | 国产精品人妻无码久久久蜜桃 | 精品亚洲麻豆1区2区3区 | 免费果冻传媒2021在线看 | 欧美性xxx极品 | 动漫美女无衣 | 亚洲AV无码久久流水呻蜜桃久色 | 亚洲中文字幕日本在线观看 | 在线超碰免费视频观看 | 99久久免费热在线精品 | 先锋影音av最新资源 | 在线免费观看毛片网站 | 亚洲成人三级 | 国产区免费在线观看 | 国产亚洲精品黑人粗大精选 | 蜜芽一二三区 | 国产一区二区三区内射高清 | 换脸国产AV一区二区三区 | 97在线观看免费视频 | 亚洲色婷婷久久精品AV蜜桃 | 伊在香蕉国产在线视频 | 亚洲AV怡红院AV男人的天堂 | 最近中文字幕2019免费版日本 | 亚洲免费网站观看视频 | av影音先锋天堂网 | 呜呜别塞了啊抽插 |

電子發燒友

中國電子工程師最喜歡的網站

  • 2931785位工程師會員交流學習
  • 獲取您個性化的科技前沿技術信息
  • 參加活動獲取豐厚的禮品