免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dreamice
打印 上一主题 下一主题

[驱动] yaffs2源代码分析 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-09-06 09:16 |只看该作者
强顶下,谢谢楼主了!!!

论坛徽章:
0
22 [报告]
发表于 2008-09-15 10:47 |只看该作者
楼主应当整理一下 做个PDF

论坛徽章:
0
23 [报告]
发表于 2008-09-15 17:21 |只看该作者
我来顶一下,拜读中……
(楼主,这些都是你原创的嘛?如果是,那你太牛X了)

论坛徽章:
0
24 [报告]
发表于 2008-09-16 22:37 |只看该作者
有没有完整的代码?

论坛徽章:
0
25 [报告]
发表于 2008-10-06 10:37 |只看该作者
一段时间移植 direct 以后,就是没基于os的用户态的yaffs2的移植以后,发现此代码问题还是蛮多。
1)代码里的所有变量都没有初始化,最要命的是static int有个变量未初始化就用了 if 判断变量,在一部分编译器上会出现不可预料的结果。
2)有部分明显的BUG
和楼主讨论一下下面这个问题:
摘自楼主的一句话:
yaffs_CheckSpaceForAllocation()函数检查Flash上是否有足够的可用空间,通过检查后



// Check if there's space to allocate...
// Thinks.... do we need top make this ths same as yaffs_GetFreeChunks()?
static int yaffs_CheckSpaceForAllocation(yaffs_Device * dev)
{
        int reservedChunks;
        int reservedBlocks = dev->nReservedBlocks;
        int checkpointBlocks;
       
        checkpointBlocks =  yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
        if(checkpointBlocks < 0)
                checkpointBlocks = 0;
       
        reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
       
        return (dev->nFreeChunks > reservedChunks);
}




static int yaffs_CalcCheckpointBlocksRequired(yaffs_Device *dev)
{
        if(!dev->nCheckpointBlocksRequired){
                /* Not a valid value so recalculate */
                int nBytes = 0;
                int nBlocks;
                int devBlocks = (dev->endBlock - dev->startBlock + 1);
                int tnodeSize;

                tnodeSize = (dev->tnodeWidth * YAFFS_NTNODES_LEVEL0)/8;

                if(tnodeSize < sizeof(yaffs_Tnode))
                        tnodeSize = sizeof(yaffs_Tnode);
               
                nBytes += sizeof(yaffs_CheckpointValidity);
                nBytes += sizeof(yaffs_CheckpointDevice);
                nBytes += devBlocks * sizeof(yaffs_BlockInfo);
                nBytes += devBlocks * dev->chunkBitmapStride;
                nBytes += (sizeof(yaffs_CheckpointObject) + sizeof(__u32)) * (dev->nObjectsCreated - dev->nFreeObjects);
                nBytes += (tnodeSize + sizeof(__u32)) * (dev->nTnodesCreated - dev->nFreeTnodes);
                nBytes += sizeof(yaffs_CheckpointValidity);
                nBytes += sizeof(__u32); /* checksum*/
       
                /* Round up and add 2 blocks to allow for some bad blocks, so add 3 */
       
                nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
       
                dev->nCheckpointBlocksRequired = nBlocks;
        }

        return dev->nCheckpointBlocksRequired;
}

yaffs_CheckSpaceForAllocation这个函数的结果确定为3
因为在 nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
dev->nDataBytesPerChunk * dev->nChunksPerBlock) 这个肯定为0
因此,
yaffs_CheckSpaceForAllocation这个函数一点意义都没有,不知道为什么,请问下楼主,这是个BUG吗,我正在检查并修改此代码,能否一起查下

论坛徽章:
0
26 [报告]
发表于 2008-10-06 10:43 |只看该作者
好东西,多谢分享。

论坛徽章:
0
27 [报告]
发表于 2008-10-06 15:02 |只看该作者
我前面说的有点问题,应该是下面这样子的:
我把配置 dev->nReservedBlocks = 2;
在函数
yaffs_CalcCheckpointBlocksRequired
里,
    nBlocks = (nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) + 3;
(nBytes/(dev->nDataBytesPerChunk * dev->nChunksPerBlock)) = 0;
因此 yaffs_CalcCheckpointBlocksRequired = 3

其实这个函数yaffs_CalcCheckpointBlocksRequired 意义就不大了,直接使用保留的trunks=3就好了,

reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
直接用  reservedChunks = ((reservedBlocks + 3) * dev->nChunksPerBlock);
就可以,如果配置为  dev->nReservedBlocks = 2;
yaffs_CheckSpaceForAllocation函数的意义就是检查 dev->nFreeChunks 是否大于 5 个 block


static int yaffs_CheckSpaceForAllocation(yaffs_Device * dev)
{
        int reservedChunks;
        int reservedBlocks = dev->nReservedBlocks;
        int checkpointBlocks;
        
        checkpointBlocks =  yaffs_CalcCheckpointBlocksRequired(dev) - dev->blocksInCheckpoint;
        if(checkpointBlocks < 0)
                checkpointBlocks = 0;
        
        reservedChunks = ((reservedBlocks + checkpointBlocks) * dev->nChunksPerBlock);
        
        return (dev->nFreeChunks > reservedChunks);
}

论坛徽章:
0
28 [报告]
发表于 2008-10-10 17:49 |只看该作者
k - a - 0 顶下再看,这么好的东西不顶没道理了。

论坛徽章:
0
29 [报告]
发表于 2008-10-16 10:39 |只看该作者
看得有些晕!

论坛徽章:
0
30 [报告]
发表于 2008-10-23 12:38 |只看该作者
稍微总结一下前段时间移植的结果:
用的是direct模式,没有os的模式,基于用户态的yaffs模式移植的
1)yaffs 好像有问题,在linux模拟器里跑过以后,在盒子上跑的时候,有重复写一个地址,导致未擦除,又写,写失败的问题,后来一直没有解决。因此,不建议使用 yaffs ,使用yaffs2 的代码。
2)yaffs2的代码没有变量的初始化,特别是有个地方没有初始化就直接做if()判断,会出现异常
3)yaffs2的效率不够高,默认的配置有5个BLOCK(1block=64K)是用于保留和垃圾回收的,如果是做比较小的NOR文件系统,利用率比较低
总体上来说,yaffs2是个很优秀的文件系统,经过一段时间的使用,得出的结论是,用开源代码总是有代价的,特别是遇上问题的时候,你还是要把大部分的代码看明白才能用的下去,成本也是比较高的,最大的好处是开源的软件想的非常周到,算法等很精致
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP