我想我找到原因了.在如下代码.
复制内容到剪贴板
代码:
if ((to != 0xffff && to != ram_drive) || ((long long)mem) <= 0)
{
/* if image is in memory and not compressed, we can simply move it. */
if ((to == 0xffff || to == ram_drive) && !compressed_file)
{
if (bytes_needed != start_byte)
grub_memmove64 (bytes_needed, start_byte, filemax);
} else {
unsigned long long read_result;
grub_memmove64 (bytes_needed, (unsigned long long)(unsigned int)BS, SECTOR_SIZE);
/* read the rest of the sectors */
read_result = grub_read ((bytes_needed + SECTOR_SIZE), -1ULL, 0xedde0d90);
if (read_result != filemax - SECTOR_SIZE)
{
//if ( !probed_total_sectors || read_result<(probed_total_sectors<<SECTOR_BITS) )
//{
unsigned long long required = (probed_total_sectors << SECTOR_BITS) - SECTOR_SIZE;
/* read again only required sectors */
if ( ! probed_total_sectors
|| required >= filemax - SECTOR_SIZE
|| ( (filepos = SECTOR_SIZE), /* re-read from the second sector. */
grub_read (bytes_needed + SECTOR_SIZE, required, 0xedde0d90) != required
)
)
{
grub_close ();
if (errnum == ERR_NONE)
errnum = ERR_READ;
return 0;
}
//}
}
}
grub_close ();
}
else if ((to == 0xffff || to == ram_drive) && !compressed_file)
{
if ((int)bytes_needed != start_byte)
grub_memmove64 (bytes_needed, start_byte, filemax);
}按照这个逻辑,(已经映射到内存中的磁盘我在这里调试时发现to也是0xffff)
/*当mem>0并且这个文件已经在内存中,这个条件不成立,所以会跳到后面的else if执行*/
if ((to != 0xffff && to != ram_drive) || ((long long)mem) <= 0)
{
if ((to == 0xffff || to == ram_drive) && !compressed_file)
{读取文件}
else
{读取文件}
}
/*这个if只有当文件是非压缩格式时才执行的*/
else if ((to == 0xffff || to == ram_drive) && !compressed_file)
{读取文件}
所以就有了一个逻辑错误.当文件在已经内存中,并且是压缩格式时,就不进行读取了,难怪.会发现映射后内容为空.
我尝试了在后面再加一个
else
{
grub_memmove64 (bytes_needed, (unsigned long long)(unsigned int)BS, SECTOR_SIZE);
grub_read (bytes_needed + SECTOR_SIZE, -1ULL, 0xedde0d90);
}
测试结果OK,具体要如何修改麻烦不点看一下.对这些我不是很理解.