搜索

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
发表于 2014-7-2 11:25:48 14837 浏览 3 回复

对于uboot源码中的update_from_sd卡函数的几点疑问

本帖最后由 晨埃,烙定... 于 2014-7-2 11:28 编辑

这两天抽了点时间,看了一下uboot的源码,在update_from_sd卡中,有下面这段代码:


如图片中的注释,存在疑问。
同时,因为上述的这个buffer限制,所以才产生下面的疑问,就是,当我在从sd卡读根文件系统的时候,为什么在读取文件系统的最后剩下40个字节的时候,会失败?memcpy函数始终跳转不出来。函数:get_cluster:
.....
//读文件最后剩下的字节,不足以一个block
      printf("get_cluster disk read %%.\n");
       
        if(size % FS_BLOCK_SIZE) {
                __u8 tmpbuf[FS_BLOCK_SIZE];
                //modefy by lhp-20140701
                memset(tmpbuf,0,sizeof(tmpbuf));
               
                idx= size/FS_BLOCK_SIZE;
                if (disk_read(startsect + idx, 1, tmpbuf) < 0) {
                        FAT_DPRINT("Error reading data\n");
                        return -1;
                }
                //default
                buffer += (__u8)idx*FS_BLOCK_SIZE;
                //modefy by lhp
                //buffer += (idx-1)*FS_BLOCK_SIZE;
                /*debug add by lhp 20140701*/
                printf("disk_read %% already return.\n");
                printf("size/FS_BLOCK_SIZE=%d.\n size % FS_BLOCK_SIZE=%d.\n SIZE=%d.\n buffer_size=0x%x.\n",size/FS_BLOCK_SIZE,size % FS_BLOCK_SIZE,size,sizeof(buffer));
                int i=0;
                /*重写memcpy函数*/
                {
                        unsigned long *dl = (unsigned long *)buffer, *sl = (unsigned long *)tmpbuf;
                        char *d8, *s8;
                       
                        //                        /* while all data is aligned (common case), copy a word at a time */
                        //                        if ( (((ulong)dest | (ulong)src) & (sizeof(*dl) - 1)) == 0) {
                        //                                while (count >= sizeof(*dl)) {
                        //                                        *dl++ = *sl++;
                        //                                        count -= sizeof(*dl);
                        //                                }
                        //                        }
                        d8 = (char *)dl;
                        s8 = (char *)sl;
                       
                        /* copy the reset one byte at a time */
        //                while (count--)
        //                        *d8++ = *s8++;
                        for(i=0;i<size % FS_BLOCK_SIZE;i++)
                        {
                                //printf("  %x",tmpbuf);
                                *d8++=*s8++;
                                printf(" %x",d8);
                        }
                }
                //memcpy(buffer, tmpbuf, (size % FS_BLOCK_SIZE));
               
                /*debug add by lhp 20140701*/
                /*问题出在这里,上面的memcpy没有返回*/
                printf("get_cluster will return.\n");

所以我猜测,可能是因为buffer指针越界导致的。希望能指点下。
file:///C:\Users\Administrator\AppData\Roaming\feiq\RichOle\87229170.bmp
file:///C:\Users\Administrator\AppData\Roaming\feiq\RichOle\87229170.bmp




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-7-8 09:27:49
问题解决,用SD卡成功烧写>300M的根文件系统。
回复 点赞

使用道具 举报

44

主题

151

帖子

475

积分

版主

Rank: 7Rank: 7Rank: 7

积分
475
发表于 2014-7-8 09:32:20
最后40个字节会出错?那要看实际测试的效果。
不是很明白是运行过程中出的问题,还是看代码发现的?
回复 点赞

使用道具 举报

3

主题

11

帖子

47

积分

新手上路

Rank: 1

积分
47
 楼主| 发表于 2014-7-11 11:52:09
嗯,是的,文件最后40个字节,已经读到了数组tmpbuf中,并且打印出来和文件真实数据完全一样,但在我将memcpy函数去掉,改成自己写的memcpy函数以后,
  for(i=0;i<size % FS_BLOCK_SIZE;i++)
    {
                                //printf("  %x",tmpbuf);
                                *d8++=*s8++;
                                printf(" %x",d8);
    }
对于*d8++,只要d8内存地址往后移动,就会死掉,程序!
代码分析调试+实际测试     才得出的结论。
对于内存的分布,你们从0x5000_0000开始,然后对于300M的文件,在0x5000_0000+xxx的某个位置上的这个内存地址,可能出现了什么问题,具体不清楚。

未分析出来你们对于后面的内存,是如何分布和处理的。
回复 点赞

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

 
快速回复 返回顶部 返回列表