Nucleus操作系统内存池模块移植的研究与应用
1 静态方式分配内存池
静态内存池管理方式中内存池分为池(pool)和块(partition)。之所以称之为静态管理方式,是因为在使用过程中块的大小是固定的(即在创建过程中块大小是确定的)。静态内存池的整体结构如图1所示,池和块都有自己的头,池是由双向循环链表链接而成,块是由单向链表链接而成,每一块的头中还包含了自己属于哪一个池的属性。可用块的信息以单向链表的形式存储于池头中,并且可用块与已经分配的块的个数都在池头中有记录。
1.1 静态内存池的创建
池头中的主要参数包括内存池控制块指针、内存池名(只取8个字符)、起始地址、内存池总大小(字节为单位)、内存池分块大小(字节为单位)、挂起方式(先进先出或按优先级)等,图2是仿真器上运行过程中静态内存池结构体截图。
对图2中两个结构体链表参数说明如下:(1)pm_created:当前已经创建的内存池,采用双向循环链表连接,插入方式是在最后一个节点和首节点间填充;(2)pm_available_list:存储当前还可用partition的链表,结构与块的头部结构header_ptr相同(PM_OVERHEAD=8 B小块的头header_ptr:单向链表,内部有指向下一小块的指针和所属大块的控制块地址)。
在Nucleus内核中,内存池的创建主要由函数PMC_Create_Partition_Pool负责,创建流程如下:调用过程中首先进行参数合法性检测;然后在池头(控制块)中写入各个参数,创建链表;之后是一个重要的循环体,负责初始化partition链表,分配所有的partition,每个partition的大小在分配时需要在函数传入参数值的基础上加8 B,用来存储header_ptr;最后在内存池线程保护后将新的内存池插入内存池链表并计数。
1.2 静态内存池的分配
在TD-LTE无线综合测试仪中分配前由协议栈提供所需要分配的大小,这里主要是放置协议内部配置信息与层间交互原语。由于这些信息的大小固定,只是有几种不同大小的固定模式,所以很适合采用静态分配的方式来分配内存,只需要根据数据大小选择密度合适的内存池即可。移植过程中使用了不同大小的partition构建不同密度的内存池,因此,可根据申请partition的大小来判定用那种密度的内存池,以减少内部碎片的大小。这种方法可以有效避免空间浪费[3],同时又可提高分配效率。
在Nucleus内核中静态内存池的分配主要由函数PMC_Allocate_Partition负责,其主要参数为内存池指针(指向调用的内存指针,不能为NULL,设置为可用内存地址即可)、分配大小和挂起标志位。函数中主要判断内存池指针是否合法、内存池与partition是否匹配、指向调用的内存指针是否合法、任务挂起标志位是否有效。其分配流程如图3所示。过程如下:调用内核函数TCT_System_Protect(TCT_Protect)保护内存池同步互斥通道。判断是否还有可用partition,若有,则将可用数量减1、分配数量加1并更新pm_available_list以及将指向调用内存指针赋值为当前分配的partition地址(partition地址要+8 B删去头);若没有,则将任务挂起直至有可用Partition才恢复。最后解保护并返回。
1.3 静态内存池的释放
系统采用PMC_Deallocate_Partition函数来完成释放。流程如下:调用内核函数保护内存池同步互斥通道。判断是否有等待任务,若有,则分配给这个任务当前partition,再判断当前任务是否允许被抢占,允许就调用TCT_Control_To_System抢占当前任务、激活等待内存的任务;若没有,则等待任务,将当前partition重新接入到可用partition列表的头部。最后调用TCT_Unprotect解保护。
2 动态方式分配内存池
动态内存池也分为池和块两个部分,动态池直接由双向循环链表实现连接。内部块是动态分配的,由最小可分配空间来限制块的最小值。与静态分配不同,动态分配块也由双向循环链表来链接。创建时的初始结构为两个块,在申请时动态分割。图4是仿真器上运行过程中动态内存池与块的结构体截图。
池控制块结构中dm_memory_list与块头结构体相同,池通过dm_memory_list来完成块搜索;块头结构中dm_memory_pool与大块头结构相同,通过它来比配大块。
2.1 动态内存池的创建
初始化完成时的内存结构:初始化创建完成时内存池中有2个块,1个大小为总大小减去32 B,包含自己的头DM_OVERHEAD=16 B,设置为可以状态free=‘0x01’;1个大小为16 B,只有自己的头,没有空间,设置为不可以状态free=‘0x00’。因此,此时的可用空间为除去池的控制块外的总大小减去32 B。初始化结构如图5所示(没有将池控制块表示出来)。
- VxWorks操作系统的CompactPCI测试仿真系统(12-12)
- 基于VxWorks操作系统的CompactPCI仿真系统(12-12)
- WinCE节能降耗新技巧:高效休眠唤醒(09-07)
- 交流操作系统35kV综合自动化变电站二次接线设计特点(02-14)
- 基于ARM的网络型电能质量监测装置人机交互研发(01-24)
- WES操作系统电池供电的解决方案(08-16)
- 妤傛ḿ楠囩亸鍕暥瀹搞儳鈻肩敮鍫濆悋閹存劕鐓跨拋顓熸殌缁嬪顨滅憗锟�
閸忋劍鏌熸担宥咁劅娑旂姴鐨犳0鎴滅瑩娑撴氨鐓$拠鍡礉閹绘劕宕岄惍鏂垮絺瀹搞儰缍旈懗钘夊閿涘苯濮幃銊ユ彥闁喐鍨氶梹澶歌礋娴兼ḿ顫呴惃鍕殸妫版垵浼愮粙瀣瑎...
- 娑擃厾楠囩亸鍕暥瀹搞儳鈻肩敮鍫濆悋閹存劕鐓跨拋顓熸殌缁嬪顨滅憗锟�
缁箖鈧拷30婢舵岸妫亸鍕暥閸╃顔勭拠鍓р柤閿涘奔绗撶€硅埖宸跨拠鎾呯礉閸斺晛顒熼崨妯烘彥闁喕鎻崚棰佺娑擃亜鎮庨弽鐓庣殸妫版垵浼愮粙瀣瑎閻ㄥ嫯顩﹀Ч锟�...
- Agilent ADS 閺佹瑥顒熼崺纭咁唲鐠囧墽鈻兼總妤勵棅
娑撴挸顔嶉幒鍫n嚦閿涘苯鍙忛棃銏n唹鐟欘枃DS閸氬嫮顫掗崝鐔诲厴閸滃苯浼愮粙瀣安閻㈩煉绱遍崝鈺傚亶閻€劍娓堕惌顓犳畱閺冨爼妫跨€涳缚绱癆DS...
- HFSS鐎涳缚绡勯崺纭咁唲鐠囧墽鈻兼總妤勵棅
鐠у嫭绻佹稉鎾愁啀閹哄牐顕抽敍灞藉弿闂堛垼顔夐幒鍦欶SS閻ㄥ嫬濮涢懗钘夋嫲鎼存梻鏁ら敍灞藉簻閸斺晜鍋嶉崗銊╂桨缁崵绮洪崷鏉款劅娑旂姵甯夐幓顡嶧SS...
- CST瀵邦喗灏濆銉ょ稊鐎广倕鐓跨拋顓熸殌缁嬪顨滅憗锟�
閺夊孩妲戝ú瀣╁瘜鐠佽绱濋崗銊╂桨鐠佸弶宸緾ST閸氬嫰銆嶉崝鐔诲厴閸滃苯浼愮粙瀣安閻㈩煉绱濋崝鈺傚亶韫囶偊鈧喕鍤滅€涳附甯夐幓顡塖T鐠佹崘顓告惔鏃傛暏...
- 鐏忓嫰顣堕崺铏诡攨閸╃顔勭拠鍓р柤
娑撳洣绗€妤傛ɑ銈奸獮鍐叉勾鐠у嚖绱濇潻娆庣昂鐠囧墽鈻兼稉杞扮稑閸︺劌鐨犳0鎴炲Η閺堫垶顣崺鐔枫亣鐏炴洘瀚甸懘姘剧礉閹垫挷绗呴崸姘杽閻ㄥ嫪绗撴稉姘唨绾偓...
- 瀵邦喗灏濈亸鍕暥濞村鍣洪幙宥勭稊閸╃顔勭拠鍓р柤閸氬牓娉�
鐠愵厺鎷遍崥鍫ユ肠閺囨潙鐤勯幆鐙呯礉缂冩垵鍨庨妴渚€顣剁拫鍙樺崕閵嗕胶銇氬▔銏犳珤閵嗕椒淇婇崣閿嬬爱閿涘本鍨滅憰浣圭壉閺嶉绨块柅锟�...