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

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

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

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

Linux如何防止內(nèi)存沖突?

jf_44130326 ? 來(lái)源:Linux1024 ? 2026-01-30 16:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在聊這個(gè)話題之前,我們先回憶一下單片機(jī)系統(tǒng)中是如何分配內(nèi)存的?如果沒(méi)有bootloader,那硬件環(huán)境起來(lái)之后就直接進(jìn)入主程序運(yùn)行,如果有引導(dǎo)程序bootloader,那就需要設(shè)置好跳轉(zhuǎn)地址,否則設(shè)置不對(duì),系統(tǒng)就無(wú)法啟動(dòng)了。

文章bootloader介紹

那么對(duì)于linux系統(tǒng)來(lái)說(shuō),何嘗不是這樣呢?因?yàn)閘inux系統(tǒng)包含的文件比較多,啟動(dòng)也分幾個(gè)階段,每個(gè)階段也都是通過(guò)跳轉(zhuǎn)執(zhí)行的。如何管理好內(nèi)存是系統(tǒng)穩(wěn)定運(yùn)行的前提。

原生的uboot只能管理自己所在的內(nèi)存塊,無(wú)法管理整塊空間。于是rk引入了bidram和sysmem,用于管理uboot之外的地址空間,RK平臺(tái)就把系統(tǒng)所有內(nèi)存通過(guò)sysmem + bidram + malloc管理起來(lái)了,防止出現(xiàn)內(nèi)存沖突等問(wèn)題。

bidram:管理u-boot、kernel階段不可用、需要剔除的內(nèi)存塊,例如:ATF、OP-TEE 占用的空間;sysmem:管理kernel 可見(jiàn)、可用的內(nèi)存塊。例如:fdt、ramdisk、kernel、fastboot 占用的空間。

相關(guān)代碼:

./lib/sysmem.c./lib/bidram.c./include/memblk.h./arch/arm/mach-rockchip/memblk.c

先來(lái)大概預(yù)覽一下源文件吧:

intsysmem_init(void){  struct sysmem *sysmem = &plat_sysmem;  phys_addr_t mem_start;  phys_size_t mem_size;  int ret;
  lmb_init(&sysmem->lmb);  INIT_LIST_HEAD(&sysmem->allocated_head);  INIT_LIST_HEAD(&sysmem->kmem_resv_head);  sysmem->allocated_cnt = 0;  sysmem->kmem_resv_cnt = 0;
  if (gd->flags & GD_FLG_RELOC) {    sysmem->has_initr = true;  } else {    SYSMEM_I("initn");    sysmem->has_initf = true;  }
  /* Add all available system memory */#ifdef CONFIG_NR_DRAM_BANKS  int i;
  for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {    if (!gd->bd->bi_dram[i].size)      continue;          ret = sysmem_add(gd->bd->bi_dram[i].start,         gd->bd->bi_dram[i].size);    if (ret) {      SYSMEM_E("Failed to add sysmem from bi_dram[%d]n", i);      goto fail;    }  }#else  mem_start = env_get_bootm_low();  mem_size = env_get_bootm_size();  ret = sysmem_add(mem_start, mem_size);  if (ret) {    SYSMEM_E("Failed to add sysmem from bootm_low/sizen");    goto fail;  }#endif  /* Reserved for board */  ret = board_sysmem_reserve(sysmem);  if (ret) {    SYSMEM_E("Failed to reserve sysmem for boardn");    goto fail;  }
  /* Reserved for U-boot framework: 'reserve_xxx()' */  mem_start = gd->start_addr_sp;  mem_size = gd->ram_top - mem_start;  if (!sysmem_alloc_base(MEM_UBOOT, mem_start, mem_size)) {    SYSMEM_E("Failed to reserve sysmem for U-Boot frameworkn");    ret = -ENOMEM;    goto fail;  }    /* Reserved for U-Boot stack */  mem_start = gd->start_addr_sp - CONFIG_SYS_STACK_SIZE;  mem_size = CONFIG_SYS_STACK_SIZE;  if (!sysmem_alloc_base(MEM_STACK, mem_start, mem_size)) {    SYSMEM_E("Failed to reserve sysmem for stackn");    ret = -ENOMEM;    goto fail;}return0;fail:  if (ret && !(gd->flags & GD_FLG_RELOC)) {    sysmem_dump();    SYSMEM_W("Maybe malloc size %d MiB is too large?nn",       SIZE_MB(CONFIG_SYS_MALLOC_LEN));}  return ret;}

wKgZO2kaoBuAZ_V-AAI2mYVdcis437.png

sysmem 內(nèi)存信息表:

