0.11内核rd_load@ramdisk.c中memcpy函数好像有bug,如:
#define memcpy(dst,src,n)
__asm__("cld;rep;movsl"::"D"((long)(dst)),"S"((long)(src)), "c"((long)(n)/4))
//memcpy(cp, bh->b_data, BLOCK_SIZE);
for (j=0; j<BLOCK_SIZE; j++)
cp[j] = bh->b_data[j];
if (block == 256+1) {
struct d_super_block * s2 = (struct d_super_block *) cp;
if (s2->s_magic != SUPER_MAGIC) {
/* No ram disk image present, assume normal floppy boot */
DBUG("ds=0x%x es=0x%x fs=0x%x pid=%d", get_ds(), get_es(), get_fs(), current->pid);
DBUG("TEST1 super block failed, s2->s_magic != SUPER_MAGIC");
}
s2 = (struct d_super_block *) bh->b_data;
if (s2->s_magic != SUPER_MAGIC) {
/* No ram disk image present, assume normal floppy boot */
DBUG("TEST2 super block failed, s2->s_magic != SUPER_MAGIC");
} else {
DBUG("TEST2 OK");
}
}
跟踪发现:使用memcpy函数复制,内容没有复制过来.
使用字节拷贝可以正常复制,是gcc-4.4.3 (ubuntu-8.04 server)bug?
objdump -d ramdisk.o
发现:
25b: 0f 84 8f 01 00 00 je 3f0 <rd_load+0x330>
261: 8b 75 00 mov 0x0(%ebp),%esi
264: b9 00 04 00 00 mov $0x400,%ecx
269: fc cld
26a: f3 a4 rep movsb %ds:(%esi),%es:(%edi)
对%edi未设置