QEMU的AddrRange地址空间对象模型算法总结(QEMU2.0.0)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leoufung/article/details/48781197
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
QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 

bool addrrange_equal(AddrRange r1, AddrRange r2): 判断r1和r2所代表的是同一个地址空间,如下图range1 和 range2代表的是同一个物理地址空间

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 

Int128 addrrange_end(AddrRange r): 返回range所代表的物理地址范围的结尾地址

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 
AddrRange addrrange_shift(AddrRange range, Int128 delta):将range移动delta距离,返回所代表的新的地址空间范围,delta可正可负,代表了移动的方向

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 

 bool addrrange_contains(AddrRange range, Int128 addr): 判断addr是否在range所覆盖的范围内, addr在range范围内返回true,如下图所示的addr会返回true

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 
bool addrrange_intersects(AddrRange r1, AddrRange r2): r1和r2是否有重叠区域部分,重叠返回true,如下图所示的r1和r2就是相交的情况,返回true

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 



AddrRange addrrange_intersection(AddrRange r1, AddrRange r2):返回一个range, 代表r1和r2相交的地址空间部分,如下图黄色部分所示

QEMU的AddrRange地址空间对象算法总结(QEMU2.0.0) - 六六哥 - 六六哥的博客
 












展开阅读全文

没有更多推荐了,返回首页