虚拟化

“Let us build ourselves a city, with a tower that reaches to the heavens, so that we may make a name for ourselves; otherwise we will be scattered over the face of the whole earth.”

虚拟化的基本原理

所谓虚拟化,就是通过软件的方式模拟计算机的各种硬件,最后创造一台虚拟的计算机

常见硬件的虚拟化

寄存器

1
2
3
4
5
6
7
8
int32_t regs[8];
#define REG_EAX 1;
#define REG_EBX 2;
#define REG_ECX 3;
...
int32_t eip;
int16_t segregs[4];
...

内存

构造内存空间
1
char mem[256*1024*1024];
模拟内存映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define KB		1024
#define MB 1024*1024

#define LOW_MEMORY 640*KB
#define EXT_MEMORY 10*MB

uint8_t low_mem[LOW_MEMORY];
uint8_t ext_mem[EXT_MEMORY];
uint8_t bios_rom[64*KB];

uint8_t read_byte(uint32_t phys_addr) {
if (phys_addr < LOW_MEMORY)
return low_mem[phys_addr];
else if (phys_addr >= 960*KB && phys_addr < 1*MB)
return rom_bios[phys_addr - 960*KB];
else if (phys_addr >= 1*MB && phys_addr < 1*MB+EXT_MEMORY) {
return ext_mem[phys_addr-1*MB];
else ...
}

void write_byte(uint32_t phys_addr, uint8_t val) {
if (phys_addr < LOW_MEMORY)
low_mem[phys_addr] = val;
else if (phys_addr >= 960*KB && phys_addr < 1*MB)
; /* ignore attempted write to ROM! */
else if (phys_addr >= 1*MB && phys_addr < 1*MB+EXT_MEMORY) {
ext_mem[phys_addr-1*MB] = val;
else ...
}

CPU执行过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (;;) {
read_instruction(); //BIU
switch (decode_instruction_opcode()) { //EU
case OPCODE_ADD: //加
int src = decode_src_reg();
int dst = decode_dst_reg();
regs[dst] = regs[dst] + regs[src];
break;
case OPCODE_SUB:
int src = decode_src_reg();
int dst = decode_dst_reg();
regs[dst] = regs[dst] - regs[src];
break; //减
...
}
eip += instruction_length;
}

外设虚拟化

硬盘

读写文件假装在读写硬盘

显示设备

在真实的显示设备划分一块区域作为虚拟机显示设备

键盘

将键盘、鼠标等事件放入事件队列中,从而将真实的键盘转换为虚拟的键盘

参考文献

0%