|
发表于 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
|
|
|
|
|
|
|
楼主|
发表于 2014-7-8 09:27:49
问题解决,用SD卡成功烧写>300M的根文件系统。 |
|
|
|
|
|
|
|
最后40个字节会出错?那要看实际测试的效果。
不是很明白是运行过程中出的问题,还是看代码发现的? |
|
|
|
|
|
|
|
楼主|
发表于 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的某个位置上的这个内存地址,可能出现了什么问题,具体不清楚。
未分析出来你们对于后面的内存,是如何分布和处理的。 |
|
|
|
|
|
|
登录或注册
扫一扫关注迅为公众号
|