sysmem_dump_all:--------------------------------------------------------------------// <1> 這里是sysmem可管理的總內(nèi)存容量,即bidram<3>之外的可用ddr容量,對(duì)kernel可見(jiàn)。memory.rgn[0].addr = 0x00200000 - 0x08400000 (size: 0x08200000)memory.rgn[1].addr = 0x0a200000 - 0x80000000 (size: 0x75e00000)memory.total = 0x7e000000 (2016 MiB. 0 KiB)--------------------------------------------------------------------// <2> 這里顯示了各個(gè)固件alloc走的內(nèi)存塊信息allocated.rgn[0].name = "U-Boot".addr = 0x71dd6140 - 0x80000000 (size: 0x0e229ec0)allocated.rgn[1].name = "STACK"  // 表明棧溢出.addr = 0x71bd6140 - 0x71dd6140 (size: 0x00200000)allocated.rgn[2].name = "FDT".addr = 0x08300000 - 0x08316204 (size: 0x00016204)allocated.rgn[3].name = "KERNEL"  // 表明內(nèi)存塊溢出.addr = 0x00280000 - 0x014ce204 (size: 0x0124e204)allocated.rgn[4].name = "RAMDISK".addr = 0x0a200000 - 0x0a3e6804 (size: 0x001e6804)// <3> malloc_r/f的大小malloc_r: 192 MiB, malloc_f: 16 KiBallocated.total = 0x0f874acc (248 MiB. 466 KiB)--------------------------------------------------------------------// <4> 這里是核心算法對(duì)上述<2>進(jìn)行的信息整理,顯示被占用走的內(nèi)存塊信息LMB.reserved[0].addr = 0x00280000 - 0x014ce204 (size: 0x0124e204)LMB.reserved[1].addr = 0x08300000 - 0x08316204 (size: 0x00016204)LMB.reserved[2].addr = 0x0a200000 - 0x0a3e6804 (size: 0x001e6804)LMB.reserved[3].addr = 0x71bd6140 - 0x80000000 (size: 0x0e429ec0)reserved.core.total = 0x0f874acc (248 MiB. 466 KiB)--------------------------------------------------------------------

wKgZO2kaoByAKD5mAAJLI4NkLSo384.png

bidram 內(nèi)存信息表:

bidram_dump_all:--------------------------------------------------------------------// <1> 這里顯示了U-Boot從前級(jí)loader獲取的ddr的總?cè)萘啃畔?,一共?GBmemory.rgn[0].addr = 0x00000000 - 0x80000000 (size: 0x80000000)memory.total = 0x80000000 (2048 MiB. 0 KiB)--------------------------------------------------------------------// <2> 這里顯示了被預(yù)留起來(lái)的各固件內(nèi)存信息,這些空間對(duì)kernel不可見(jiàn)reserved.rgn[0].name = "ATF".addr = 0x00000000 - 0x00100000 (size: 0x00100000)reserved.rgn[1].name = "SHM".addr = 0x00100000 - 0x00200000 (size: 0x00100000)reserved.rgn[2].name = "OP-TEE".addr = 0x08400000 - 0x0a200000 (size: 0x01e00000)reserved.total = 0x02000000 (32 MiB. 0 KiB)--------------------------------------------------------------------// <3> 這里是核心算法對(duì)上述<2>進(jìn)行的預(yù)留信息整理,例如:會(huì)對(duì)相鄰塊進(jìn)行合并LMB.reserved[0].addr = 0x00000000 - 0x00200000 (size: 0x00200000)LMB.reserved[1].addr = 0x08400000 - 0x0a200000 (size: 0x01e00000)reserved.core.total = 0x02000000 (32 MiB. 0 KiB)--------------------------------------------------------------------
通過(guò)上述內(nèi)存管理,調(diào)試中在出現(xiàn)問(wèn)題時(shí),可以結(jié)合分析表去分析問(wèn)題,如:

wKgZO2kaoByAXx1tAADnSWIwWq8282.png


原文標(biāo)題:Linux如何防止內(nèi)存沖突?

