嵌入式操作系统原理与设计实现 课件 第8章 内存和IO管理_第1页
嵌入式操作系统原理与设计实现 课件 第8章 内存和IO管理_第2页
嵌入式操作系统原理与设计实现 课件 第8章 内存和IO管理_第3页
嵌入式操作系统原理与设计实现 课件 第8章 内存和IO管理_第4页
嵌入式操作系统原理与设计实现 课件 第8章 内存和IO管理_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章内存和I/O管理第一节

内存管理嵌入式实时操作系统在内存管理方面需要考虑如下因素:快速而确定的内存管理不使用内存管理:最快速和最确定的内存管理方式,适用于那些小型的嵌入式系统,系统中的任务比较少,且数量固定。通常的操作系统都至少具有基本的内存管理方法:提供内存分配与释放的系统调用。内存管理机制静态分配系统在启动前,所有的任务都获得了所需要的所有内存,运行过程中将不会有新的内存请求。在强实时系统中,减少内存分配在时间上可能带来的不确定性。不需要操作系统进行专门的内存管理操作。系统使用内存的效率比较低下,只适合于那些强实时,且应用比较简单,任务数量可以静态确定的系统。内存管理机制动态分配堆(heap):应用通过分配(malloc)与释放(free)操作来使用内存。堆会带来碎片:内存被逐渐划分为位于已被使用区域之间的越来越小的空闲区域。垃圾回收:对内存堆进行重新排列,把碎片组织成为大的连续可用内存空间。但垃圾回收的时间长短不确定:不适合于处理实时应用。在实时系统中,避免内存碎片的出现,而不是在出现内存碎片时进行回收。内存管理机制常用管理方式:固定大小存储区:在指定边界的一块地址连续的内存空间中,实现固定大小内存块的分配。可变大小存储区:在指定边界的一块地址连续的内存空间中,实现可变大小内存块的分配。应用根据需要从固定大小存储区或者可变大小存储区中获得一块内存空间,用完后将该内存空间释放回相应的存储区。固定大小存储区管理

可供使用的一段连续的内存空间被称为是一个分区; 分区由大小固定的内存块构成,且分区的大小是内存块大小的整数倍数。内存块1内存块2内存块3内存块4128字节512字节一个大小为512字节的分区,内存块为128个字节的分区typedefstruct{PartitionID ID; /*分区的ID*/PartitionNameName; /*分区的名字*/void *starting_address; /*分区的起始地址*/int length; /*分区的长度*/int buffer_size; /*内存块的大小*/PartitionAttribute attribute; /*属性*/int number_of_used_blocks; /*剩余内存块数*/MemoryChain memory; /*内存块链*/}Partition;分区的数据结构

ID表示分区的标识;starting_address表示分区的起始地址;length表示分区的存储单元的数量;buffer_size表示分区中每个内存块的大小;attribute表示分区的属性;number_of_used_blocks表示分区中已使用内存块的数量;memory为一个指针,指向分区中由空闲内存块组成的双向空闲内存块链表的头结点。分区1分区2nextpreviousnextpreviousnextprevious……空闲内存块链表固定大小存储区管理分区的操作创建分区删除分区从分区得到内存块把内存块释放到分区获取分区ID获取当前创建的分区的数量获取当前所有分区的ID获取分区信息可变大小存储区管理可变大小存储区管理为基于堆的管理方式。堆为一段连续的、大小可配置的内存空间,用来提供可变内存块的分配。可变内存块称为段,最小分配单位称为页,即段的大小是页的大小的整数倍。如果申请段的大小不是页的倍数,实时内核将会对段的大小进行调整,调整为页的倍数。如,从页大小为256个字节的堆中分配一个大小为350字节的段,实时内核实际分配的段大小为512个字节。typedefstruct{HeapID ID; /*堆的ID*/HeadName name; /*堆的名字*/TaskQueue waitQueue; /*等待队列*/void *starting_address; /*内存空间起始地址*/int length; /*内存空间长度/字节*/int page_size; /*页长度(字节)*/int maximum_segment_size;/*最大可用段大小*/RegionAttribute attribute;/*堆的属性*/int number_of_used_blocks;/*分配的块数*/HeapMemoryChain memory;/*堆头控制结构*/}Heap;堆的数据结构

waitQueue用来表示任务等待队列,如果任务从堆中申请段不能得到满足,将被阻塞在堆的等待队列上;starting_address用来表示堆在内存中的起始地址;length表示堆的大小;page_size为页的大小;maximum_segment_size表示堆中当前最大可用段的大小;attribute表示堆的属性;number_of_used_blocks表示已分配使用的内存块的数量;memory表示空闲段链表。可变大小存储区管理可变大小存储区中的空闲段通过双向链表链接起来,形成一个空闲段链。在创建堆时,只有一个空闲段,其大小为整个存储区的大小减去控制结构的内存开销。从存储区中分配段时,可依据首次适应算法,查看空闲链中是否存在合适的段。当把段释放回存储区时,该段将被挂在空闲段链的链尾。如果空闲链中有与该段相邻的段,则将其合并成一个更大的空闲段。由于对申请的内存的大小作了一些限制,避免了内存碎片的产生。0其它控制标志0其它控制标志1其它控制标志堆11其它控制标志正被使用的段空闲段空闲段堆2…堆的空闲段链在段的控制块中设置了一个标志位,表示段被使用的情况:1表示该段正被使用,0表示该段空闲。在固定大小存储区管理方式中,只有在空闲状态下,内存块才拥有控制信息。在可变大小存储区管理方式中,无论段空闲或是正在被使用,段的控制结构都始终存在。可变大小存储区管理堆的操作创建堆从堆中得到内存块释放内存块到堆中扩展堆获得已分配内存块的实际可用空间大小删除堆获得堆的ID获得在堆上等待的任务数量获得等待任务的ID列表获得堆的数量获得堆列表获得堆信息Ucos2的内存管理MemorymanagementinuC/OS-IIfixed-sizedmemoryblocksfromapartitionmemorypartitionMultiplememorypartitions/*MEMORYCONTROLBLOCK*/typedefstruct{/*Pointertobeginningofmemorypartition*/

void*OSMemAddr;

/*Pointertolistoffreememoryblocks*/

void*OSMemFreeList;

/*Size(inbytes)ofeachblockofmemory*/INT32UOSMemBlkSize;

/*Totalnumberofblocksinthispartition*/

INT32UOSMemNBlks;

/*Numberofmemoryblocksremaininginthispartition*/

INT32UOSMemNFree;}OS_MEM;MemorycontrolblockdatastructureListoffreememorycontrolblockscreatedbyOS_MemInitEachmemorycontrolblockcanbeusedtomanageapartition

/*Max.numberofmemorypartitions...*/#defineOS_MAX_MEM_PART32/*Storageformemorypartitionmanager*/OS_MEMOSMemTbl[OS_MAX_MEM_PART];voidOS_MemInit(void){OS_MEM*pmem;INT16Ui;pmem=(OS_MEM*)&OSMemTbl[0];/*Pointtomemorycontrolblock(MCB)*/for(i=0;i<(OS_MAX_MEM_PART-1);i++){/*Init.listoffreememorypartitions*//*Chainlistoffreepartitions*/pmem->OSMemFreeList=(void*)&OSMemTbl[i+1];/*Storestartaddressofmemorypartition*/pmem->OSMemAddr=(void*)0;pmem->OSMemNFree=0;/*Nofreeblocks*/pmem->OSMemNBlks=0;/*Noblocks*/pmem->OSMemBlkSize=0;/*Zerosize*/pmem++;}pmem->OSMemFreeList=(void*)0;/*Initializelastnode*/pmem->OSMemAddr=(void*)0;/*Storestartaddressofmemorypartition*/pmem->OSMemNFree=0;/*Nofreeblocks*/pmem->OSMemNBlks=0;/*Noblocks*/pmem->OSMemBlkSize=0;/*Zerosize*//*Pointtobeginningoffreelist*/OSMemFreeList=(OS_MEM*)&OSMemTbl[0];}OS_MemInitOS_MEM*OSMemCreate(void*addr,INT32Unblks,INT32Ublksize,INT8U*err){

