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

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

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

    關注

    5082

    文章

    19104

    瀏覽量

    304817
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40280
  • Linux
    +關注

    關注

    87

    文章

    11292

    瀏覽量

    209331
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74005
  • 分配器
    +關注

    關注

    0

    文章

    193

    瀏覽量

    25747
收藏 人收藏

    評論

    相關推薦

    Linux應用開發之內存分配

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

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

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

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

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

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

    C語言編程時,各種類型的變量該如何初始化? 在C語言中,每個變量都需要在使用之前進行初始化初始化是為變量分配內存空間并賦予
    的頭像 發表于 12-07 13:53 ?1207次閱讀
    主站蜘蛛池模板: 国拍自产精品福利区| 亚洲免费视频在线| 欧美色图一区二区三区| 久久青草费线频观看国产| 黑人猛挺进小莹的体内视频| 国产精品人妻无码久久久蜜桃臀| 电影日本妻子| 动漫美女被h动态图| 成人免费观看www视频| xxx日本免费| xxx日本黄色| 苍井空教师BD在线观看全集| xnxx高中生| 超碰在线视频| 高傲教师麻麻被同学调教123| 单亲妈妈3韩国电影免费观看| xxxx美国老师1819| yellow视频免费观看| www.青青草.com| 成人小视频在线观看| 国产av在线看的| 国产精品一区二区欧美视频| 国产午夜精品片一区二区三区| 国产亚洲美女在线视频视频 | 双手绑在床头调教乳尖| 日本浴室日产在线系列| 脱女学小内内摸出水网站免费 | 美女被黑人巨大进入| 暖暖日本大全免费观看| 秋霞午夜理论理论福利无码| 日韩亚射吧| 消息称老熟妇乱视频一区二区 | 日本高清免费观看| 日日夜夜狠狠干| 性派对xxxhd| 伊人久99久女女视频精品免| 最近免费中文字幕MV在线视频3| 99久久99久久精品| 福利视频久久| 娇妻中日久久持久久| 蜜臀AV人妻久久无码精品麻豆|