46
QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 . . . . . . . . . . . . QEMU源码分析之:内存模拟 —以x86架构为例 陈志杰 [email protected] 计算机科学技术研究所信安中心 July 25, 2008

Memory Simulation in QEMU

  • Upload
    z-chen

  • View
    4.899

  • Download
    5

Embed Size (px)

Citation preview

Page 1: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

.

.

. ..

.

.

QEMU源码分析之:内存模拟

—以x86架构为例

陈志杰[email protected]

计算机科学技术研究所信安中心

July 25, 2008

Page 2: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

内容大纲

...1 背景知识

x86架构介绍虚拟存储器特权级切换上下文切换

...2 QEMU初始化

注册Machine物理内存模拟分配mmu0 PDMMU0映射

...3 QEMU运行时内存模拟

读写内存切换指令翻译

Page 3: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

内容大纲

...1 背景知识

x86架构介绍虚拟存储器特权级切换上下文切换

...2 QEMU初始化

注册Machine物理内存模拟分配mmu0 PDMMU0映射

...3 QEMU运行时内存模拟

读写内存切换指令翻译

Page 4: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

x86架构32位微处理器

寄存器组[1](已过时,请查阅时以[2]为准)

通用寄存器(32位)*8:EAX,EBX,ECX,EDX,ESI,EDI,EBP

段寄存器/段选择子(16位)*6:CS,DS,ES,SS,FS,GS

标志寄存器(32位)*1:EFLAG

指令指针寄存器(32位)*1:EIP

控制寄存器(32位)*5:CR0(低16位与MSW相同),CR1,CR2,CR3,CR4

排错寄存器(32位)*5:DR0,DR1,DR3,DR4,DR6,DR7

测试寄存器(32位)*5:TR3,TR4,TR5,TR6,TR7(80386仅有TR6,TR7)。

Page 5: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

控制寄存器

PDBR:Page Directory Base Register, PG:分页允许位, PE:保护模式允许位

图: 控制寄存器[3]

Page 6: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

虚拟存储器原理

图: 虚拟存储器原理

Page 7: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

内存共享与访问控制

图: 内存共享与访问控制

Page 8: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

几个基本概念

图: 基本概念

Page 9: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

二级页表

图: 二级页表

Page 10: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

虚拟地址分段

图: 虚拟地址分段

Page 11: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

物理地址分段

图: 物理地址分段

Page 12: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

Pentium内存访问实例

图: Pentium内存访问实例

Page 13: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

Linux虚拟存储器管理

图: Linux虚拟存储器管理

Page 14: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

异常控制流

.特权级..

.

. ..

.

.

0:系统态3:用户态

.异常(Exception)的分类..

.

. ..

.

.

中断(Interrupt)(时钟、I/O……,异步,返回下一条指令)、陷阱(trap)(sysenter、int……,同步,返回下一条)、故障(Interrupt)(缺页异常……,同步,返回当前或不返回)、终止(Abort)(硬件错误,同步,不返回)。

Page 15: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

进程上下文切换(只关注MMU)

.用于改变MMU的指令..

.

. ..

.

.

ljmp,lcall,iret:TSS Switching

mov crN,reg:faster

.OS任务调度..

.

. ..

.

.

Linux mov crN,reg方法,在switch_mm函数中将new_task->pgd设置到cr3寄存器中。

Window$ ??

Page 16: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

内容大纲

...1 背景知识

x86架构介绍虚拟存储器特权级切换上下文切换

...2 QEMU初始化

注册Machine物理内存模拟分配mmu0 PDMMU0映射

...3 QEMU运行时内存模拟

读写内存切换指令翻译

Page 17: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

注册Machine I

main();//vl.c7985{

register_machines ();//at /home/joyan/code/qemu �compile/target � i386/machine.c:9

//将‘加入到虚拟机列表machine‘//参数解析//指定硬盘;//指定启动次序;//初始化‘数据结构;timer‘qemu_aio_init ();// at /home/joyan/code/qemu �

compile/block � raw � posix.c:455//初始化网络接口;

Page 18: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

注册Machine II

typedef struct QEMUMachine {const char *name;const char *desc;QEMUMachineInitFunc *init;ram_addr_t ram_require;struct QEMUMachine *next;

} QEMUMachine;

Page 19: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

Guest物理内存模拟 I

//初始化内存:phys_ram_size = machine � >ram_require & ~

RAMSIZE_FIXED;/*phys_ram_size = 12582912machine � >ram_require = 12582912#define RAMSIZE_FIXED 1*/if (machine � >ram_require & RAMSIZE_FIXED) {if (ram_size > 0) {//‘ram_size用户:� 参数传入值m‘if (ram_size < phys_ram_size) {

fprintf(stderr , ”Machine ‘%s’ requires %llu bytes of memory\n”,

machine � >name , (unsigned long long)phys_ram_size);

exit( � 1);}phys_ram_size = ram_size;

} else

Page 20: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

Guest物理内存模拟 II

ram_size = phys_ram_size;} else {if (ram_size == 0)ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;phys_ram_size += ram_size;// phys_ram_size = 146800640

}//为‘machine分配内存‘phys_ram_base = qemu_vmalloc(phys_ram_size);//

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

if (! phys_ram_base) { }

Page 21: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

分配MMU0 PD(用于GuestPA->HostVA) I

/* init the dynamic translator */cpu_exec_init_all(tb_size * 1024 * 1024);// cpu_exec_init_all (tb_size =0) at /home/joyan/

code/qemu � compile/exec.c:449{

//注册‘tbs空间并为其分配内存‘cpu_gen_init ();code_gen_alloc(tb_size);code_gen_ptr = code_gen_buffer;

page_init ();//at /home/joyan/code/qemu � compile/exec.c:240

{{

/* NOTE: we can always suppose thatqemu_host_page_size >=

TARGET_PAGE_SIZE */qemu_host_page_mask = ~( qemu_host_page_size

� 1);

Page 22: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

分配MMU0 PD(用于GuestPA->HostVA) II

//为‘L1_cache分配空间,由‘‘l1_phys_map指向‘l1_phys_map = qemu_vmalloc(L1_SIZE * sizeof

(void *));//

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

memset(l1_phys_map , 0, L1_SIZE * sizeof(void *));

}}io_mem_init ();// io_mem_init () at /home/joyan/code/qemu �

compile/exec.c:2592}

Page 23: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

映射Guest物理内存到HostVA

...;machine � >init (...){

/* allocate RAM */ram_addr = qemu_ram_alloc(ram_size);cpu_register_physical_memory (0, below_4g_mem_size

, ram_addr);{

for(all phyMem){...;p = phys_page_find_alloc(addr >>

TARGET_PAGE_BITS , 1);}// subpage ??

}}

Page 24: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

内容大纲

...1 背景知识

x86架构介绍虚拟存储器特权级切换上下文切换

...2 QEMU初始化

注册Machine物理内存模拟分配mmu0 PDMMU0映射

...3 QEMU运行时内存模拟

读写内存切换指令翻译

Page 25: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

含读写内存指令的翻译 I

以inc [mem_addr]为例:

disas_insn (...){...;case 0xff: /* GRP5 */if ((b & 1) == 0)ot = OT_BYTE;elseot = dflag + OT_WORD;

modrm = ldub_code(s � >pc++);mod = (modrm >> 6) & 3;rm = (modrm & 7) | REX_B(s);op = (modrm >> 3) & 7;...;switch(op) {case 0: /* inc Ev */

if (mod != 3) opreg = OR_TMP0;else opreg = rm;gen_inc(s, ot , opreg , 1);

Page 26: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

含读写内存指令的翻译 II

break;...;

}}

Page 27: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

gen_inc(s,ot,opreg(OR_TMP0),1) I

/* if d == OR_TMP0 , it means memory operand (address in A0) */

static void gen_inc(DisasContext *s1, int ot, intd, int c)

{...;gen_op_ld_T0_A0(ot + s1 � >mem_index);/*int mem_index; select memory access functions

*/...;

}

Page 28: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

gen_op_ld_T0_A0(ot + s1->mem_index); I

static inline void gen_op_ld_T0_A0(int idx)gen_op_ld_v(idx , cpu_T[0], cpu_A0);

int mem_index = (idx >> 2) � 1;tcg_gen_qemu_ld8u(t0, a0, mem_index);

tcg_gen_op3i(INDEX_op_qemu_ld8u , ret , addr ,mem_index);