OS_MEM*pmem;INT8U*pblk;void**plink;INT32Ui;

OS_ENTER_CRITICAL();pmem=OSMemFreeList;/*Getnextfreememorypartition*/if(OSMemFreeList!=(OS_MEM*)0){/*Seeifpooloffreepartitionswasempty*/OSMemFreeList=(OS_MEM*)OSMemFreeList->OSMemFreeList;}OS_EXIT_CRITICAL();if(pmem==(OS_MEM*)0){/*Seeifwehaveamemorypartition*/*err=OS_MEM_INVALID_PART;return((OS_MEM*)0);}plink=(void**)addr;/*Createlinkedlistoffreememoryblocks*/pblk=(INT8U*)addr+blksize;for(i=0;i<(nblks-1);i++){*plink=(void*)pblk;plink=(void**)pblk;pblk=pblk+blksize;}*plink=(void*)0;/*LastmemoryblockpointstoNULL*/pmem->OSMemAddr=addr;/*Storestartaddressofmemorypartition*/pmem->OSMemFreeList=addr;/*Initializepointertopooloffreeblocks*/pmem->OSMemNFree=nblks;/*StorenumberoffreeblocksinMCB*/pmem->OSMemNBlks=nblks;pmem->OSMemBlkSize=blksize;/*Storeblocksizeofeachmemoryblocks*/*err=OS_NO_ERR;return(pmem);}OSMemCreatePartitioncreatedbyOSMemCreate

void*OSMemGet(OS_MEM*pmem,INT8U*err){void*pblk;OS_ENTER_CRITICAL();if(pmem->OSMemNFree>0){/*Seeifthereareanyfreememoryblocks*/pblk=pmem->OSMemFreeList;/*Yes,pointtonextfreememoryblock*/pmem->OSMemFreeList=*(void**)pblk;/*Adjustpointertonewfreelist*/pmem->OSMemNFree--;/*Onelessmemoryblockinthispartition*/OS_EXIT_CRITICAL();*err=OS_NO_ERR;/*Noerror*/return(pblk);/*Returnmemoryblocktocaller*/}OS_EXIT_CRITICAL();*err=OS_MEM_NO_FREE_BLKS;/*No,Notifycallerofemptymemorypartition*/return((void*)0);/*ReturnNULLpointertocaller*/}OSMemGetPartitionafterOSMemGetpblk

INT8UOSMemPut(OS_MEM*pmem,void*pblk){OS_ENTER_CRITICAL();if(pmem->OSMemNFree>=pmem->OSMemNBlks){/*Makesureallblocksnotalreadyreturned*/OS_EXIT_CRITICAL();return(OS_MEM_FULL);}/*Insertreleasedblockintofreeblocklist*/*(void**)pblk=pmem->OSMemFreeList;pmem->OSMemFreeList=pblk;pmem->OSMemNFree++;/*Onemorememoryblockinthispartition*/OS_EXIT_CRITICAL();return(OS_NO_ERR);/*Notifycallerthatmemoryblockwasreleased*/}OSMemPutPartitionafterOSMemPutpblk

第二节

I/O管理在通用操作系统中,I/O管理采用层次结构的思想(如四个层次的结构:中断处理程序,设备驱动程序,与设备无关的操作系统软件,用户层软件):较低层的软件要使较高层的软件独立于硬件的特性,较高层软件则要向用户提供一个友好、清晰、规范的界面。在I/O管理的层次结构中,主要通过设备独立的I/O系统和设备驱动程序来共同完成I/O操作。设备驱动程序通过一组例程来提供比较低级的I/O功能,比如把字节序列输入或输出到面向字符的设备

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论