kvmtool源码学习 patch01 Initial commit

前言

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实现的内容还是比较简单的,只是编译后运行啥也看不到。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值