超级调用是特权操作,有xen来实现.采用的是软中断的方式.它是整个xen的基础.
具体的实现是首先我们有一些超级调用的处理函数,和他们对应的超级调用号,有一个索引文件来记录他们的对应关系.
超级调用发生在guest的内核层,某一个函数如果需要使用超级调用,则会先跳转到超级调用页的相应地方,通过int82h 内陷进入xen中,搜索索引来跳转到超级调用的处理程序.
如果是guest的用户态,必须先进入内核态,通过调用内核态的函数来调用超级调用.
通过xen4.4的代码来分析一下这个过程:
在Hypercall-x86_64.h中记录了guest中内核超级调用函数
static inline int
HYPERVISOR_set_trap_table(trap_info_t *table)
{return _hypercall1(int, set_trap_table, table);
}
#define _hypercall1(type, name, a1)
({ long __res, __ign1; asm volatile ( "call hypercall_page + ("STR(__HYPERVISOR_##name)" * 32)": "=a" (__res), "=D" (__ign1) : "1" ((long)(a1)) : "memory" ); (type)__res;
})
本文发布于:2024-02-05 07:33:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170727477864496.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |