QEMU负责对分配给GUEST物理内存,需要一套数据结构对GUEST物理地址空间进行管理。
AddrRange 是用来管理地址空间计算的一个对象。QEMU通常使用 AddrRange 表示GUEST物理地址空间范围,所以需要注意的是通过AddrRange计算出来的值,一般代表了GUEST的物理地址空间,其中start代表了该段物理地址空间的其实地址,尤其注意的是,它是GPA
struct AddrRange { Int128 start; /*GPA*/ Int128 size; }; |
算法总结如下
AddrRange addrrange_make(Int128 start, Int128 size): 定义一个AddrRange范围的GUEST地址空间,起始地址为start, 结束地址为size,如下图所示,黄色代表返回的range
bool addrrange_equal(AddrRange r1, AddrRange r2): 判断r1和r2所代表的是同一个地址空间,如下图range1 和 range2代表的是同一个物理地址空间
Int128 addrrange_end(AddrRange r): 返回range所代表的物理地址范围的结尾地址
AddrRange addrrange_shift(AddrRange range, Int128 delta):将range移动delta距离,返回所代表的新的地址空间范围,delta可正可负,代表了移动的方向
bool addrrange_contains(AddrRange range, Int128 addr): 判断addr是否在range所覆盖的范围内, addr在range范围内返回true,如下图所示的addr会返回true
bool addrrange_intersects(AddrRange r1, AddrRange r2): r1和r2是否有重叠区域部分,重叠返回true,如下图所示的r1和r2就是相交的情况,返回true
AddrRange addrrange_intersection(AddrRange r1, AddrRange r2):返回一个range, 代表r1和r2相交的地址空间部分,如下图黄色部分所示