Bochs使用vmware的vmdk时
This is from the 10gb file:
00000000000d[HD ] VMware 4 disk geometry:
00000000000d[HD ] .size = 10737418240
00000000000d[HD ] .cylinders = 2130440
00000000000d[HD ] .heads = 16
00000000000d[HD ] .sectors = 63
00000000000i[HD ] ata0-0: autodetect geometry: CHS=2130440/16/63
...
00002202905i[BIOS ] ata0-0: PCHS=16383/16/63 translation=none LCHS=1024/16/63
To compute cylinders the code does divide size by 16*63:
10737418240 / (16*63) = 10652200
2130440 * (16*63) = 2147483520
So the value for 10GB is calcuated wrong too, but it doesn't matter since the max value of
16383 is being used later. 2147483520 is almost 2^31
The code in iodev/vmware4.cc at line 84 is:
cylinders = (unsigned)hd_size / (16 * 63)
hd_size is Bit64u. So the cast to unsigned does truncate the value.
In case of 10737418240 (0x280000000) it is 2147483648 (0x80000000).
2147483648 / (16*63) = 2130440,12...
In case of the 8GB file:
00000000000d[HD ] VMware 4 disk geometry:
00000000000d[HD ] .size = 8589934592
00000000000d[HD ] .cylinders = 0
00000000000d[HD ] .heads = 16
00000000000d[HD ] .sectors = 63
It is 8589934592 (0x200000000) so we get 0.
从而造成磁盘不能被正确识别读取,需要修改以下代码
The code in iodev/vmware4.cc at line 84:
cylinders = (unsigned)hd_size / (16 * 63);
to
cylinders = (unsigned)(header.total_sectors / (16 * 63));