SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
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
 )                    .   .   .   .   .   .

Más contenido relacionado

La actualidad más candente

QM-040-全面品質管理
QM-040-全面品質管理QM-040-全面品質管理
QM-040-全面品質管理handbook
 
入門啟示錄Ch02簡報
入門啟示錄Ch02簡報入門啟示錄Ch02簡報
入門啟示錄Ch02簡報Chiou WeiHao
 
入門啟示錄Ch05簡報
入門啟示錄Ch05簡報入門啟示錄Ch05簡報
入門啟示錄Ch05簡報Chiou WeiHao
 
IE-019 何謂供應鏈管理
IE-019 何謂供應鏈管理IE-019 何謂供應鏈管理
IE-019 何謂供應鏈管理handbook
 
Cre 020 創意與創新行銷
Cre 020 創意與創新行銷Cre 020 創意與創新行銷
Cre 020 創意與創新行銷handbook
 
第3章 計算機組織 (Update)
第3章 計算機組織 (Update)第3章 計算機組織 (Update)
第3章 計算機組織 (Update)Seng Chi Ao
 
第1章 計算機簡介
第1章 計算機簡介第1章 計算機簡介
第1章 計算機簡介Seng Chi Ao
 
批处理程序教程
批处理程序教程批处理程序教程
批处理程序教程Chui-Wen Chiu
 
IE-036-豐田生產方式
IE-036-豐田生產方式IE-036-豐田生產方式
IE-036-豐田生產方式handbook
 
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導JiunYi Yang
 
Hr 017 社會新鮮人生涯規劃
Hr 017 社會新鮮人生涯規劃Hr 017 社會新鮮人生涯規劃
Hr 017 社會新鮮人生涯規劃handbook
 
結構化程式設計
結構化程式設計結構化程式設計
結構化程式設計David Tang
 
Dry machining and near dry machining, Chinese
Dry machining and near dry machining, ChineseDry machining and near dry machining, Chinese
Dry machining and near dry machining, ChineseAaron Dion
 
程式之美-微軟技術面試心得
程式之美-微軟技術面試心得程式之美-微軟技術面試心得
程式之美-微軟技術面試心得Bob Wei
 

La actualidad más candente (16)

QM-040-全面品質管理
QM-040-全面品質管理QM-040-全面品質管理
QM-040-全面品質管理
 
入門啟示錄Ch02簡報
入門啟示錄Ch02簡報入門啟示錄Ch02簡報
入門啟示錄Ch02簡報
 
入門啟示錄Ch05簡報
入門啟示錄Ch05簡報入門啟示錄Ch05簡報
入門啟示錄Ch05簡報
 
IE-019 何謂供應鏈管理
IE-019 何謂供應鏈管理IE-019 何謂供應鏈管理
IE-019 何謂供應鏈管理
 
Cre 020 創意與創新行銷
Cre 020 創意與創新行銷Cre 020 創意與創新行銷
Cre 020 創意與創新行銷
 
第3章 計算機組織 (Update)
第3章 計算機組織 (Update)第3章 計算機組織 (Update)
第3章 計算機組織 (Update)
 
第1章 計算機簡介
第1章 計算機簡介第1章 計算機簡介
第1章 計算機簡介
 
批处理程序教程
批处理程序教程批处理程序教程
批处理程序教程
 
IE-036-豐田生產方式
IE-036-豐田生產方式IE-036-豐田生產方式
IE-036-豐田生產方式
 
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導
透析中低血壓預測模型研究-翔安生醫-胡翔崴博士-蔡瑞煌教授指導
 
Hr 017 社會新鮮人生涯規劃
Hr 017 社會新鮮人生涯規劃Hr 017 社會新鮮人生涯規劃
Hr 017 社會新鮮人生涯規劃
 
認識腸病毒
認識腸病毒認識腸病毒
認識腸病毒
 
結構化程式設計
結構化程式設計結構化程式設計
結構化程式設計
 
Dry machining and near dry machining, Chinese
Dry machining and near dry machining, ChineseDry machining and near dry machining, Chinese
Dry machining and near dry machining, Chinese
 
程式之美-微軟技術面試心得
程式之美-微軟技術面試心得程式之美-微軟技術面試心得
程式之美-微軟技術面試心得
 
Systemdevelopment
SystemdevelopmentSystemdevelopment
Systemdevelopment
 

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 ) . . . . . .
  • 32. tcg_out_qemu_ld-查找TLB III QEMU内存管理 陈志杰 背景知识 x86架构介绍 虚拟存储器 特权级切换 上下文切换 QEMU初始化 注册Machine 物理内存模拟 分配mmu0 PD MMU0映射 运行时模拟 读写内存 切换指令翻译 参考文献 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 ) . . . . . .