Page 29: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

INDEX_op_qemu_ld8u

static inline void tcg_out_op(TCGContext *s, int opc ,const TCGArg *args , const int *

const_args){...;case INDEX_op_qemu_ld8u:tcg_out_qemu_ld(s, args , 0);break;...;

}

Page 30: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找TLB I

static void tcg_out_qemu_ld(TCGContext *s, constTCGArg *args ,

int opc)data_reg = *args ++;addr_reg = *args ++;mem_index = *args;s_bits = opc & 3;r0 = TCG_REG_EAX;r1 = TCG_REG_EDX;

tcg_out_mov(s, r1 , addr_reg);tcg_out_mov(s, r0 , addr_reg);

tcg_out_modrm(s, 0xc1 , 5, r1); /* shr \$x , r1 */tcg_out8(s, TARGET_PAGE_BITS � CPU_TLB_ENTRY_BITS);tcg_out_modrm(s, 0x81 , 4, r0); /* andl \$x , r0 */tcg_out32(s, TARGET_PAGE_MASK | ((1 << s_bits) � 1));

//\$xtcg_out_modrm(s, 0x81 , 4, r1); /* andl \$x , r1 */

Page 31: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找TLB II

tcg_out32(s, (CPU_TLB_SIZE � 1) << CPU_TLB_ENTRY_BITS);

tcg_out_opc(s, 0x8d); /* lea offset(r1 , %ebp), r1 */tcg_out8(s, 0x80 | (r1 << 3) | 0x04);tcg_out8(s, (5 << 3) | r1);tcg_out32(s, offsetof(CPUState , tlb_table[mem_index

][0]. addr_read));// ~~~~~~~~~~~~~~~~~~~~~ mem_index indicates the privi.

level

/* cmp 0(r1), r0 */tcg_out_modrm_offset(s, 0x3b , r0, r1, 0);

tcg_out_mov(s, r0 , addr_reg);

/* je label1 */tcg_out8(s, 0x70 + JCC_JE);label1_ptr = s � >code_ptr;s � >code_ptr ++;

Page 32: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找TLB III

Page 33: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找MMU I

//参数是怎么设置的?tcg_out_movi(s, TCG_TYPE_I32 , TCG_REG_EDX ,

mem_index);tcg_out8(s, 0xe8);tcg_out32(s, (tcg_target_long)qemu_ld_helpers[

s_bits] �(tcg_target_long)s � >code_ptr � 4);

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/*static void *qemu_ld_helpers [4] = {

__ldb_mmu ,__ldw_mmu ,__ldl_mmu ,__ldq_mmu ,

};*/

Page 34: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找MMU II

/* jmp label2 */tcg_out8(s, 0xeb);label2_ptr = s � >code_ptr;s � >code_ptr ++;

/* label1: */*label1_ptr = s � >code_ptr � label1_ptr � 1;

/* add x(r1), r0 */tcg_out_modrm_offset(s, 0x03 , r0, r1, offsetof(

CPUTLBEntry , addend) �offsetof(CPUTLBEntry ,

addr_read));switch(opc) {case 0:

/* movzbl */tcg_out_modrm_offset(s, 0xb6 | P_EXT ,

data_reg , r0, 0);break;break;

Page 35: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

tcg_out_qemu_ld-查找MMU III

default:tcg_abort ();

}

#if defined(CONFIG_SOFTMMU)/* label2: */*label2_ptr = s � >code_ptr � label2_ptr � 1;

#endif}

Page 36: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

__ldl_mmu I

DATA_TYPE REGPARM glue(glue(__ld , SUFFIX), MMUSUFFIX)(target_ulong addr ,int mmu_idx){

/* test if there is match for unaligned or IOaccess */

/* XXX: could done more in memory macro in a nonportable way */

redo://first lookup in tlbtlb_addr = env � >tlb_table[mmu_idx ][index]. ADDR_READ;if (in tlb){

if (...) {/* IO access */res = glue(io_read , SUFFIX)(addend , addr ,

retaddr);} else if ((( addr & ~TARGET_PAGE_MASK) +

DATA_SIZE � 1) >= TARGET_PAGE_SIZE) {/* slow unaligned access (it spans two

pages or IO) */

Page 37: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

__ldl_mmu II

res = glue(glue(slow_ld , SUFFIX),MMUSUFFIX)

(addr ,mmu_idx ,retaddr);} else {

/* unaligned/aligned access in the samepage */

res = glue(glue(ld, USUFFIX), _raw)((uint8_t *)(long)(addr+addend));

// ldl_raw (...)}

} else {/* the page is not in the TLB : fill it */retaddr = GETPC();tlb_fill(addr , READ_ACCESS_TYPE , mmu_idx ,

retaddr);goto redo;

}return res;

}

