Memory Simulation in QEMU
- 1. QEMU内存管理
陈志杰
.
背景知识
.
x86架构介绍
虚拟存储器 QEMU源码分析之:内存模拟
特权级切换
上下文切换
QEMU初始化
注册Machine . —以x86架构为例
.. .
.
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟 陈志杰
读写内存
切换指令翻译 chenzhijie@icst.pku.edu.cn
参考文献
计算机科学技术研究所信安中心
July 25, 2008
L TEX
) . . . . . .
- 2. 内容大纲
QEMU内存管理
..
陈志杰 .1 背景知识
背景知识
x86架构介绍
x86架构介绍
虚拟存储器
虚拟存储器
特权级切换 特权级切换
上下文切换
QEMU初始化
上下文切换
注册Machine
物理内存模拟
..
分配mmu0 PD
.2 QEMU初始化
注册Machine
MMU0映射
运行时模拟
读写内存 物理内存模拟
分配mmu0 PD
切换指令翻译
参考文献
MMU0映射
..
.3 QEMU运行时内存模拟
读写内存
切换指令翻译
L TEX
) . . . . . .
- 3. 内容大纲
QEMU内存管理
..
陈志杰 .1 背景知识
背景知识
x86架构介绍
x86架构介绍
虚拟存储器
虚拟存储器
特权级切换 特权级切换
上下文切换
QEMU初始化
上下文切换
注册Machine
物理内存模拟
..
分配mmu0 PD
.2 QEMU初始化
注册Machine
MMU0映射
运行时模拟
读写内存 物理内存模拟
分配mmu0 PD
切换指令翻译
参考文献
MMU0映射
..
.3 QEMU运行时内存模拟
读写内存
切换指令翻译
L TEX
) . . . . . .
- 4. 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
) . . . . . .
- 5. 控制寄存器
QEMU内存管理 PDBR:Page Directory Base Register, PG:分页允许位, PE:
陈志杰 保护模式允许位
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 控制寄存器[3]
L TEX
) . . . . . .
- 6. 虚拟存储器原理
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 虚拟存储器原理
L TEX
) . . . . . .
- 7. 内存共享与访问控制
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 内存共享与访问控制
L TEX
) . . . . . .
- 8. 几个基本概念
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
L TEX
) 图: 基本概念
. . . . . .
- 9. 二级页表
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 二级页表
L TEX
) . . . . . .
- 10. 虚拟地址分段
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 虚拟地址分段
L TEX
) . . . . . .
- 11. 物理地址分段
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: 物理地址分段
L TEX
) . . . . . .
- 12. Pentium内存访问实例
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
图: Pentium内存访问实例
L TEX
) . . . . . .
- 13. Linux虚拟存储器管理
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
L TEX
) . . . . . .
- 14. 异常控制流
QEMU内存管理
陈志杰
背景知识
.
x86架构介绍
特权级 .
虚拟存储器
特权级切换 ..
上下文切换 0:系统态
QEMU初始化
3:用户态
.
.. .
.
注册Machine
物理内存模拟
分配mmu0 PD .
MMU0映射
异常(Exception)的分类 .
运行时模拟 ..
读写内存 中断(Interrupt)(时钟、I/O……,异步,返回下一条指
切换指令翻译
参考文献
令)、陷阱(trap)(sysenter、int……,同步,返回下一
条)、故障(Interrupt)(缺页异常……,同步,返回当前或不
返回)、终止(Abort)(硬件错误,同步,不返回)。
.
.. .
.
L TEX
) . . . . . .
- 15. 进程上下文切换(只关注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
) . . . . . .
- 16. 内容大纲
QEMU内存管理
..
陈志杰 .1 背景知识
背景知识
x86架构介绍
x86架构介绍
虚拟存储器
虚拟存储器
特权级切换 特权级切换
上下文切换
QEMU初始化
上下文切换
注册Machine
物理内存模拟
..
分配mmu0 PD
.2 QEMU初始化
注册Machine
MMU0映射
运行时模拟
读写内存 物理内存模拟
分配mmu0 PD
切换指令翻译
参考文献
MMU0映射
..
.3 QEMU运行时内存模拟
读写内存
切换指令翻译
L TEX
) . . . . . .
- 17. 注册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
) . . . . . .
- 18. 注册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
) . . . . . .
- 19. 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
) . . . . . .
- 20. 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
) . . . . . .
- 21. 分配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
) . . . . . .
- 22. 分配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
) . . . . . .
- 23. 映射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
) . . . . . .
- 24. 内容大纲
QEMU内存管理
..
陈志杰 .1 背景知识
背景知识
x86架构介绍
x86架构介绍
虚拟存储器
虚拟存储器
特权级切换 特权级切换
上下文切换
QEMU初始化
上下文切换
注册Machine
物理内存模拟
..
分配mmu0 PD
.2 QEMU初始化
注册Machine
MMU0映射
运行时模拟
读写内存 物理内存模拟
分配mmu0 PD
切换指令翻译
参考文献
MMU0映射
..
.3 QEMU运行时内存模拟
读写内存
切换指令翻译
L TEX
) . . . . . .
- 25. 含读写内存指令的翻译 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
) . . . . . .
- 26. 含读写内存指令的翻译 II
QEMU内存管理
break;
陈志杰 ...;
}
背景知识
x86架构介绍
}
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
L TEX
) . . . . . .
- 27. 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
) . . . . . .
- 28. 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
) . . . . . .
- 29. 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
) . . . . . .
- 30. 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
) . . . . . .
- 31. 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
) . . . . . .
- 33. 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
) . . . . . .
- 34. 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
) . . . . . .
- 35. 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
) . . . . . .
- 36. __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
) . . . . . .
- 37. __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
) . . . . . .
- 38. __ldl_mmu III
QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化
注册Machine
物理内存模拟
分配mmu0 PD
MMU0映射
运行时模拟
读写内存
切换指令翻译
参考文献
L TEX
) . . . . . .
- 39. 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
) . . . . . .
- 40. 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
) . . . . . .
- 41. 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
) . . . . . .
- 42. 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
) . . . . . .
- 43. 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
) . . . . . .
- 44. 论文、源码阅读 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
) . . . . . .
- 45. 论文、源码阅读 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
) . . . . . .
- 46. QEMU内存管理
陈志杰
背景知识
x86架构介绍
虚拟存储器
特权级切换
上下文切换
QEMU初始化 .
注册Machine
Thanks .
物理内存模拟 ..
分配mmu0 PD
MMU0映射 谢谢大家!
.
.. .
.
运行时模拟
读写内存
切换指令翻译
参考文献
L TEX
) . . . . . .