vmdk spec 1.1 给出的 Hosted Sparse Extent Header (对应上图的Sparse header) The following example shows the content of a sparse extent’s header from a VMware hosted product, such as VMware Workstation, VMware Player, VMware ACE, VMware Server, or VMware GSX Server: This structure (struct SparseExtentHeader) needs to be packed. If you use gcc to compile your application, you must use the keyword __attribute__((__packed__)). typedef uint64 SectorType; typedef uint8 Bool; struct vmdisk_header { uint32_t version; uint32_t flags; int64_t capacity;//代表这个extent的大小,以扇区数表示 int64_t granularity;//一个grain的大小,以扇区数表示 int64_t desc_offset;//描述符的偏移,以扇区为基数 int64_t desc_size; //描述符的大小,以扇区为基数 int32_t num_gtes_per_gte;//graintable的entry数目,规范上是512 就是每个GDE对应的GTE的数目 int64_t rgd_offset;//这里指向的是redundant grain directory的位置 int64_t gd_offset;// 这里指向的是grain directory的位置 int64_t grain_offset; char filler[1]; char check_bytes[4]; }; 通过下面这个图可以找到需要的数据,其中数据都是以扇区为偏移的,在规范的11页有详细的计算方法 代码主要是根据读取文件来填充header结构体,然后根据header结构体,和上面这张图,来读取相应的位置的数据,如果是写数据,就计算好位置,写进去。 ----------------------------------------------------------------------------------------- 代码部分: