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

chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Linux內(nèi)存方面的初始化和常見的內(nèi)存分配方式

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:Jasonangel ? 2023-09-28 16:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在 start_kernel 內(nèi)核初始化函數(shù)中,一共調(diào)用 86 個函數(shù)去初始化,其中有一個 mm_init 函數(shù),用以初始化內(nèi)存。

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

linux4.14/init/main.c

圖片

在 mem_init 函數(shù)中會初始化伙伴系統(tǒng)和 slab 分配器。

先說兩個概念:

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

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

為了解決這兩個問題,就出現(xiàn)了伙伴系統(tǒng)和 slab 分配器。伙伴系統(tǒng)解決外部碎片問題,slab 分配器解決內(nèi)部碎片問題。

1、伙伴系統(tǒng)基于頁分配,一次分配多頁,這樣就不會出現(xiàn)夾在中間的小內(nèi)存。

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

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

圖片

這里列出了常見的內(nèi)存分配 API 接口。

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

void *kmalloc(size_t size, int flags);

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

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

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

補充:

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

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

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

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

    關注

    5152

    文章

    19675

    瀏覽量

    317643
  • 內(nèi)核
    +關注

    關注

    3

    文章

    1416

    瀏覽量

    41443
  • Linux
    +關注

    關注

    87

    文章

    11511

    瀏覽量

    213838
  • 內(nèi)存
    +關注

    關注

    8

    文章

    3125

    瀏覽量

    75274
  • 分配器
    +關注

    關注

    0

    文章

    204

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux應用開發(fā)之內(nèi)存分配

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

    Linux內(nèi)存系統(tǒng): Linux 內(nèi)存分配算法

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

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

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

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

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

    嵌入式系統(tǒng)內(nèi)存分配方式是怎樣的

    一篇講透嵌入式系統(tǒng)內(nèi)存分配方式
    發(fā)表于 12-17 07:40

    內(nèi)存管理程序結構

    數(shù)據(jù)區(qū)未初始化的全局,靜態(tài)數(shù)據(jù)初始化的全局,靜態(tài)數(shù)據(jù)代碼區(qū)內(nèi)存分配方式靜態(tài)分配代碼區(qū)數(shù)據(jù)區(qū)動態(tài)分配
    發(fā)表于 12-17 07:15

    一文解析Linux系統(tǒng)保留內(nèi)存初始化流程

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

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

    用rt_memheap_init分配內(nèi)存,一到初始化任務分配內(nèi)存的時候就會出現(xiàn)問題請教一下是什么原因?qū)е逻@種情況
    發(fā)表于 02-13 14:18

    Linux內(nèi)存初始化

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

    解析內(nèi)核初始化時根內(nèi)存盤的加載過程

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

    淺談內(nèi)存分配方式 避免內(nèi)存浪費問題

    說到內(nèi)存分配方式,就不得不提連續(xù)分配方式。這種方式是指為一個用戶程序分配一個連續(xù)的內(nèi)存空間,它
    發(fā)表于 03-03 11:22 ?1563次閱讀

    什么是堆內(nèi)存?堆內(nèi)存是如何分配的?

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

    保留Linux內(nèi)存初始化原理及應用實戰(zhàn)

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

    heap_1內(nèi)存分配方

    heap_1 內(nèi)存分配方法 動 態(tài) 內(nèi) 存 分 配 需 要 一 個 內(nèi) 存 堆 , FreeRTOS 中 的 內(nèi) 存 堆 為 ucHeap[] , 大 小 為
    的頭像 發(fā)表于 07-30 10:33 ?929次閱讀

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

    C語言編程時,各種類型的變量該如何初始化? 在C語言中,每個變量都需要在使用之前進行初始化初始化是為變量分配內(nèi)存空間并賦予
    的頭像 發(fā)表于 12-07 13:53 ?1857次閱讀