深度探索Linux系统虚拟化:原理与实现
上QQ阅读APP看书,第一时间看更新

1.5.5 加载Guest镜像到内存

在初始化VCPU时我们将代码段cs设置为0xf000,将rip设置为0,所以这里需要将Guest镜像加载到Guest的内存地址(0x1000<<4)+0x0处。Guest的物理内存的起始地址为ram_start,所以加载Guest镜像到内存的代码如下:


void load_image(struct vm *vm) {
  int ret = 0;
  int fd = open("./guest/kernel.bin", O_RDONLY);
  if (fd < 0) {
    fprintf(stderr, "can not open guest image\n");
    exit(-1);
  }

  char *p = (char *)vm->ram_start + ((0x1000 << 4) + 0x0);

  while (1) {
    if ((ret = read(fd, p, 4096)) <= 0)
      break;

    p += ret;
  }
}