文章出處:【微信公眾號(hào):Linux1024】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11696

    瀏覽量

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

    關(guān)注

    9

    文章

    3194

    瀏覽量

    76267
  • bootloader
    +關(guān)注

    關(guān)注

    2

    文章

    243

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)存管理是什么,Linux內(nèi)存管理詳解

    Linux內(nèi)存管理 Linux內(nèi)存管理是一個(gè)非常復(fù)雜的過(guò)程,主要分成兩個(gè)大的部分:內(nèi)核的內(nèi)存管理和進(jìn)程虛擬
    的頭像 發(fā)表于 05-11 17:54 ?7095次閱讀
    <b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b>管理是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b>管理詳解

    linux內(nèi)存相關(guān)知識(shí)科普

    linux 內(nèi)存組織結(jié)構(gòu)和頁(yè)面布局,內(nèi)存碎片產(chǎn)生原因和優(yōu)化算法。
    發(fā)表于 08-08 10:57 ?625次閱讀

    走進(jìn)Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機(jī)制和奧秘

    Linux 內(nèi)存是后臺(tái)開(kāi)發(fā)人員,需要深入了解的計(jì)算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
    的頭像 發(fā)表于 01-05 09:47 ?2357次閱讀

    關(guān)于Linux內(nèi)存管理的詳細(xì)介紹

    Linux內(nèi)存管理是指對(duì)系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在Linux中,內(nèi)存被劃分為多個(gè)區(qū)域,每個(gè)區(qū)域有不同
    發(fā)表于 03-06 09:28 ?1411次閱讀

    Linux內(nèi)存相關(guān)知識(shí)科普

    Linux 內(nèi)存是后臺(tái)開(kāi)發(fā)人員,需要深入了解的計(jì)算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹**Linu****x 內(nèi)存組織結(jié)構(gòu)和頁(yè)面布局,
    發(fā)表于 07-25 14:43 ?1151次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>相關(guān)知識(shí)科普

    Linux內(nèi)核的內(nèi)存管理詳解

    內(nèi)存管理的主要工作就是對(duì)物理內(nèi)存進(jìn)行組織,然后對(duì)物理內(nèi)存的分配和回收。但是Linux引入了虛擬地址的概念。
    發(fā)表于 08-31 14:46 ?1340次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核的<b class='flag-5'>內(nèi)存</b>管理詳解

    請(qǐng)問(wèn)如何對(duì)多中斷使用防止沖突

    在STM32中,如何對(duì)多中斷使用,防止沖突
    發(fā)表于 04-10 01:22

    Linux中的沖突問(wèn)題及其應(yīng)對(duì)策略

    Linux服務(wù)器系統(tǒng)是不存在沖突的,然而些許時(shí)候該系統(tǒng)的沖突、停滯問(wèn)題的確存在。對(duì)于應(yīng)用軟件層面的沖突或者停滯問(wèn)題,與內(nèi)核層面有何不同呢?
    發(fā)表于 05-16 11:41 ?1027次閱讀

    linux內(nèi)存管理機(jī)制淺析

    本內(nèi)容介紹了arm linux內(nèi)存管理機(jī)制,詳細(xì)說(shuō)明了linux內(nèi)核內(nèi)存管理,linux虛擬內(nèi)存
    發(fā)表于 12-19 14:09 ?73次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b>管理機(jī)制淺析

    linux內(nèi)存管理

    linux內(nèi)存管理
    發(fā)表于 10-24 11:12 ?3次下載
    <b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b>管理

    你知道linux內(nèi)存管理基礎(chǔ)及方法?

    linux內(nèi)存管理采取的分頁(yè)存取機(jī)制,會(huì)將內(nèi)存中不經(jīng)常使用的數(shù)據(jù)塊交換到虛擬內(nèi)存中。linux會(huì)不時(shí)地進(jìn)行頁(yè)面交換操作,以保持盡可能多的空
    發(fā)表于 04-28 17:12 ?1582次閱讀

    一文解析Linux內(nèi)存系統(tǒng)

    Linux 內(nèi)存是后臺(tái)開(kāi)發(fā)人員,需要深入了解的計(jì)算機(jī)資源。合理的使用內(nèi)存,有助于提升機(jī)器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
    的頭像 發(fā)表于 09-01 10:46 ?3001次閱讀
    一文解析<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>系統(tǒng)

    深入剖析Linux共享內(nèi)存原理

    Linux系統(tǒng)中,每個(gè)進(jìn)程都有獨(dú)立的虛擬內(nèi)存空間,也就是說(shuō)不同的進(jìn)程訪問(wèn)同一段虛擬內(nèi)存地址所得到的數(shù)據(jù)是不一樣的,這是因?yàn)椴煌M(jìn)程相同的虛擬內(nèi)存地址會(huì)映射到不同的物理
    的頭像 發(fā)表于 10-30 09:52 ?2842次閱讀
    深入剖析<b class='flag-5'>Linux</b>共享<b class='flag-5'>內(nèi)存</b>原理

    Linux系統(tǒng)的共享內(nèi)存的使用

    但有時(shí)候?yàn)榱俗尣煌M(jìn)程之間進(jìn)行通信,需要讓不同進(jìn)程共享相同的物理內(nèi)存,Linux通過(guò) 共享內(nèi)存 來(lái)實(shí)現(xiàn)這個(gè)功能。下面先來(lái)介紹一下Linux系統(tǒng)的共享
    的頭像 發(fā)表于 11-14 11:55 ?2022次閱讀

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對(duì)系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮等一系列操作的管理。在
    的頭像 發(fā)表于 11-10 14:58 ?1238次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)存</b>管理總結(jié)