前言
kvmtool的代码相较于qemu源代码还是很友好的,很适合作为一名新手入门学习kvm相关内容。
main函数流程分析
int main(int argc, char *argv[])
{
struct cpu *cpu;
int fd;
fd = open("/dev/kvm", O_RDWR);
if (fd < 0) {
die("open kvm failed!");
}
cpu = cpu_new();
cpu_reset(cpu);
return 0;
}
在main函数中首先调用open函数打开设备文件/dev/kvm,open函数的权限设置为O_RDWD,表示可读可写。然后调用cpu_new创建一个cpu对象,最后调用cpu_reset重置cpu对象。
其中cpu对象结构体定义如下,cpu对象也比较简单,就只有一个register结构体,表示x86架构下用到的相关寄存器。
struct cpu_registers
{
uint32_t eax;
uint32_t ebx;
uint32_t ecx;
uint32_t edx;
uint32_t esp;
uint32_t ebp;
uint32_t esi;
uint32_t edi;
uint32_t eip;
uint32_t eflags;
};
struct cpu
{
struct cpu_registers regs;
};
cpu_new()
函数实现如下,通过calloc分配一个cpu对象空间
static struct cpu *cpu_new(void)
{
return calloc(1, sizeof(struct cpu));
}
cpu_reset()
函数实现如下,函数中对eip寄存器和eflags寄存器赋了初始值。暂不清楚为什么给eip和eflags赋这两个初始值,TODO!!!
static void cpu_reset(struct cpu *self)
{
self->regs.eip = 0x000fff0UL;
self->regs.eflags = 0x0000002UL;
}
kvmtool第一个patch实现的内容还是比较简单的,只是编译后运行啥也看不到。。。