释放内存块所在块的确定

2019-07-21 02:09发布


我觉得代码中阴影部分中应该是 int index=offset/memblksize[memx]+1;
举个例子
         在外部flash中     __align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
         外部flash的首地址为0x68000000,每个块的大小为32字节,块1的地址范围为:0x68000000-0x68000020-1,
                                                                                                       块2的地址范围为:0x68000020-0x68000040-1,
                                                                                                       
块3的地址范围为:0x68000040-0x68000060-1,  
                                                                                                       块4的地址范围为:0x68000060-0x68000080-1,
                                                                                                       ..........................................................................
       任取一个地址0x68000050,偏移量为0x50=80, 这个地址应该落在块3中,根据程序中的运算 int index=offset/memblksize[memx]=80/32=2,按照计算的结果该地址落在块2中。在这种情况下int  nmemb=mallco_dev.memmap[memx][index];  //内存块数量,获得的内存块的数量并不是要释放的内存块的数量,而是紧邻释放内存块的低地址内存块的数量。按照例程执行下来,是释放内存块的前面一个内存块开始,紧邻释放内存块的低地址内存块的数量。这样,不需要释放的内存块释放了一个;假设需要释放的内存块的个数为n,相邻低地址的内存块为m,如果n+1=m,需要释放的内存块被全部释放,如果n+1<m,需要释放的内存块紧邻高低址内存也被释放一部分;如果n+1>m,需要释放的内存块部分被释放。
       我觉得应该是  int index=offset/memblksize[memx]+1; 
   

     纯属个人意见,对与不对,还各位大神多多指正!




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
yefeng159
2019-07-21 05:26
首先感谢各位大神的不吝赐教,四楼说的是对的,原子的代码这部分也没有问题,我理解偏差的原因在于那句注释,也是对内存块理解和访问方式不清楚,下面我根据四楼的提示基础上的新的理解
先看内存管理的图片
         


       这个图没有问题,内存块从1和从0开始,不重要,确定内存块是否被占用,并不是直接访问内存块,而是通过内存状态表数组的状态标识。内存状态表的元素个数和内存块是一一对应的,数组状态表的第0个元素对应第一个内存块,这个是由内存分配的过程决定的
内存分配
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存区 
 {     
       if(!mallco_dev.memmap[memx][offset])   //说明状态表元素和内存块的对应关系
                 cmemb++;                                    //连续内存块数增加                                   
       else cmemb=0;                                       // 内存块数清0,我觉得这句没有作用,如果有满足条件的内存块,不会执行该句就已退出;如果没有满足条件的,执行该句退出,由于cmemb是局部变量,生存周期只在该函数中,第二次调用该函数时cmemb的初值就是0                      
             
       if(cmemb==nmemb)                              //找到了nmemb个连续内存块         
       {
                for(i=0;i<nmemb;i++)                 // 标注内存块被占用
                {  
                      mallco_dev.memmap[memx][offset+i]=nmemb;  
                 }  
         return (offset*memblksize[memx]);   //·返回内存块偏移地址·  
       }
    }  
   再返回去看内存释放中的函数
        int index=offset/memblksize[memx];                           //偏移所在内存块的号码
        int nmemb=mallco_dev.memmap[memx][index];       // 内存块数量
        for(i=0;i<nmemb;i++)                                                //内存状态表清0
        {  
            mallco_dev.memmap[memx][index+i]=0;  
        }  
        return 0;  
   int index=offset/memblksize[memx];                           //偏移所在内存块的号码  index并不是所在内存块的号码,而是与内存块对应的内存状态表的下标,应该说index是偏移所在内存块的索引。

一周热门 更多>