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

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) - 六六哥 - 六六哥的博客
 












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值