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

欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

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

麥辣雞腿堡 ? 來(lái)源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:Jasonangel ? 2023-09-28 16:13 ? 次閱讀

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

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

linux4.14/init/main.c

圖片

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

先說(shuō)兩個(gè)概念:

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

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

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

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

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

3、其實(shí)所有的分配方式最底層都是伙伴系統(tǒng),它先分配好一段大的內(nèi)存,然后 slab 再?gòu)钠渲蟹峙湫〉膬?nèi)存。

圖片

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

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

void *kmalloc(size_t size, int flags);

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

在 kmalloc 的使用過(guò)程中,常用標(biāo)志位:GFP_KERNEL、GFP_ATOMIC、GFP_USER、GFP_HIGHUSER、GFP_NOIO、GFP_NOFS。

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

補(bǔ)充:

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

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

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

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

    關(guān)注

    5094

    文章

    19184

    瀏覽量

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

    關(guān)注

    3

    文章

    1383

    瀏覽量

    40434
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11350

    瀏覽量

    210466
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3060

    瀏覽量

    74353
  • 分配器
    +關(guān)注

    關(guān)注

    0

    文章

    195

    瀏覽量

    25840
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

    內(nèi)存管理程序結(jié)構(gòu)

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

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

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

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

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

    Linux內(nèi)存初始化

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

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

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

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

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

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

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

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

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

    heap_1內(nèi)存分配方

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

    C語(yǔ)言編程時(shí),各種類型的變量該如何初始化?

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