亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現(xiàn)在的位置是:首頁 > 技術(shù)閱讀 >  u-boot2020.04移植(小記:重定位前后保留的堆內(nèi)存是如何被malloc的)

u-boot2020.04移植(小記:重定位前后保留的堆內(nèi)存是如何被malloc的)

時間:2024-06-01

文章目錄

  • 重定位前的堆內(nèi)存池

  • 那當(dāng)我們使用malloc時,它是如何給我們分配內(nèi)存的呢?

  • 以malloc為例

  • 再來看下重定位后

  • 結(jié)論

點擊下方閱讀原文可訪問文中超鏈接

重定位前的堆內(nèi)存池

首先看一下重定位前,在重定位前也就是第一階段,u-boot會保留一片內(nèi)存用于堆,也就是gd->malloc_base這篇區(qū)域,其大小為0x400,具體見下面的內(nèi)存圖:

圖1

那當(dāng)我們使用malloc時,它是如何給我們分配內(nèi)存的呢?

在源碼中搜索malloc可以在include/malloc.h中找到下面的宏定義:

/*你可能發(fā)現(xiàn)很多重復(fù)的宏定義,但是經(jīng)過分析,最終生效的是下面這些*/
# define cALLOc calloc
# define fREe free
# define mALLOc malloc
# define mEMALIGn memalign
# define rEALLOc realloc
# define vALLOc valloc
# define pvALLOc pvalloc
# define mALLINFo mallinfo
# define mALLOPt mallopt

以malloc為例

直接搜malloc的實現(xiàn)是搜不到的,因為它的實現(xiàn)是由mALLOc函數(shù)完成的(看上面的宏定義mALLOc會被替換成malloc),其函數(shù)體在common/dlmalloc.c文件中:

#if __STD_C
Void_t* mALLOc(size_t bytes)
#else
Void_t* mALLOc(bytes) size_t bytes;
#endif
{
/*定義了一堆變量*/
/*
省略
*/


/*這個宏定義了,才能在重定位前使用malloc來申請內(nèi)存*/
#if CONFIG_VAL(SYS_MALLOC_F_LEN)
/*這個標(biāo)志是在board_init_r里面設(shè)置的,也就是重定位
完成,所以重定位前使用的就是這種分配方式*/

if (!(gd->flags & GD_FLG_FULL_MALLOC_INIT))
return malloc_simple(bytes);
#endif

/*下面就是重定位后的分配方式,太長了,有200多行,直接省
略,感興趣的直接看源碼吧*/

/*
省略
*/

}

本文不討論其內(nèi)存的分配策略,僅為找到malloc的源頭。

從下面的代碼可以看出重定位前使用的堆內(nèi)存池是gd->malloc_base這片區(qū)域,重定位前使用的策略比較簡單,就是分塊,一塊一塊的對外分配就完了:

static void *alloc_simple(size_t bytes, int align)
{
ulong addr, new_ptr;
void *ptr;

addr = ALIGN(gd->malloc_base + gd->malloc_ptr, align);
new_ptr = addr + bytes - gd->malloc_base;
log_debug("size=%zx, ptr=%lx, limit=%lx: ", bytes, new_ptr,
gd->malloc_limit);
if (new_ptr > gd->malloc_limit) {
log_err("alloc space exhausted\n");
return NULL;
}

ptr = map_sysmem(addr, bytes);
gd->malloc_ptr = ALIGN(new_ptr, sizeof(new_ptr));

return ptr;
}

再來看下重定位后

還是先看下重定位后的內(nèi)存圖:

圖2

從圖上可以看出,重定位后的堆內(nèi)存空間比重定位前的內(nèi)存空間要大得多,這篇區(qū)域在重定位前僅是保留的,沒有任何指針指向這里,在board_init_r階段,這片區(qū)域的起始地址才和一個全局變量mem_malloc_start綁定,用于重定位后的堆內(nèi)存,代碼如下:

/*common/board_r.c*/

static int initr_malloc(void)
{
ulong malloc_start;

#if CONFIG_VAL(SYS_MALLOC_F_LEN)
debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
gd->malloc_ptr / 1024);
#endif
/* The malloc area is immediately below the monitor copy in DRAM */
/*
* This value MUST match the value of gd->start_addr_sp in board_f.c:
* reserve_noncached().
*/

malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
TOTAL_MALLOC_LEN);
return 0;
}

-->
/*common/dlmalloc.c*/

void mem_malloc_init(ulong start, ulong size)
{
mem_malloc_start = start;
mem_malloc_end = start + size;
mem_malloc_brk = start;

debug("using memory %#lx-%#lx for malloc()\n", mem_malloc_start,
mem_malloc_end);
#ifdef CONFIG_SYS_MALLOC_CLEAR_ON_INIT
memset((void *)mem_malloc_start, 0x0, size);
#endif
malloc_bin_reloc();
}

由于重定位后的內(nèi)存分配代碼太長了,這里僅僅看下重定位后的malloc使用的哪片內(nèi)存區(qū)域,首先有一個很重要的宏:

#ifndef MORECORE
#define MORECORE sbrk
#endif

sbrk是一個函數(shù),主要操作mem_malloc_brk全局變量,檢查新申請內(nèi)存時,是否落在有效的堆內(nèi)存空間內(nèi),代碼如下:

void *sbrk(ptrdiff_t increment)
{
ulong old = mem_malloc_brk;
ulong new = old + increment;

/*
* if we are giving memory back make sure we clear it out since
* we set MORECORE_CLEARS to 1
*/

if (increment < 0)
memset((void *)new, 0, -increment);

if ((new < mem_malloc_start) || (new > mem_malloc_end))
return (void *)MORECORE_FAILURE;

mem_malloc_brk = new;

return (void *)old;
}

和前面的malloc一樣,直接搜sbrk是搜不到調(diào)用它的函數(shù)的,我們要搜索MORECORE,從搜索結(jié)果來看,其被mALLOc調(diào)用,可以知道重定位后就是使用的內(nèi)存圖中重定位后的那片堆內(nèi)存空間。

結(jié)論

從上面的分析來看,重定位后使用的新的堆內(nèi)存空間,之前的那片內(nèi)存相當(dāng)于就廢棄了沒用了,也就解釋了當(dāng)時看完board_init_r函數(shù)時,發(fā)現(xiàn)有兩片堆空間的疑惑了。

歡迎掃碼關(guān)注我的微信公眾號

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
最新国产拍偷乱拍精品| 国产精品国产成人国产三级| 久久高清一区| 亚洲欧美视频一区二区三区| 99视频精品全部免费在线| 亚洲精品国久久99热| 黄网站色欧美视频| 欲色影视综合吧| 国产精品一级| 在线观看国产成人av片| 一区二区免费在线观看| 欧美在线视频在线播放完整版免费观看 | 性做久久久久久久免费看| 久久久欧美精品sm网站| 欧美日韩免费看| 在线成人激情黄色| 亚洲国产成人高清精品| 国产精品久久久| 亚洲黄色av一区| 欧美在线观看视频| 欧美日韩妖精视频| 亚洲国产网站| 亚洲国产精品尤物yw在线观看| 国产精品日韩欧美| 亚洲电影在线| 久久精品久久99精品久久| 欧美亚男人的天堂| 亚洲人成77777在线观看网| 久久精品视频在线看| 国产精品高潮呻吟久久av无限| 最近看过的日韩成人| 久久综合伊人77777蜜臀| 国产女精品视频网站免费| 在线亚洲一区二区| 欧美人与性动交α欧美精品济南到| 黄色影院成人| 欧美中文在线字幕| 国产精品中文字幕欧美| 亚洲天堂成人在线观看| 欧美日韩国产精品一区二区亚洲| 亚洲国产欧美不卡在线观看| 久久亚洲综合| 怡红院精品视频在线观看极品| 久久av一区二区三区漫画| 国产伦精品一区二区三区视频孕妇| 亚洲视频 欧洲视频| 欧美丝袜第一区| 在线综合欧美| 国产精品乱码一区二三区小蝌蚪| 亚洲一区二区三区精品动漫| 国产精品久久国产精麻豆99网站| 一区二区三区成人精品| 欧美视频免费在线| 亚洲欧美日韩一区二区| 国产视频一区在线| 久久噜噜亚洲综合| 亚洲黄色一区| 欧美日韩精品一区二区三区| 亚洲视频在线免费观看| 国产精品午夜国产小视频| 午夜欧美理论片| 国产综合视频| 欧美高清影院| 亚洲天堂男人| 国产亚洲综合精品| 蜜桃视频一区| 一区二区精品国产| 国产欧美日韩在线观看| 久久久久高清| 亚洲免费观看高清在线观看 | 亚洲激情在线观看| 欧美国产精品一区| 亚洲一区二区毛片| 国产美女精品| 久久这里只有| 亚洲免费电影在线观看| 国产精品v欧美精品v日本精品动漫| 亚洲婷婷综合色高清在线| 国产精品专区h在线观看| 久久资源在线| 99国产精品国产精品毛片| 国产精品v片在线观看不卡| 中日韩男男gay无套 | 亚洲一区在线免费| 国产美女搞久久| 美女诱惑黄网站一区| 亚洲午夜精品福利| 国产欧美一区二区精品性 | 国产美女一区二区| 麻豆免费精品视频| 亚洲一区三区电影在线观看| 激情视频一区| 欧美日韩亚洲免费| 久久影视精品| 午夜视频一区| 99精品视频免费| 一区二区视频免费完整版观看| 欧美日韩综合在线| 欧美777四色影视在线| 午夜影视日本亚洲欧洲精品| 亚洲激情自拍| 国产一区二区三区久久久| 欧美日韩小视频| 欧美成年视频| 久久久久久久久久久久久9999| 亚洲视频在线看| 亚洲人成7777| 精品av久久久久电影| 国产精品久久久久三级| 欧美激情亚洲视频| 久久综合一区二区三区| 欧美一区二区黄| 亚洲网站视频福利| 日韩一级大片在线| 亚洲激情在线| 伊人久久综合| 海角社区69精品视频| 国产精品一级二级三级| 欧美性大战久久久久| 欧美人成在线| 欧美v日韩v国产v| 久久亚洲综合网| 久久久久国产精品www | 国产精品视频在线观看| 欧美日本免费一区二区三区| 玖玖国产精品视频| 久久九九热re6这里有精品| 亚洲男人影院| 这里是久久伊人| 一区二区三区四区五区精品视频| 亚洲日本电影| 亚洲区中文字幕| 亚洲精品一区中文| 亚洲国产精品一区二区第一页| 国内久久精品视频| 韩国av一区二区三区四区| 国产主播精品在线| 国产一区二区在线观看免费播放 | 亚洲视频www| 一本色道久久综合精品竹菊| 亚洲人成在线观看网站高清| 亚洲国产一区二区三区a毛片| 亚洲福利视频一区| 亚洲国产女人aaa毛片在线| 亚洲欧洲视频在线| 99这里有精品| 亚洲一区二区在线| 亚洲欧美日韩一区二区三区在线| 亚洲一区自拍| 久久精品一二三区| 麻豆精品在线视频| 欧美精品18+| 国产精品盗摄一区二区三区| 国产精品久久久久一区| 国产欧美日韩视频一区二区| 国产在线视频欧美一区二区三区| 伊人色综合久久天天五月婷| 亚洲日韩第九十九页| 亚洲永久网站| 久久久亚洲国产天美传媒修理工| 欧美freesex交免费视频| 欧美成人自拍| 国产精品啊啊啊| 国产在线欧美| 亚洲精品国产日韩| 亚洲欧美国产视频| 噜噜噜噜噜久久久久久91| 欧美日韩国内| 国产亚洲欧美激情| 亚洲精品久久久久久久久久久久久 | 国产精品一区=区| 国产一区二区三区免费不卡| 亚洲二区三区四区| 亚洲视频一区| 久久夜精品va视频免费观看| 欧美日韩亚洲一区| 黑人一区二区| 国产精品99久久久久久久女警| 亚洲欧美综合v| 欧美国产精品中文字幕| 国产精品乱码久久久久久| 在线日韩欧美视频| 亚洲影院污污.| 欧美不卡高清| 国产欧美一区二区精品婷婷 | 欧美一级视频一区二区| 卡一卡二国产精品| 欧美性猛交xxxx免费看久久久 | 国产精品一区二区女厕厕| 伊人成人开心激情综合网| 亚洲午夜免费视频| 美女黄网久久| 国产日韩欧美在线播放| 日韩视频在线免费| 久久久另类综合| 国产农村妇女精品一区二区| 亚洲每日在线| 免费不卡视频| 国产日韩欧美中文| 亚洲性视频h|