Memory Simulation in QEMU
Upcoming SlideShare
Loading in...5
×
 

Memory Simulation in QEMU

on

  • 5,544 views

 

Statistics

Views

Total Views
5,544
Slideshare-icon Views on SlideShare
5,515
Embed Views
29

Actions

Likes
2
Downloads
232
Comments
0

1 Embed 29

http://www.slideshare.net 29

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Memory Simulation in QEMU Memory Simulation in QEMU Presentation Transcript

    • QEMU内存管理 陈志杰 . 背景知识 . x86架构介绍 虚拟存储器 QEMU源码分析之:内存模拟 特权级切换 上下文切换 QEMU初始化 注册Machine . —以x86架构为例 .. . . 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 陈志杰 读写内存 切换指令翻译 chenzhijie@icst.pku.edu.cn 参考文献 计算机科学技术研究所信安中心 July 25, 2008 L TEX ) . . . . . .
    • 内容大纲 QEMU内存管理 .. 陈志杰 .1 背景知识 背景知识 x86架构介绍 x86架构介绍 虚拟存储器 虚拟存储器 特权级切换 特权级切换 上下文切换 QEMU初始化 上下文切换 注册Machine 物理内存模拟 .. 分配mmu0 PD .2 QEMU初始化 注册Machine MMU0映射 运行时模拟 读写内存 物理内存模拟 分配mmu0 PD 切换指令翻译 参考文献 MMU0映射 .. .3 QEMU运行时内存模拟 读写内存 切换指令翻译 L TEX ) . . . . . .
    • 内容大纲 QEMU内存管理 .. 陈志杰 .1 背景知识 背景知识 x86架构介绍 x86架构介绍 虚拟存储器 虚拟存储器 特权级切换 特权级切换 上下文切换 QEMU初始化 上下文切换 注册Machine 物理内存模拟 .. 分配mmu0 PD .2 QEMU初始化 注册Machine MMU0映射 运行时模拟 读写内存 物理内存模拟 分配mmu0 PD 切换指令翻译 参考文献 MMU0映射 .. .3 QEMU运行时内存模拟 读写内存 切换指令翻译 L TEX ) . . . . . .
    • x86架构32位微处理器 QEMU内存管理 陈志杰 背景知识 寄存器组[1] (已过时,请查阅时以[2] 为准) x86架构介绍 虚拟存储器 通用寄存器(32位)*8: 特权级切换 上下文切换 EAX,EBX,ECX,EDX,ESI,EDI,EBP QEMU初始化 段寄存器/段选择子(16位)*6:CS,DS,ES,SS,FS,GS 注册Machine 物理内存模拟 分配mmu0 PD 标志寄存器(32位)*1:EFLAG MMU0映射 指令指针寄存器(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)。 L TEX ) . . . . . .
    • 控制寄存器 QEMU内存管理 PDBR:Page Directory Base Register, PG:分页允许位, PE: 陈志杰 保护模式允许位 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 控制寄存器[3] L TEX ) . . . . . .
    • 虚拟存储器原理 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 虚拟存储器原理 L TEX ) . . . . . .
    • 内存共享与访问控制 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 内存共享与访问控制 L TEX ) . . . . . .
    • 几个基本概念 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) 图: 基本概念 . . . . . .
    • 二级页表 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 二级页表 L TEX ) . . . . . .
    • 虚拟地址分段 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 虚拟地址分段 L TEX ) . . . . . .
    • 物理地址分段 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: 物理地址分段 L TEX ) . . . . . .
    • Pentium内存访问实例 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 图: Pentium内存访问实例 L TEX ) . . . . . .
    • Linux虚拟存储器管理 QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • 异常控制流 QEMU内存管理 陈志杰 背景知识 . x86架构介绍 特权级 . 虚拟存储器 特权级切换 .. 上下文切换 0:系统态 QEMU初始化 3:用户态 . .. . . 注册Machine 物理内存模拟 分配mmu0 PD . MMU0映射 异常(Exception)的分类 . 运行时模拟 .. 读写内存 中断(Interrupt)(时钟、I/O……,异步,返回下一条指 切换指令翻译 参考文献 令)、陷阱(trap)(sysenter、int……,同步,返回下一 条)、故障(Interrupt)(缺页异常……,同步,返回当前或不 返回)、终止(Abort)(硬件错误,同步,不返回)。 . .. . . L TEX ) . . . . . .
    • 进程上下文切换(只关注MMU) QEMU内存管理 陈志杰 背景知识 x86架构介绍 . 虚拟存储器 用于改变MMU的指令 . 特权级切换 .. 上下文切换 ljmp,lcall,iret:TSS Switching QEMU初始化 注册Machine . mov crN,reg:faster .. . . 物理内存模拟 . 分配mmu0 PD MMU0映射 OS任务调度 . 运行时模拟 读写内存 .. 切换指令翻译 Linux mov crN,reg方法,在switch_mm函数中将 参考文献 new_task->pgd设置到cr3寄存器中。 . Window$ ?? .. . . L TEX ) . . . . . .
    • 内容大纲 QEMU内存管理 .. 陈志杰 .1 背景知识 背景知识 x86架构介绍 x86架构介绍 虚拟存储器 虚拟存储器 特权级切换 特权级切换 上下文切换 QEMU初始化 上下文切换 注册Machine 物理内存模拟 .. 分配mmu0 PD .2 QEMU初始化 注册Machine MMU0映射 运行时模拟 读写内存 物理内存模拟 分配mmu0 PD 切换指令翻译 参考文献 MMU0映射 .. .3 QEMU运行时内存模拟 读写内存 切换指令翻译 L TEX ) . . . . . .
    • 注册Machine I QEMU内存管理 陈志杰 main () ; // vl . c7985 { 背景知识 register_machines () ; // at / home / joyan / code / qemu x86架构介绍 虚拟存储器 compile / target i386 / machine . c :9 特权级切换 //将 ‘加入到虚拟机列表machine‘ 上下文切换 //参数解析 QEMU初始化 注册Machine //指定硬盘; 物理内存模拟 //指定启动次序; 分配mmu0 PD MMU0映射 //初始化 ‘数据结构;timer‘ 运行时模拟 qemu_aio_init () ; // at / home / joyan / code / qemu 读写内存 compile / block raw posix . c :455 切换指令翻译 //初始化网络接口; 参考文献 L TEX ) . . . . . .
    • 注册Machine II QEMU内存管理 陈志杰 typedef struct QEMUMachine { const char * name ; 背景知识 const char * desc ; x86架构介绍 虚拟存储器 QEMUMachineInitFunc * init ; 特权级切换 ram_addr_t ram_require ; 上下文切换 struct QEMUMachine * next ; QEMU初始化 注册Machine } QEMUMachine ; 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • Guest物理内存模拟 I QEMU内存管理 陈志杰 //初始化内存: phys_ram_size = machine >ram_require & ~ 背景知识 RAMSIZE_FIXED ; x86架构介绍 虚拟存储器 /* 特权级切换 phys_ram_size = 12582912 上下文切换 machine >ram_require = 12582912 QEMU初始化 注册Machine # define RAMSIZE_FIXED 1 物理内存模拟 */ 分配mmu0 PD MMU0映射 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 memoryn”, machine >name , (unsigned long long) phys_ram_size ) ; exit( 1); } phys_ram_size = ram_size ; } else L TEX ) . . . . . .
    • Guest物理内存模拟 II QEMU内存管理 ram_size = phys_ram_size ; 陈志杰 } else { if ( ram_size == 0) 背景知识 x86架构介绍 ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; 虚拟存储器 phys_ram_size += ram_size ; 特权级切换 上下文切换 // phys_ram_size = 146800640 QEMU初始化 } 注册Machine //为 ‘machine 分配内存 ‘ 物理内存模拟 分配mmu0 PD phys_ram_base = qemu_vmalloc ( phys_ram_size ) ; MMU0映射 // 运行时模拟 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 读写内存 切换指令翻译 if (! phys_ram_base ) { } 参考文献 L TEX ) . . . . . .
    • 分配MMU0 PD(用于GuestPA->HostVA) I QEMU内存管理 陈志杰 /* init the dynamic translator */ cpu_exec_init_all ( tb_size * 1024 * 1024) ; 背景知识 // cpu_exec_init_all ( tb_size =0) at / home / joyan / x86架构介绍 虚拟存储器 code / qemu compile / exec . c :449 特权级切换 { 上下文切换 //注册 ‘tbs 空间并为其分配内存 ‘ QEMU初始化 注册Machine cpu_gen_init () ; 物理内存模拟 code_gen_alloc ( tb_size ) ; 分配mmu0 PD MMU0映射 code_gen_ptr = code_gen_buffer ; 运行时模拟 读写内存 page_init () ; // at / home / joyan / code / qemu compile / 切换指令翻译 exec . c :240 参考文献 { { /* NOTE : we can always suppose that qemu_host_page_size >= TARGET_PAGE_SIZE */ qemu_host_page_mask = ~( qemu_host_page_size 1) ; L TEX ) . . . . . .
    • 分配MMU0 PD(用于GuestPA->HostVA) II QEMU内存管理 陈志杰 //为‘L1_cache 分配空间,由‘ ‘l1_phys_map 指向‘ l1_phys_map = qemu_vmalloc ( L1_SIZE * sizeof 背景知识 x86架构介绍 (void *) ); 虚拟存储器 // 特权级切换 上下文切换 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ QEMU初始化 注册Machine memset ( l1_phys_map , 0 , L1_SIZE * sizeof( 物理内存模拟 分配mmu0 PD void *) ); MMU0映射 } 运行时模拟 } 读写内存 切换指令翻译 io_mem_init () ; // io_mem_init () at / home / joyan / code / qemu 参考文献 compile / exec . c :2592 } L TEX ) . . . . . .
    • 映射Guest物理内存到HostVA QEMU内存管理 陈志杰 ...; machine >init (...) 背景知识 { x86架构介绍 虚拟存储器 /* allocate RAM */ 特权级切换 ram_addr = qemu_ram_alloc ( ram_size ); 上下文切换 cpu_register_physical_memory (0 , below_4g_mem_size QEMU初始化 注册Machine , ram_addr ) ; 物理内存模拟 { 分配mmu0 PD MMU0映射 for( all phyMem ) {...; 运行时模拟 p = phys_page_find_alloc ( addr >> 读写内存 TARGET_PAGE_BITS , 1) ; 切换指令翻译 } // subpage ?? 参考文献 } } L TEX ) . . . . . .
    • 内容大纲 QEMU内存管理 .. 陈志杰 .1 背景知识 背景知识 x86架构介绍 x86架构介绍 虚拟存储器 虚拟存储器 特权级切换 特权级切换 上下文切换 QEMU初始化 上下文切换 注册Machine 物理内存模拟 .. 分配mmu0 PD .2 QEMU初始化 注册Machine MMU0映射 运行时模拟 读写内存 物理内存模拟 分配mmu0 PD 切换指令翻译 参考文献 MMU0映射 .. .3 QEMU运行时内存模拟 读写内存 切换指令翻译 L TEX ) . . . . . .
    • 含读写内存指令的翻译 I QEMU内存管理 以inc [mem_addr]为例: 陈志杰 disas_insn (...) 背景知识 x86架构介绍 {...; 虚拟存储器 case 0 xff : /* GRP5 */ 特权级切换 上下文切换 if (( b & 1) == 0) QEMU初始化 ot = OT_BYTE ; 注册Machine else 物理内存模拟 分配mmu0 PD ot = dflag + OT_WORD ; MMU0映射 运行时模拟 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) ; L TEX ) . . . . . .
    • 含读写内存指令的翻译 II QEMU内存管理 break; 陈志杰 ...; } 背景知识 x86架构介绍 } 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • gen_inc(s,ot,opreg(OR_TMP0),1) I QEMU内存管理 陈志杰 /* if d == OR_TMP0 , it means memory operand ( address in A0 ) */ 背景知识 static void gen_inc ( DisasContext * s1 , int ot , int x86架构介绍 虚拟存储器 d , int c) 特权级切换 {...; 上下文切换 gen_op_ld_T0_A0 ( ot + s1 >mem_index ); QEMU初始化 注册Machine /* int mem_index ; select memory access functions 物理内存模拟 */ 分配mmu0 PD MMU0映射 ...; 运行时模拟 } 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • gen_op_ld_T0_A0(ot + s1->mem_index); I QEMU内存管理 陈志杰 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; x86架构介绍 虚拟存储器 tcg_gen_qemu_ld8u ( t0 , a0 , mem_index ) ; 特权级切换 tcg_gen_op3i ( INDEX_op_qemu_ld8u , ret , addr , 上下文切换 mem_index ); QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • INDEX_op_qemu_ld8u QEMU内存管理 陈志杰 static inline void tcg_out_op ( TCGContext *s , int opc , const TCGArg * args , const int * 背景知识 const_args ) x86架构介绍 虚拟存储器 {...; 特权级切换 case INDEX_op_qemu_ld8u : 上下文切换 tcg_out_qemu_ld (s , args , 0) ; QEMU初始化 注册Machine break; 物理内存模拟 ...; 分配mmu0 PD MMU0映射 } 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找TLB I QEMU内存管理 陈志杰 static void tcg_out_qemu_ld ( TCGContext *s , const TCGArg * args , 背景知识 int opc ) x86架构介绍 虚拟存储器 data_reg = * args ++; 特权级切换 addr_reg = * args ++; 上下文切换 mem_index = * args ; QEMU初始化 注册Machine s_bits = opc & 3; 物理内存模拟 r0 = TCG_REG_EAX ; 分配mmu0 PD MMU0映射 r1 = TCG_REG_EDX ; 运行时模拟 读写内存 tcg_out_mov (s , r1 , addr_reg ) ; 切换指令翻译 tcg_out_mov (s , r0 , addr_reg ) ; 参考文献 tcg_out_modrm (s , 0 xc1 , 5, r1 ) ; /* shr $x , r1 */ tcg_out8 (s , TARGET_PAGE_BITS CPU_TLB_ENTRY_BITS ); tcg_out_modrm (s , 0 x81 , 4, r0 ) ; /* andl $x , r0 */ tcg_out32 (s , TARGET_PAGE_MASK | ((1 << s_bits ) 1) ); // $x tcg_out_modrm (s , 0 x81 , 4, r1 ) ; /* andl $x , r1 */ L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找TLB II QEMU内存管理 tcg_out32 (s , ( CPU_TLB_SIZE 1) << CPU_TLB_ENTRY_BITS 陈志杰 ); 背景知识 x86架构介绍 tcg_out_opc (s , 0 x8d ) ; /* lea offset ( r1 , % ebp ) , r1 */ 虚拟存储器 tcg_out8 (s , 0 x80 | ( r1 << 3) | 0 x04 ) ; 特权级切换 上下文切换 tcg_out8 (s , (5 << 3) | r1 ); QEMU初始化 tcg_out32 (s , offsetof ( CPUState , tlb_table [ mem_index 注册Machine ][0]. addr_read ) ) ; 物理内存模拟 分配mmu0 PD // ~~~~~~~~~~~~~~~~~~~~~ mem_index indicates the privi . MMU0映射 level 运行时模拟 读写内存 切换指令翻译 /* cmp 0( r1 ) , r0 */ tcg_out_modrm_offset (s , 0 x3b , r0 , r1 , 0) ; 参考文献 tcg_out_mov (s , r0 , addr_reg ) ; /* je label1 */ tcg_out8 (s , 0 x70 + JCC_JE ) ; label1_ptr = s >code_ptr ; s >code_ptr ++; L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找TLB III QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找MMU I QEMU内存管理 陈志杰 //参数是怎么设置的? tcg_out_movi (s , TCG_TYPE_I32 , TCG_REG_EDX , 背景知识 mem_index ) ; x86架构介绍 虚拟存储器 tcg_out8 (s , 0 xe8 ); 特权级切换 tcg_out32 (s , ( tcg_target_long ) qemu_ld_helpers [ 上下文切换 s_bits ] QEMU初始化 注册Machine ( tcg_target_long )s >code_ptr 4) ; 物理内存模拟 // 分配mmu0 PD MMU0映射 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 运行时模拟 读写内存 /* 切换指令翻译 static void * qemu_ld_helpers [4] = { 参考文献 __ldb_mmu , __ldw_mmu , __ldl_mmu , __ldq_mmu , }; */ L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找MMU II QEMU内存管理 /* jmp label2 */ 陈志杰 tcg_out8 (s , 0 xeb ); label2_ptr = s >code_ptr ; 背景知识 x86架构介绍 s >code_ptr ++; 虚拟存储器 特权级切换 上下文切换 /* label1 : */ QEMU初始化 * label1_ptr = s >code_ptr label1_ptr 1; 注册Machine 物理内存模拟 分配mmu0 PD /* add x ( r1 ) , r0 */ MMU0映射 tcg_out_modrm_offset (s , 0 x03 , r0 , r1 , offsetof ( 运行时模拟 CPUTLBEntry , addend ) 读写内存 切换指令翻译 offsetof ( CPUTLBEntry , addr_read )); 参考文献 switch( opc ) { case 0: /* movzbl */ tcg_out_modrm_offset (s , 0 xb6 | P_EXT , data_reg , r0 , 0) ; break; break; L TEX ) . . . . . .
    • tcg_out_qemu_ld-查找MMU III QEMU内存管理 default: 陈志杰 tcg_abort () ; } 背景知识 x86架构介绍 虚拟存储器 #if defined ( CONFIG_SOFTMMU ) 特权级切换 上下文切换 /* label2 : */ QEMU初始化 * label2_ptr = s >code_ptr label2_ptr 1; 注册Machine #endif 物理内存模拟 分配mmu0 PD } MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • __ldl_mmu I QEMU内存管理 陈志杰 DATA_TYPE REGPARM glue ( glue ( __ld , SUFFIX ) , MMUSUFFIX ) ( target_ulong addr ,int mmu_idx ) 背景知识 { x86架构介绍 虚拟存储器 /* test if there is match for unaligned or IO 特权级切换 access */ 上下文切换 /* XXX : could done more in memory macro in a non QEMU初始化 注册Machine portable way */ 物理内存模拟 redo : 分配mmu0 PD MMU0映射 // first lookup in tlb 运行时模拟 tlb_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 ) */ L TEX ) . . . . . .
    • __ldl_mmu II QEMU内存管理 res = glue ( glue ( slow_ld , SUFFIX ) , 陈志杰 MMUSUFFIX ) ( addr , mmu_idx , retaddr ) ; 背景知识 x86架构介绍 } else { 虚拟存储器 /* unaligned / aligned access in the same 特权级切换 上下文切换 page */ QEMU初始化 res = glue ( glue ( ld , USUFFIX ) , _raw ) (( 注册Machine uint8_t *) (long)( addr + addend ) ) ; 物理内存模拟 分配mmu0 PD // ldl_raw (...) MMU0映射 } 运行时模拟 } 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 ; } L TEX ) . . . . . .
    • __ldl_mmu III QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • sysenter族指令翻译 I QEMU内存管理 陈志杰 // disas_insn () 背景知识 case 0 x134 : /* sysenter */ x86架构介绍 虚拟存储器 if ( CODE64 ( s )) 特权级切换 goto illegal_op ; 上下文切换 if (!s >pe ) { QEMU初始化 注册Machine gen_exception (s , EXCP0D_GPF , pc_start s > 物理内存模拟 cs_base ) ; 分配mmu0 PD MMU0映射 } 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 ) ; //个目的参数,个源参数00 gen_eob ( s) ; } L TEX ) . . . . . .
    • sysenter族指令翻译 II QEMU内存管理 陈志杰 // op_helper . c void helper_sysenter (void) 背景知识 { x86架构介绍 虚拟存储器 if ( env >sysenter_cs == 0) { 特权级切换 raise_exception_err ( EXCP0D_GPF , 0) ; 上下文切换 } QEMU初始化 注册Machine env >eflags &= ~( VM_MASK | IF_MASK | RF_MASK ); 物理内存模拟 cpu_x86_set_cpl ( env , 0) ; 分配mmu0 PD MMU0映射 cpu_x86_load_seg_cache ( env , R_CS , ...) ; 运行时模拟 cpu_x86_load_seg_cache ( env , R_SS , ...) ; 读写内存 ESP = env >sysenter_esp ; 切换指令翻译 EIP = env >sysenter_eip ; 参考文献 } L TEX ) . . . . . .
    • ljmp族指令翻译 I QEMU内存管理 陈志杰 ...; tcg_gen_helper_0_3 ( helper_ljmp_protected , 背景知识 cpu_tmp2_i32 , x86架构介绍 虚拟存储器 cpu_T [1] , 特权级切换 tcg_const_i32 (s >pc pc_start ) ) ; 上下文切换 ...; QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD // op_helper . c MMU0映射 /* 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 & 0 xfffc ) ; next_eip = env >eip + next_eip_addend ; L TEX ) . . . . . .
    • ljmp族指令翻译 II QEMU内存管理 switch_tss ( new_cs , e1 , e2 , SWITCH_TSS_JMP , next_eip 陈志杰 ); {...; cpu_x86_update_cr3 ( env , new_cr3 ) { tlb_flush ( env 背景知识 x86架构介绍 , 0) ;}; 虚拟存储器 ...;} 特权级切换 上下文切换 CC_OP = CC_OP_EFLAGS ; QEMU初始化 ...;} 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • mov crN,reg指令 I QEMU内存管理 陈志杰 case 0 x122 : /* mov crN , reg */ tcg_gen_helper_0_2 ( helper_write_crN , 背景知识 tcg_const_i32 ( reg ) , cpu_T [0]) ; x86架构介绍 虚拟存储器 { cpu_x86_update_cr3 ( env , t0 ) ;} 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .
    • 论文、源码阅读 I QEMU内存管理 陈志杰 罗省贤,洪志权. 汇编语言程序设计教程. 背景知识 x86架构介绍 电子工业出版社, 2004. 虚拟存储器 特权级切换 上下文切换 Intel co.Ltd. QEMU初始化 Intel® 64 and IA-32 Architectures Software 注册Machine 物理内存模拟 Developer’s Manual, volume 1:Basic Architecture. 分配mmu0 PD MMU0映射 Intel, 2004. 运行时模拟 Intel co.Ltd. 读写内存 切换指令翻译 Intel® 64 and IA-32 Architectures Software 参考文献 Developer’s Manual, volume 3A:System Programming Guide, Part 1. Intel, 2004. Fabrice Bellard. Qemu, a fast and portable dynamic translator. Journal on Selected Area, 11(15):754–755, 2006. L TEX ) . . . . . .
    • 论文、源码阅读 II QEMU内存管理 陈志杰 背景知识 x86架构介绍 QEMU svn. 虚拟存储器 特权级切换 svn://svn.sv.gnu.org/qemu. 上下文切换 QEMU初始化 QEMU. 注册Machine 物理内存模拟 http://bellard.org/qemu/. 分配mmu0 PD MMU0映射 John L. Hennessy and David A. Patterson. 运行时模拟 Computer Organization & Design. 读写内存 切换指令翻译 机械工业出版社, 1999. 参考文献 Randal E.Bryant and David O’Hallaron. 深入理解计算机系统. 中国电力出版社, 2004. L TEX ) . . . . . .
    • QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 . 注册Machine Thanks . 物理内存模拟 .. 分配mmu0 PD MMU0映射 谢谢大家! . .. . . 运行时模拟 读写内存 切换指令翻译 参考文献 L TEX ) . . . . . .