吴忠躺衫网络科技有限公司

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

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

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

RT-Smart頁初始化相關(guān)功能及物理頁分配算法伙伴系統(tǒng)的實現(xiàn)

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:我夏了夏天 ? 2022-10-19 10:05 ? 次閱讀

想要對 RT-Smart 的物理頁內(nèi)存管理功能有所了解,需要熟悉相關(guān)代碼:

RT-Smart 頁初始化相關(guān)功能

物理頁分配算法伙伴系統(tǒng)的實現(xiàn)

物理頁管理初始化

在系統(tǒng)初始化早期,會先執(zhí)行 rt_page_init 函數(shù)來對物理頁管理所需要的數(shù)據(jù)結(jié)構(gòu)進行初始化,下面是對這段代碼的詳細解釋:

 1#defineARCH_PAGE_SHIFT12
 2#defineARCH_PAGE_SIZE(1<>ARCH_PAGE_SHIFT;
40/*計算需要多少個頁的內(nèi)存用于存放管理頁數(shù)據(jù)結(jié)構(gòu)*/
41intmnr=(total+nr)/(nr+1);
42LOG_D("nr=0x%08x
",nr);
43LOG_D("total=0x%08x
",total);
44LOG_D("mnr=0x%08x
",mnr);
45page_start=(structpage*)reg.start;
46/*計算除去用于管理的內(nèi)存頁,可用于物理頁分配的起始地址*/
47reg.start+=(mnr<>ARCH_PAGE_SHIFT;
51}
52LOG_D("align0x%08x0x%08x
",reg.start,reg.end);
53/*初始化空閑page分配鏈表*/
54for(i=0;isize_bits=ARCH_ADDRESS_WIDTH_BITS;
80p->ref_cnt=1;
81/*將相應的管理頁結(jié)構(gòu)體加入到頁空閑鏈表上,
82由此可以知道物理頁空閑鏈表上掛接的是物理頁的管理結(jié)構(gòu)體*/
83_pages_free(p,size_bits-ARCH_PAGE_SHIFT);
84reg.start+=(1UL<

物理頁管理算法簡介

伙伴系統(tǒng)在現(xiàn)代操作系統(tǒng)中被廣泛地用于分配連續(xù)的物理內(nèi)存頁。其基本思想是將物理內(nèi)存劃分成連續(xù)的塊,以塊作為基本單位進行分配。不同塊的大小可以不同,但每個塊都由一個或多個連續(xù)的物理頁組成,物理頁的數(shù)量必須是 2 的 n 次冪( 0 <= n < 預設的最大值),其中預設的最大值將決定能夠分配的連續(xù)物理內(nèi)存區(qū)域的最大大小,一般由開發(fā)者根據(jù)實際需要指定。

當一個請求需要分配 m 個物理頁時,伙伴系統(tǒng)將尋找一個大小合適的塊,該塊包含 $2^n$ 個物理頁,且滿足 $2^{n-1} < m < 2^n$。在處理分配請求的過程中,大的塊可以分裂成兩半,即兩個小一號的塊,這兩個塊互為伙伴。分裂得到塊可以繼續(xù)分裂,直到得到一個大小合適的塊去服務相應的分配請求。在一個塊被釋放后,分配器會找到其伙伴塊,若伙伴塊頁處于空閑的狀態(tài),則將這兩個伙伴塊進行合并沒形成一個大一號的空閑塊,然后繼續(xù)嘗試向上合并。由分裂操作和合并操作都是級聯(lián)的,因此能夠很好地緩解外部碎片的問題。

下圖表達了伙伴系統(tǒng)的基本思想,基于伙伴塊進行分裂與合并。

22866cc4-4ee3-11ed-a3b6-dac502259ad0.png

伙伴系統(tǒng)實現(xiàn)

在 RT-Smart 系統(tǒng)中,使用空閑鏈表數(shù)組來實現(xiàn)伙伴系統(tǒng)。具體來說,全局有一個有序數(shù)組,數(shù)組的每一項指向一條空閑鏈表,每條鏈表將其對應大小的空閑塊連接起來,一條鏈表中的空閑塊大小相同。當接收到分配請求后,伙伴分配器首先算出應該分配多大的空閑塊,然后查找對應的空閑鏈表。

想要了解物理頁算法的實現(xiàn)過程,那就要熟悉物理頁的申請和釋放算法,也就是頁面釋放函數(shù) _pages_free 和物理頁申請函數(shù) _pages_alloc。

物理頁釋放

 1staticint_pages_free(structpage*p,uint32_tsize_bits)
 2{
 3/*根據(jù)size_bits獲取當前物理頁的大小*/
 4uint32_tlevel=size_bits;
 5uint32_thigh=ARCH_ADDRESS_WIDTH_BITS-size_bits-1;
 6structpage*buddy;
 7RT_ASSERT(p->ref_cnt>0);
 8RT_ASSERT(p->size_bits==ARCH_ADDRESS_WIDTH_BITS);
 9/*將該物理頁的引用計數(shù)減一,如果引用計數(shù)不為0則直接返回*/
10p->ref_cnt--;
11if(p->ref_cnt!=0)
12{
13return0;
14}
15/*判斷當前頁大小是否比最大空閑頁小,如果大小為最大空閑頁,則直接將該頁插入到最大空閑頁鏈表*/
16while(levelsize_bits==level)
22{
23page_remove(buddy,level);
24p=(p

物理頁申請

22be5f4e-4ee3-11ed-a3b6-dac502259ad0.png22dc2a1a-4ee3-11ed-a3b6-dac502259ad0.png

通過上面的物理頁釋放與分配過程,就實現(xiàn)了 RT-Smart 系統(tǒng)中的物理頁管理過程。

審核編輯:湯梓紅

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

    關(guān)注

    0

    文章

    168

    瀏覽量

    14190
  • 管理算法
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5689

原文標題:RT-Smart 物理頁內(nèi)存管理詳解

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    RT-Smart的資料合集

    可知,RT-Smart 32 位內(nèi)核運行在地址空間的高地址,而用戶程序代碼運行在低地址。2、RT-Smart物理內(nèi)存管理詳解伙伴
    發(fā)表于 03-22 15:06

    基于RT-Thread操作系統(tǒng)衍生rt-smart實時操作系統(tǒng)簡介

    1、rt-smart 實時操作系統(tǒng)簡介RT-Thread Smart(簡稱 rt-smart)嵌入式實時操作
    發(fā)表于 06-22 17:56

    基于Windows環(huán)境快速體驗rt-smart相關(guān)資料介紹

    環(huán)境(scons)、圖形系統(tǒng)配置(menuconfig)及軟件包管理功能等工具通過 ART-Pi-Smart SDK 倉庫 (Gitee)下載最新的 ART-Pi
    發(fā)表于 06-30 12:01

    Rt-Smart在riscv中的初始化流程

    相關(guān)定義bsp\\qemu-virt64-riscv\\driver\\board.h得到ddr的空間規(guī)劃如下rt-smart針對virt board的初始化整體初始化
    發(fā)表于 02-16 14:09

    rt-smart應用程序系統(tǒng)調(diào)用實現(xiàn)過程是怎么樣的?

    rt-smart應用程序系統(tǒng)調(diào)用實現(xiàn)過程是怎么樣的? 比如open時候怎么一步一步切換到內(nèi)核態(tài)的?
    發(fā)表于 09-08 17:00

    樹莓派上rt-smart的應用編程入門

    我們從現(xiàn)在開始會逐步連載RT-Thread Smart(簡稱rt-smart,甚至有時會稱為smart os)的介紹文章,旨在讓大家認識,接觸到sm
    的頭像 發(fā)表于 05-13 14:10 ?3231次閱讀
    樹莓派上<b class='flag-5'>rt-smart</b>的應用編程入門

    rt-smart移植分析:從樹莓派3b入手

    移植rt-smart到最新的板子上具體需要注意哪些細節(jié),哪些才是移植rt-smart的關(guān)鍵點?本文從樹莓派3b上移植rt-smart的角度,從頭分析rt-sm...
    發(fā)表于 01-25 18:48 ?0次下載
    <b class='flag-5'>rt-smart</b>移植分析:從樹莓派3b入手

    bootmem分配器使用的數(shù)據(jù)結(jié)構(gòu)

    在內(nèi)核初始化的過程中需要分配內(nèi)存,內(nèi)核提供了臨時的引導內(nèi)存分配器,在分配器和塊分配
    的頭像 發(fā)表于 07-22 11:18 ?1488次閱讀

    Linux內(nèi)核之伙伴分配

    內(nèi)核初始化完畢后,使用分配器管理物理,當前使用的分配
    的頭像 發(fā)表于 07-25 14:06 ?1906次閱讀

    絲滑的在RT-Smart用戶態(tài)運行LVGL

    /rt-thread.git 更詳細環(huán)境配置請移步到— RT-Thread-優(yōu)雅の在D1S上運行RT-Smart 「Rb君」,公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)優(yōu)雅的在D1S上運行
    的頭像 發(fā)表于 11-22 20:20 ?1320次閱讀

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統(tǒng)初始化和異常處理的代碼倉庫地址https://gitee.com/rtthread/
    的頭像 發(fā)表于 02-08 21:40 ?1221次閱讀

    riscv在rt-smart中的板級初始化

    本文章的代碼來自于rt-smart中針對qemu-virt-riscv的bsp 倉庫地址 https://gitee.com/rtthread/rt-thread/tree/rt-smart
    的頭像 發(fā)表于 02-09 17:45 ?1026次閱讀

    零基礎上手rt-smart適配bsp

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統(tǒng)衍生,面向帶MMU(Memory Management
    的頭像 發(fā)表于 08-08 10:34 ?1193次閱讀
    零基礎上手<b class='flag-5'>rt-smart</b>適配bsp

    RT-Smart riscv64匯編注釋

    rt-smart在全志D1上的代碼為例,主要注釋了rt-smart在riscv64上的系統(tǒng)初始化和異常處理的代碼
    的頭像 發(fā)表于 10-12 17:26 ?654次閱讀
    <b class='flag-5'>RT-Smart</b> riscv64匯編注釋
    网上百家乐官网信誉| 新利国际娱乐网| 百家乐的路单怎样看| 有破解百家乐官网仪器| 三易博娱乐| 兄弟百家乐的玩法技巧和规则| 24山安葬择日吉凶| 百家乐官网噢门棋牌| 利澳娱乐城| 百家乐发牌| 百家乐视频免费下载| 星际百家乐官网娱乐城| 长汀县| 大发888娱乐城 下载| 缅甸百家乐赌城| 百家乐下载游戏| 百家乐官网知识技巧玩法| 网上真人娱乐场| 大发888 安装包的微博| 百家乐套路| 百家乐百家乐群| 百家乐官网赌场视屏| 应用必备| 百家乐鞋| 网上百家乐是假| 杨公24山属性| 百家乐官网网络真人斗地主| 百家乐官网玩法教学视频| 优博在线娱乐| 大发888网站打不开| 百家乐牌| 百家乐l23| 百家乐赚钱项目| 唐人街百家乐官网的玩法技巧和规则| 浦北县| 德州扑克单机游戏| 威尼斯人娱乐城老牌| 菲律宾百家乐娱乐平台| 澳门百家乐赢钱技术| 太子百家乐官网娱乐城| 百家乐官网这样赢保单分析 |