Upload
z-chen
View
4.895
Download
5
Embed Size (px)
Citation preview
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
.
.
. ..
.
.
QEMU源码分析之:内存模拟
—以x86架构为例
计算机科学技术研究所信安中心
July 25, 2008
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
内容大纲
...1 背景知识
x86架构介绍虚拟存储器特权级切换上下文切换
...2 QEMU初始化
注册Machine物理内存模拟分配mmu0 PDMMU0映射
...3 QEMU运行时内存模拟
读写内存切换指令翻译
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
内容大纲
...1 背景知识
x86架构介绍虚拟存储器特权级切换上下文切换
...2 QEMU初始化
注册Machine物理内存模拟分配mmu0 PDMMU0映射
...3 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)。
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
控制寄存器
PDBR:Page Directory Base Register, PG:分页允许位, PE:保护模式允许位
图: 控制寄存器[3]
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
虚拟存储器原理
图: 虚拟存储器原理
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
内存共享与访问控制
图: 内存共享与访问控制
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
几个基本概念
图: 基本概念
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
二级页表
图: 二级页表
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
虚拟地址分段
图: 虚拟地址分段
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
物理地址分段
图: 物理地址分段
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
Pentium内存访问实例
图: Pentium内存访问实例
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
Linux虚拟存储器管理
图: Linux虚拟存储器管理
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
异常控制流
.特权级..
.
. ..
.
.
0:系统态3:用户态
.异常(Exception)的分类..
.
. ..
.
.
中断(Interrupt)(时钟、I/O……,异步,返回下一条指令)、陷阱(trap)(sysenter、int……,同步,返回下一条)、故障(Interrupt)(缺页异常……,同步,返回当前或不返回)、终止(Abort)(硬件错误,同步,不返回)。
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$ ??
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
内容大纲
...1 背景知识
x86架构介绍虚拟存储器特权级切换上下文切换
...2 QEMU初始化
注册Machine物理内存模拟分配mmu0 PDMMU0映射
...3 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//初始化网络接口;
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;
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
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) { }
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);
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}
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 ??
}}
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
内容大纲
...1 背景知识
x86架构介绍虚拟存储器特权级切换上下文切换
...2 QEMU初始化
注册Machine物理内存模拟分配mmu0 PDMMU0映射
...3 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);
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
含读写内存指令的翻译 II
break;...;
}}
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
*/...;
}
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);
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;...;
}
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 */
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 ++;
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
tcg_out_qemu_ld-查找TLB III
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 ,
};*/
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;
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}
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) */
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;
}
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
__ldl_mmu III
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);
}
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;
}
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;
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;
...;}
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);}
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.
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.
QEMU内存管理
陈志杰
背景知识x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟读写内存
切换指令翻译
参考文献
LATEX . . . . . .
.Thanks.... ..
.
.谢谢大家!