从虚拟化前端Bug学习分析Kernel Dump( 九 )

, 实际上这就是对 container_of 的一个封装 , container_of 的功能跟字面意思很接近 , 这里 virtqueue 类型的 _vq 变量实际上是 vring_virtqueue 类型的 vq 变量的一个成员变量 , 通过 container_of(_vq struct vring_virtqueue vq) 把 vq 计算出来 。 我们通过struct -o vring_virtqueue来查看 vring_virtqueue 的结构:

可以看到实际上 virtqueue 结构就在 vring_virtqueue 偏移为 0 的地方 , 因此可以直接通过 struct vring_virtqueue ffff917c6c67d000来解析
vring_virtqueue 结构:

因此 [%rdi + 0x38
实际上获取的是 vring 结构里偏移量为 0 的即第一个成员的值 , 这里获取到的值就是 128 。 现在我们已经通过这种方法获取到触发 bug 的语句中 BUG_ON(total_sg > vq->vring.num); 的 vq->vring.num 值了 , 而 total_sg 实际上是 virtqueue_add 的第三个参数 , 保存在 RDX 寄存器里 , 是 0x81 , 即十进制的 129 。

推荐阅读