Page 38: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

__ldl_mmu III

Page 39: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

sysenter族指令翻译 I

// disas_insn ()

case 0x134: /* sysenter */if (CODE64(s))goto illegal_op;

if (!s � >pe) {gen_exception(s, EXCP0D_GPF , pc_start � s � >

cs_base);} else {if (s � >cc_op != CC_OP_DYNAMIC) {

gen_op_set_cc_op(s � >cc_op);s � >cc_op = CC_OP_DYNAMIC;

}gen_jmp_im(pc_start � s � >cs_base);tcg_gen_helper_0_0(helper_sysenter);

//个目的参数,个源参数00gen_eob(s);

}

Page 40: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

sysenter族指令翻译 II

// op_helper.cvoid helper_sysenter(void){

if (env � >sysenter_cs == 0) {raise_exception_err(EXCP0D_GPF , 0);

}env � >eflags &= ~( VM_MASK | IF_MASK | RF_MASK);cpu_x86_set_cpl(env , 0);cpu_x86_load_seg_cache(env , R_CS , ...);cpu_x86_load_seg_cache(env , R_SS , ...);ESP = env � >sysenter_esp;EIP = env � >sysenter_eip;

}

Page 41: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

ljmp族指令翻译 I

...;tcg_gen_helper_0_3(helper_ljmp_protected ,cpu_tmp2_i32 ,cpu_T[1],tcg_const_i32(s � >pc � pc_start));

...;

// op_helper.c/* protected mode jump */void helper_ljmp_protected

(int new_cs , target_ulong new_eip ,int next_eip_addend)}

...;case 5: /* task gate */if (dpl < cpl || dpl < rpl)

raise_exception_err(EXCP0D_GPF , new_cs & 0xfffc);

next_eip = env � >eip + next_eip_addend;

Page 42: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

ljmp族指令翻译 II

switch_tss(new_cs , e1, e2, SWITCH_TSS_JMP , next_eip);

{...; cpu_x86_update_cr3(env , new_cr3){tlb_flush(env, 0);};

...;}CC_OP = CC_OP_EFLAGS;

...;}

Page 43: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

mov crN,reg指令 I

case 0x122: /* mov crN , reg */tcg_gen_helper_0_2(helper_write_crN ,tcg_const_i32(reg), cpu_T [0]);

{cpu_x86_update_cr3(env , t0);}

Page 44: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

论文、源码阅读 I

罗省贤,洪志权.汇编语言程序设计教程.电子工业出版社, 2004.

Intel co.Ltd.Intel® 64 and IA-32 Architectures SoftwareDeveloper’s Manual, volume 1:Basic Architecture.Intel, 2004.

Intel co.Ltd.Intel® 64 and IA-32 Architectures SoftwareDeveloper’s Manual, volume 3A:System ProgrammingGuide, Part 1.Intel, 2004.

Fabrice Bellard.Qemu, a fast and portable dynamic translator.Journal on Selected Area, 11(15):754–755, 2006.

Page 45: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

论文、源码阅读 II

QEMU svn.svn://svn.sv.gnu.org/qemu.

QEMU.http://bellard.org/qemu/.

John L. Hennessy and David A. Patterson.Computer Organization & Design.机械工业出版社, 1999.

Randal E.Bryant and David O’Hallaron.深入理解计算机系统.中国电力出版社, 2004.

Page 46: Memory Simulation in QEMU

QEMU内存管理

陈志杰

背景知识x86架构介绍

虚拟存储器

特权级切换

上下文切换

QEMU初始化注册Machine

物理内存模拟

分配mmu0 PD

MMU0映射

运行时模拟读写内存

切换指令翻译

参考文献

LATEX . . . . . .

.Thanks.... ..

.

.谢谢大家!