处理器虚拟化——基本数据结构

 在系统平台里两个重要的数据结构:
 PCB   每个逻辑处理器对应一个PCB结构     Processor  Control  Block  处理器控制块
 struc PCB
        ;;
        ;; 系统管理区域基址, gs:[0] 取得 PCB 管理区基址,这个基址是 virtual address
        ;; 而 PhysicalBase 记录着物理地址!
        ;;
        .Base                   RESQ            1               ; 保存 PCB 基址
        .PhysicalBase           RESQ            1               ; PCB 物理基址
        .Size                   RESD            1               ; PCB size
        .SdaBase                RESQ            1               ; 指向系统数据区域
        .SdaPhysicalBase        RESQ            1               ; SDA 物理地址
        .SrtBase                RESQ            1               ; 指向系统服务例程表区域
        .SrtPhysicalBase        RESQ            1               ; SRT 物理地址
        .LsbBase                RESQ            1               ; 指向本地存储块       Local Base Block 本地存储块
        .LsbPhysicalBase        RESQ            1               ; LSB 物理地址
        .ReturnStackPointer     RESQ            1               ; 指向 ReturnStack

        ;;
        ;; 处理器内存 domain 范围 
        ;;        
        .Domain                 RESQ            1               ; 内存 domain
        .DomainTop              RESQ            1               ; domain 顶部

        ;;
        ;; 当前与上一个优先级,用于管理中断
        ;;
        .CurrentTpl             RESD            1
        .PrevTpl                RESD            1


        ALIGNB 4
        ;;
        ;; IPI 中断执行的 routine 入口
        ;;
        .IpiRoutinePointer      RESQ            1
        .IpiRoutineParameter    RESQ            1
        .IpiRoutineBottomHalf   RESQ            1

        ;;
        ;; idle loop routine 入口
        ;;
        .IdleLoopRoutine        RESQ            1



        ;;
        ;; 记录最后一次 status code
        ;;
        .LastStatusCode         RESD            1

        ;;
        ;; 记录处理器发生的 exception 位图
        ;; 1) 异常发生后 ExceptionBitMask 相应位置位
        ;;
        .ExceptionBitMask       RESD            1


        ;;
        ;; 记录 VMX 的 VMXON pointer
        ;;
        .VmxonPointer           RESQ            1
        .VmxonPhysicalPointer   RESQ            1

        ;;
        ;; 记录当前 VMCS region pointer
        ;;
        .VmcsPointer            RESQ            1
        .VmcsPhysicalPointer    RESQ            1
        
        ;;
        ;; 记录 4 个 VMCS 管理指针,指向 VMCS_MANAGE_BLOCK
        ;;
        .VmcsA                  RESQ            1
        .VmcsB                  RESQ            1
        .VmcsC                  RESQ            1
        .VmcsD                  RESQ            1
        .CurrentVmbPointer      RESQ            1

        ;;
        ;; guest 队列管理记录
        ;;
        .GuestRunningQueue      RESQ            1
        .GuestReadyQueue        RESQ            1
        .GuestRunningIndex      RESD            1
        .GuestRunningStatus     RESD            1
        .GuestReadyIndex        RESD            1
        .GuestReadyStatus       RESD            1

        ALIGNB 8
        ;;
        ;; 每个 logical processor 支持 4 个 VMCS_MANAGE_BLOCK 结构
        ;;
        .GuestA                 RESB            VMCS_MANAGE_BLOCK_SIZE
        .GuestB                 RESB            VMCS_MANAGE_BLOCK_SIZE
        .GuestC                 RESB            VMCS_MANAGE_BLOCK_SIZE
        .GuestD                 RESB            VMCS_MANAGE_BLOCK_SIZE

        ALIGNB 8
        ;;
        ;; VMM 管理记录
        ;;
        .VmmStack               RESQ            1
        .VmmMsrLoadAddress      RESQ            1
        .VmmMsrLoadPhyAddress   RESQ            1


        ;;
        ;; Guest flag 值,记录是否处于 Guest
        ;;
        .EptEnableFlag          RESB            1
        
        ;;
        ;; ##### 下面是 VMCS buffer #######
        ;;
        .GuestStateBuf          RESB            GUEST_STATE_SIZE        
        .HostStateBuf           RESB            HOST_STATE_SIZE 
        .ExecutionControlBuf    RESB            EXECUTION_CONTROL_SIZE
        .ExitControlBuf         RESB            EXIT_CONTROL_SIZE
        .EntryControlBuf        RESB            ENTRY_CONTROL_SIZE
        .ExitInfoBuf            RESB            EXIT_INFO_SIZE

        ;;
        ;; #### 下面是 VM-exit 信息 buffer #####
        ;;
        .GuestExitInfo          RESB            100h
        

        ALIGNB 8
        .InvDesc                RESB            INV_DESC_SIZE


        ;;
        ;; GDT 表 selector
        ;;
        ;; GS 用于管理 PCB 区域,FS 用于管理 SDA 区域
        ;;
        .GsSelector             RESW            1
        .TssSelector            RESW            1
        .LdtSelector            RESW            1

      
        ALIGNB 4

        ;;
        ;; Task Status Segment 管理数据
        ;;
        .TssBase                RESQ            1               ; 记录 TSS 块的基址
        .TssPhysicalBase        RESQ            1               ; 记录 TSS 块物理地址
        .TssLimit               RESD            1               ; Tss limit
        .IomapBase              RESQ            1               ; 记录 IOMAP 块地址
        .IomapPhysicalBase      RESQ            1               ; 记录 IOMAP 块物理地址

        ;;
        ;; Local Descriptor Table 管理数据
        ;;
        .LdtBase                RESQ            1               ; 记录 LDT 表基址
        .LdtLimit               RESD            1               ; Ldt 表 limit
        .LdtTop                 RESQ            1               ; 记录 LDT 表的顶上地址
        .CurrentLdtBase         RESQ            1               ; 记录当前的 LDT 表地址        



        ;;
        ;; stack pointer 记录
        ;;
        .KernelStack            RESQ            1               ; kernel 代码使用
        .UserStack              RESQ            1               ; user 代码使用
        .SystemServiceStack     RESQ            1               ; 中断服务例程使用
        .FastSystemServiceStack RESQ            1               ; 快速调用服务例程使用



        ;;
        ;; context 区域指针
        ;;
        .ContextBase            RESQ            1
        .XMMStateImageBase      RESQ            1


        ;;
        ;; memory type 管理
        ;;
        .MemTypeRecordMaximum   RESD            1               ; 记录内存类型管理记录最大项
        .MemTypeRecordTop       RESD            1               ; 记录内存类型管理记录顶
        .MemTypeRecord          RESB            (MTMR_SIZE * 10)


        ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        ;$                                                     $
        ;$                  下面是处理器信息块                  $       
        ;$                                                     $
        ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

        .Vendor                 RESD            1               ; 处理器的厂商

        ;;
        ;; 记录处理器的频率,单位 MHz。即:每次/us(每us内ticks次数)!
        ;; 1) ProcessorFrequency: 处理器显示出来的频率
        ;; 2) TicksFrequency: 测量出来的处理器频率
        ;; 注意:
        ;; 1) ProcessorFrequency 与 TicksFrequency 有些偏差,基于乘除运算下,会产生误差
        ;; 2) ProcessorFrequency 稍微比 TicksFrequency 大
        ;; 2.1) 在一台 2.4GHz 处理器上,ProcessorFrequency 的值为 2400
        ;; 2.2) 那么 TicksFrequency 的值大约为 2394
        ;;

        .ProcessorFrequency     RESD            1               ; 处理器 core 频率,
        .TicksFrequency         RESD            1               ; 这时测量出来的 ticks 频率数

        .LapicTimerFrequency    RESD            1               ; local timer 的计数频率,单位为 us


        ;;
        ;; 处理器最大 CPUID leaf 号
        ;;
        .MaxBasicLeaf           RESD            1               ; 最大基本叶号
        .MaxExtendedLeaf        RESD            1               ; 最大扩展叶号

        ;;
        ;; 处理器基本信息
        ;;
        .CacheLineSize          RESD            1               ; cache line(字节单位)

        ;;
        ;; 处理器型号信息
        ;;
        .DisplayModel           RESB            1               ; 型号
        .DisplayFamily          RESB            1               ; 家族号
        
        ALIGNB 4

        ;;
        ;; CPUID.01H leaf
        ;;
        .CpuidLeaf01Eax         RESD            1
        .CpuidLeaf01Ebx         RESD            1
        .CpuidLeaf01Ecx         RESD            1
        .CpuidLeaf01Edx         RESD            1

        ;;
        ;; CPUID.02H leaf
        ;;
        .CpuidLeaf02Eax         RESD            1
        .CpuidLeaf02Ebx         RESD            1
        .CpuidLeaf02Ecx         RESD            1
        .CpuidLeaf02Edx         RESD            1

        ;;
        ;; CPUID.03H leaf
        ;;
        .CpuidLeaf03Eax         RESD            1
        .CpuidLeaf03Ebx         RESD            1
        .CpuidLeaf03Ecx         RESD            1
        .CpuidLeaf03Edx         RESD            1

        ;;
        ;; CPUID.04H leaf
        ;;
        .CpuidLeaf04Eax         RESD            1
        .CpuidLeaf04Ebx         RESD            1
        .CpuidLeaf04Ecx         RESD            1
        .CpuidLeaf04Edx         RESD            1

        ;;
        ;; CPUID.05H leaf
        ;;
        .CpuidLeaf05Eax         RESD            1
        .CpuidLeaf05Ebx         RESD            1
        .CpuidLeaf05Ecx         RESD            1
        .CpuidLeaf05Edx         RESD            1

        ;;
        ;; CPUID.06H leaf
        ;;
        .CpuidLeaf06Eax         RESD            1
        .CpuidLeaf06Ebx         RESD            1
        .CpuidLeaf06Ecx         RESD            1
        .CpuidLeaf06Edx         RESD            1

        ;;
        ;; CPUID.07H leaf
        ;;
        .CpuidLeaf07Eax         RESD            1
        .CpuidLeaf07Ebx         RESD            1
        .CpuidLeaf07Ecx         RESD            1
        .CpuidLeaf07Edx         RESD            1

        ;;
        ;; CPUID.08H leaf
        ;;
        .CpuidLeaf08Eax         RESD            1
        .CpuidLeaf08Ebx         RESD            1
        .CpuidLeaf08Ecx         RESD            1
        .CpuidLeaf08Edx         RESD            1

        ;;
        ;; CPUID.09H leaf
        ;;
        .CpuidLeaf09Eax         RESD            1
        .CpuidLeaf09Ebx         RESD            1
        .CpuidLeaf09Ecx         RESD            1
        .CpuidLeaf09Edx         RESD            1

        ;;
        ;; CPUID.0AH leaf
        ;;
        .CpuidLeaf0AEax         RESD            1
        .CpuidLeaf0AEbx         RESD            1
        .CpuidLeaf0AEcx         RESD            1
        .CpuidLeaf0AEdx         RESD            1

        ;;
        ;; CPUID.0BH leaf
        ;;
        .CpuidLeaf0BEax         RESD            1
        .CpuidLeaf0BEbx         RESD            1
        .CpuidLeaf0BEcx         RESD            1
        .CpuidLeaf0BEdx         RESD            1

%define PCB.FeatureEcx                  PCB.CpuidLeaf01Ecx
%define PCB.FeatureEdx                  PCB.CpuidLeaf01Edx
%define PCB.FeatureAddition             PCB.CpuidLeaf07Ebx


        ;;
        ;; 基本扩展信息
        ;;
        .ExtendedFeatureEcx     RESD            1               ; CPUID.80000001H:ECX
        .ExtendedFeatureEdx     RESD            1               ; CPUID.80000001H:EDX

        .MaxPhysicalAddr        RESD            1               ; 最大的物理地址宽度
        .MaxVirtualAddr         RESD            1               ; 最大的虚拟地址宽度

        ;;
        ;; SSE 指令支持 level, 分别为:
        ;; 1) 0000h - 不支持
        ;; 2) 0100h - SSE
        ;; 3) 0200h - SSE2
        ;; 4) 0300h - SSE3,     0301h - SSSE3
        ;; 5) 0401h - SSE4.1,   0402h - SSE4.2
        ;;
        .SSELevel               RESD            1               ; 指示支持哪个级别的 SSE 指令



        ;;
        ;; MAXPHYADDR = 32 时:select mask = 00000000_FFFFFFFFh
        ;; MAXPHYADDR = 36 时: select mask = 0000000F_FFFFFFFFh
        ;; MAXPHYADDR = 40 时: select mask = 000000FF_FFFFFFFFh
        ;; MAXPHYADDR = 52 时:select mask = 000FFFFF_FFFFFFFFh
        ;;
        .MaxPhyAddrSelectMask   RESQ            1               ; 最大物理地址的 mask 位



        ;;
        ;; 处理器 ID,APIC 以及多线程相关信息
        ;;
        .LapicVersion           RESD            1               ; local APIC 版本
        .InitialApicId          RESD            1               ; 处理器初始 ID
        .ApicId                 RESD            1               ; 处理器 ID
        .LogicalId              RESD            1               ; 处理器逻辑 ID
        .MaxLogicalProcessor    RESD            1               ; package 内最大逻辑处理器数
        .MaxProcessorCore       RESD            1               ; package 内最大 core 数
        .ProcessorIndex         RESD            1               ; 处理器编号 #0,#1 ...
        .LapicBase              RESQ            1               ; local APIC 虚拟映射基址
        .LapicPhysicalBase      RESQ            1               ; local APIC 物理基址
        .IapicBase              RESQ            1               ; IO APIC 虚拟映射基址
        .IapicPhysicalBase      RESQ            1               ; IO APIC 物理基址


        ;;
        ;; 处理器的 package,core 以及 smt ID
        ;;
        .ProcessorTopology      RESB            TOPOLOGY_INFO_SIZE
        .LogicalProcessorCount  RESD            1               ; 处理器内总共有多少个 local processor
        .ProcessorCoreCount     RESD            1               ; 处理器内总共有多少个 processor core

        ;;
        ;;
        ;; 处理器 cache 信息,定义 4 个 cache 信息结构
        ;;      1) L1D(level-1 data):           level-1 数据 cache
        ;;      2) L1I(level-1 Instruction):    level-1 指令 cache
        ;;      3) L2(level-2 unified):         level-2 统一的 cache
        ;;      4) L3(level-3 unified):         level-3 统一的 cache
        ;;
        .CacheLevel             RESD            1               ; cache 层数

        .L1D                    RESB            CACHE_INFO_SIZE ; level-1 data cache 信息
        .L1I                    RESB            CACHE_INFO_SIZE ; level-1 instruction cache 信息
        .MLC:                                                   ; MLC(Middle Level Cache)
        .L2                     RESB            CACHE_INFO_SIZE ; level-2 cache 信息
        .LLC:                                                   ; LLC(Last Level Cache)
        .L3                     RESB            CACHE_INFO_SIZE ; level-3 cache 信息


        ;;
        ;; 标志位
        ;;
        .IsMultiThreading       RESB            1               ; 处理器是否支持多线程
        .IsBsp                  RESB            1               ; 是否为 BSP 处理器
        .IsLapicEnable          RESB            1               ; 记录 Local APIC 是否开启
        .IsLx2ApicEnable        RESB            1               ; 是否为 x2APIC 模块
        .IsIapicEnable          RESB            1               ; 记录 IO APIC 是否开启


        ;;
        ;; 下面记录着处理器功能的开启位
        ;; [0] - PE 位
        ;; [1] - PG 位
        ;; [2] - PAE 位
        ;;
        ALIGNB 4
        .ProcessorStatus        RESQ            1
        
        ;;
        ;; 下面记录着处理器指令可用位
        ;;
        .InstructionStatus      RESQ            1

        ;;
        ;; 处理器当前的活动状态
        ;;
        .ActivityState          RESD            1

        ;;
        ;; 维护处理器 debug 功能
        ;;
        .DebugCapabilities      RESQ            1               ; 记录处理器的 debug 功能
        .DebugStatus            RESQ            1               ; 记录处理器的 debug 开启项

        ;;
        ;; 维护处理器的 performance 功能
        ;;
        .PerfCapabilities       RESQ            1               ; 记录处理器的 performance 功能
        .PerfStatus             RESQ            1               ; 记录处理器的 performance 开启项

        ;;
        ;; VMX capability information 记录
        ;;
        .VmxGlobalData:
        .VmxBasic               RESQ            1
        .PinBasedCtls           RESQ            1
        .ProcessorBasedCtls     RESQ            1
        .ExitCtls               RESQ            1
        .EntryCtls              RESQ            1
        .VmxMisc:
        .Misc                   RESQ            1
        .Cr0Fixed0              RESQ            1
        .Cr0Fixed1              RESQ            1
        .Cr4Fixed0              RESQ            1
        .Cr4Fixed1              RESQ            1
        .VmcsEnum               RESQ            1
        .ProcessorBasedCtls2    RESQ            1
        .EptVpidCap             RESQ            1       
        .VmFunction             RESQ            1

        ;;
        ;; CR0 & CR4 fixed 1 mask(固定为 1 值)
        ;;
        .Cr0FixedMask           RESQ            1
        .Cr4FixedMask           RESQ            1
        .VmcsMemoryType         RESD            1
        .EptMemoryType          RESD            1

        ;;
        ;; 如果 bit55 of IA32_VMX_BASIC 为 1 时, TrueFlag = 1
        ;;
        .TrueFlag               RESB            1


        ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        ;$                                              $
        ;$ 下面是处理器 context 信息与 State Image       $       
        ;$                                              $
        ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

        ALIGNB 8
        .Context:


        .Eax:
        .Rax                    RESQ            1
        .Ecx:
        .Rcx                    RESQ            1
        .Edx:
        .Rdx                    RESQ            1
        .Ebx:
        .Rbx                    RESQ            1
        .Esp:
        .Rsp                    RESQ            1
        .Ebp:
        .Rbp                    RESQ            1
        .Esi:
        .Rsi                    RESQ            1
        .Edi:
        .Rdi                    RESQ            1

        .R8                     RESQ            1
        .R9                     RESQ            1
        .R10                    RESQ            1
        .R11                    RESQ            1
        .R12                    RESQ            1
        .R13                    RESQ            1
        .R14                    RESQ            1
        .R15                    RESQ            1

        .Eip:
        .Rip                    RESQ            1
        .ErrorCode              RESD            1


        .Dr0                    RESQ            1
        .Dr1                    RESQ            1
        .Dr2                    RESQ            1
        .Dr3                    RESQ            1
        .Dr6                    RESQ            1
        .Dr7                    RESQ            1
        .Es                     RESD            1
        .Cs                     RESD            1
        .Ss                     RESD            1
        .Ds                     RESD            1
        .Fs                     RESD            1
        .Gs                     RESQ            1
        .Cr3                    RESQ            1
        .Cr2                    RESQ            1
        .Cr4                    RESQ            1


        ALIGNB 8
        .ReturnStack:

%ifdef __X64
        .Rflags                 RESQ            1        
        .RetRip                 RESQ            1
        .RetCs                  RESQ            1
        .RetRsp                 RESQ            1
        .RetSs                  RESQ            1
%else
        .Eflags                 RESD            1
        .RetEip                 RESD            1
        .RetCs                  RESD            1
        .RetEsp                 RESD            1
        .RetSs                  RESD            1
%endif




        ;;
        ;; FPU 单元的 32 位的 state image 区域(共 108 字节)
        ;; *** 1) 头 28 个字节为 FPU environment 信息(使用于 FSTENV/FNSTENV 指令)
        ;; *** 2) 后 80 个字节为 FPU/MMX 的 stack 寄存器 image 信息(使用于 FSAVE/FNSAVE 指令)
        ;;

        ALIGNB 16
        .FpuStateImage:
        .FpuEnvironmentImage:   RESB            28
        .FpuStackImage:         RESB            80



        ;;
        ;; XMM image 区域,使用于 FXSAVE/FXRSTOR 指令(512字节)
        ;;

        ALIGNB 16
        .XMMStateImage:         RESB            512



        ;;
        ;; 下面是处理器的 DS(Debug Store)管理指针
        ;; 1) 指向 DS 管理区记录
        ;;
        ALIGNB 4
        .BtsBasePointer         RESQ            1               ; Bts buffer base 指针
        .BtsIndexPointer        RESQ            1               ; Bts buffer index 指针
        .BtsMaximumPointer      RESQ            1               ; Bts maximum 指针
        .BtsThresholdPointer    RESQ            1               ; Bts threshold 指针
        .PebsBasePointer        RESQ            1               ; Pebs buffer base 指针
        .PebsIndexPointer       RESQ            1               ; Pebs index 指针
        .PebsMaximumPointer     RESQ            1               ; Pebs maximum 指针
        .PebsThresholdPointer   RESQ            1               ; Pebs threshold 指针
        .Counter0Pointer        RESQ            1               ; Counter0 指针
        .Counter1Pointer        RESQ            1               ; Counter1 指针
        .Counter2Pointer        RESQ            1               ; Counter2 指针
        .Counter3Pointer        RESQ            1               ; Counter3 指针
        
        ;;
        ;; DS 管理记录
        ;;
        .BtsRecordSize          RESD            1               ; Bts 记录长度
        .PebsRecordSize         RESD            1               ; PEBS 记录长度
        .PebsBufferIndex        RESQ            1               ; 记录着 PEBS 上一个 index 值

        ;;
        ;; 下面是 DS 管理区记录
        ;;
        ALIGNB 16
        .DSManageRecord         RESB            DSMR64_SIZE



        ;;                
        ;; 每个 PCB 块为 8K
        ;;
        RESB            (4096 * 2 - $)
                                

               
        PROCESSOR_CONTROL_BLOCK_SIZE    EQU     $
endstruc



;;
;; LSB(Local Storage Block,本地存储块),每个处理器拥有自己的 LSB 区域。
;; 每个 LSB 结构为 8K,保存处理器的 local video buffer, local keyboard buffer 等
;;

struc LSB
        .Base                   RESQ            1
        .PhysicalBase           RESQ            1

        ;;
        ;; local video buffer 管理记录   Video缓冲区
        ;;
        .LocalVideoBufferHead   RESQ            1
        .LocalVideoBufferPtr    RESQ            1
        .LocalVideoBufferLastChar       RESD    1
        .LocalVideoBufferSize   RESD            1
        
        ;;
        ;; local keyboard buffer 管理记录  键盘输入缓冲区
        ;;        
        ALIGNB 8
        .LocalKeyBufferHead     RESQ            1
        .LocalKeyBufferPtr      RESQ            1
        .LocalKeyBufferSize     RESD            1
        

        ;;
        ;; local timer 管理记录
        ;;
        .LapicTimerRequestMask  RESD            1
        .LapicTimerRoutine      RESQ            1
        .LapicTimerCount        RESD            1

        ;;
        ;; 时间计数值
        ;;
        .Hour                   RESD            1
        .Minute                 RESD            1
        .Second                 RESD            1

        ;;
        ;; 本地 keyboard buffer 区域,共 256 个字节,保存按键扫描码
        ;;
        .LocalKeyBuffer         RESB            256
     
        .Reserved               RESB            4096 - $

        ;;
        ;; 本地 video buffer 区域,存放处理器的屏幕信息
        ;; 4K,存放约 25 * 80 * 2 信息
        ;;
        .LocalVideoBuffer       RESB            (4096 * 2 - $)

        

        LOCAL_STORAGE_BLOCK_SIZE        EQU     $
        LSB_SIZE                        EQU     $        
endstruc

SDA     系统数据区域 (System  Data   Area) SDA只有唯一的一份  由所有逻辑处理器共享

注意 :GDT区域位于SDA区域偏移量为1000H位置上,共4KB大小  全局描述符表(Global Descriptor Table):
       IDT位于SDA区域偏移量为2000H位置上 共4KB大小       中断描述符表(Interrupt Descriptor Tabel):
       TSS区域位于SDA区域偏移量为3000H位置上,共4KB大小  任务状态段(Task State Segment):
       Iomap区域位于在SDA区域偏移量为4000H位置上,共8KB大小
       LDT位于SDA区域偏移量为6000H的位置上,共4KB大小     局部描述符表(Local Descriptor Table):
;;************************************************************
;;* 定义 System Data AREA 结构,用于维护系统管理,使用于 fs 段 
;;*
;;* 说明:
;;* 1) 这是系统运行所需要的数据结构,所有处理器共享
;;************************************************************

struc SDA
        ;;
        ;; 系统数据区域,提供所有处理器共用使用的数据
        ;;
        .Base                   RESQ            1               ; 此区域的地址(virtual address)
        .PhysicalBase           RESQ            1               ; 此区域的物理地址
        .Size                   RESD            1               ; 此区域的 size
        .PcbBase                RESQ            1               ; 指向 CPU0 的 PCB 块
        .PcbPhysicalBase        RESQ            1               ; 指向 CPU0 的 PCB 块

        ;;
        ;; 系统可用物理内存
        ;;
        .MemorySize             RESD            1               ; 以 KB 为单位
        .BootDriver             RESD            1               ; boot 的驱动器


        .ProcessorCount         RESD            1               ; 处理器计数
        .ApLockPointer          RESD            1               ; Ap 处理器执行锁指针
        .ApLongmode             RESD            1               ; AP 处理器是否进入 long mode
        .ApStartupRoutineEntry  RESD            1               ; AP 处理器的 Startup routine 入口地址
        .ApInitDoneCount        RESD            1               ; AP 处理器初始化完成计数
        
        ;;
        ;; AP 执行锁
        ;;
        .Stage1LockPointer      RESD            1               ; stage1 锁
        .Stage2LockPointer      RESD            1               ; stage2 锁
        .Stage3LockPointer      RESD            1               ; stage3 锁

        ;;
        ;; 信号
        ;;
        .Signal                 RESD            1               ; 内部使用的信号
        .SignalPointer          RESQ            1               ; 引用外部提供的信号

        ;;
        ;; NMI handler 使用的功能号,缺省为 0 值,由硬件触发
        ;;
        .NmiIpiRequestMask      RESD            1
        .NmiIpiRoutine          RESQ            1
        
        ;;
        ;; 记录拥有焦点的 processor index 值
        ;;
        .InFocus                RESD            1


        ;;
        ;; 记录当前 video buffer 位置
        ;;
        .VideoBufferHead        RESQ            1
        .VideoBufferPtr         RESQ            1
        .VideoBufferLastChar    RESD            1

        ;;
        ;; keyboard buffer 管理记录
        ;;
        .KeyBufferHead          RESQ            1               ; 保存 LSB.LocalKeyBufferHead 值
        .KeyBufferPtrPointer    RESQ            1               ; 指向 local KeyBufferPtr
        .KeyBufferLength        RESD            1               ; 键盘缓冲区长度


        ;;
        ;;Decode Manage block 与 GPA map list
        ;;
        .DmbBase                RESQ            1               ; 记录 DMB 地址        
        .GmlBase                RESQ            1               ; 记录 GPA 映射列表地址


        ALIGNB 4
        ;;
        ;; system timer counter,记录中断次数
        ;;        
        .TimerCount             RESD            1

        ;;
        ;; 记录最后一次出错的错误码
        ;;
        .LastStatusCode          RESD            1             


        ;;
        ;; 记录处理器空闲的 index mask 标志位(指示 BSP 空闲或忙状态)
        ;;
        .UsableProcessorMask    RESD            1
        .ProcessMask            RESQ            1


        ;;
        ;; 定义虚拟机 domain 管理记录
        ;;
        .DomainPhysicalBase     RESQ            1                       ; domain pool 物理基址
        .DomainBase             RESQ            1                       ; domain pool 虚拟基址

        ;;
        ;; 定义 DEBUG_RECORD_STRUCTURE 管理记录
        ;;
%ifdef DEBUG_RECORD_ENABLE
        .DrsBase                RESQ            1
        .DrsTop                 RESQ            1
        .DrsIndex               RESQ            1

        .DrsHeadPtr             RESQ            1
        .DrsTailPtr             RESQ            1

        .DrsMaxCount            RESD            1
        .DrsCount               RESD            1
%endif

        ;;
        ;; EXTINT_RTE 管理记录
        ;;
        .ExtIntRtePtr           RESQ            1
        .ExtIntRteIndex         RESQ            1
        .ExtIntRteCount         RESD            1


        ;;
        ;; BTS pool 与 PEBS pool 管理记录
        ;; 1) 用来动态分配 BTS 与 PEBS buffer
        ;; 2) 最多支持 16 个 BTS buffer 与 PEBS buffer
        ;; 
        ALIGNB 4
        .BtsPoolBase            RESQ            1               ; 维护 BTS buffer 的分配
        .BtsPoolTop             RESQ            1               ; Bts pool 顶部
        .BtsBufferSize          RESD            1               ; 每个 BTS buffer 的长度
        .BtsRecordMaximum       RESD            1               ; BTS 记录最大数
        .PebsPoolBase           RESQ            1               ; 维护 PEBS buffer 的分配
        .PebsPoolTop            RESQ            1               ; PEBS buffer 顶部
        .PebsBufferSize         RESD            1               ; 每个 PEBS buffer 的长度
        .PebsRecordMaximum      RESD            1               ; PEBS 记录最大数



        ALIGNB 16

        ;;
        ;; paging 管理记录
        ;;
        .XdValue                RESD            1               ; 保存 XD 中的值,这个值需要开启 XD 功能
        .PtBase                 RESD            1               ; PT 表基址
        .PtTop                  RESD            1               ; PT 表顶端
        .PtPhysicalBase         RESD            1               ; PT 表物理基址
        .PdtBase                RESD            1               ; PDT 表基址
        .PdtTop                 RESD            1               ; PDT 表顶端
        .PdtPhysicalBase        RESD            1               ; PDT 表物理基址
        .PptBase                RESD            1               ; PPT 表基址
        .PptTop                 RESD            1               ; PPT 表顶端
        .PptPhysicalBase        RESD            1               ; PPT 表物理基址

        ;;
        ;; 下面是 legacy 模式下的 PPT 表
        ;;
        ALIGNB 32
        .Ppt                    RESQ            4               ; PPT 表项

        ;;
        ;; long-mode 下的 paging 管理记录
        ;;
        .PxtBase64              RESQ            1               ; PXT 基址
        .PptBase64              RESQ            1               ; PPT 表基址(Page Directory Pointer Table)
        .PdtBase64              RESQ            1               ; PDT 表基址
        .PtBase64               RESQ            1               ; PT 表基址
        .PxtTop64               RESQ            1               ; PXT 表顶端
        .PtTop64                RESQ            1               ; PT 表顶端 
        .PdtTop64               RESQ            1               ; PDT 表顶端
        .PptTop64               RESQ            1               ; PPT 表顶端
        .PxtPhysicalBase64      RESQ            1               ; PXT 物理基址
        .PptPhysicalBase64      RESQ            1               ; PPT 表物理基址

        ;;
        ;; 记录 PPT 表区域(2M)是否有效,有效时表明已经映射 PPT 表
        ;;
        .PptValid               RESB            1               ; 


        ALIGNB 4

        ;;
        ;; 下面记录栈空间分配
        ;;
        .UserStackBase                  RESQ    1               ; 用户栈基址
        .UserStackPhysicalBase          RESQ    1
        .KernelStackBase                RESQ    1               ; kernel栈基址
        .KernelStackPhysicalBase        RESQ    1
        
        ;;
        ;; 下面记录 pool空间分配
        ;;
        .UserPoolBase           RESQ            1               ; 用户 pool 基址
        .UserPoolPhysicalBase   RESQ            1
        .KernelPoolBase         RESQ            1               ; Kernel pool 基址
        .KernelPoolPhysicalBase RESQ            1


        ;;
        ;; 下面记录 PCB pool 空间分配
        ;;
        .PcbPoolBase            RESQ            1               ; PCB pool 虚拟基址
        .PcbPoolTop             RESQ            1               ; PCB pool 顶部
        .PcbPoolPhysicalBase    RESQ            1               ; PCB pool 物理基址
        .PcbPoolPhysicalTop     RESQ            1               ; PCB pool 的顶部
        .PcbPoolSize            RESQ            1               ; PCB pool 的大小


        ;;
        ;; long-mode 下 paging 中的 PT pool 管理记录
        ;;
        .PtPoolPhysicalBase     RESQ            1               ; PT POOL 物理基址
        .PtPoolPhysicalTop      RESQ            1               ; PT POOL 顶部
        .PtPoolSize             RESQ            1               ; PT POOL 大小
        .PtPoolBase             RESQ            1               ; PT Pool 区域基址
        .PtPoolFree             RESB            1               ; PT Pool 是否空闲可用


        ALIGNB 4

        ;;
        ;; 备用 PT Pool 管理记录
        ;;
        .PtPool2PhysicalBase    RESQ            1
        .PtPool2PhysicalTop     RESQ            1
        .PtPool2Size            RESQ            1
        .PtPool2Base            RESQ            1
        .PtPool2Free            RESB            1


        ALIGNB 4
        ;;
        ;; TSS Pool,用来为每个处理器分配自己的 TSS 块
        ;; 注意:
        ;; 1) 每个 TSS 分配 size 为:100h 字节
        ;; 2) 共支持 16 个处理器
        ;;
        .TssPoolBase            RESQ            1               ; Tss pool 基址
        .TssPoolPhysicalBase    RESQ            1               ; Tss pool 物理基址
        .TssPoolTop             RESQ            1               ; Tss pool 顶部
        .TssPoolPhysicalTop     RESQ            1               ; Tss pool 物理顶部
        .TssPoolGranularity     RESD            1               ; Tss pool 分配的粒度,默认为 100h 字节


        ;;
        ;; VMX ept(extended page table)管理记录
        ;;
        .EptPxtBase64           RESQ            1               ; PXT 虚拟地址
        .EptPxtPhysicalBase64   RESQ            1               ; PXT 物理地址
        .EptPxtTop64            RESQ            1               ; 
        .EptPxtPhysicalTop64    RESQ            1

        .EptPptBase64           RESQ            1               ; PPT 虚拟地址
        .EptPptPhysicalBase64   RESQ            1               ; PPT 物理地址
        .EptPptTop64            RESQ            1
        .EptPptPhysicalTop64    RESQ            1


        ;;
        ;; GDT selector
        ;;
        .FsSelector             RESW            1
        .KernelCsSelector       RESW            1
        .KernelSsSelector       RESW            1
        .UserCsSelector         RESW            1
        .UserSsSelector         RESW            1
        .User64CsSelector       RESW            1
        .User64SsSelector       RESW            1
        .SysenterCsSelector     RESW            1
        .SyscallCsSelector      RESW            1
        .SysretCsSelector       RESW            1


        ALIGNB 4

        ;;
        ;; Global Descriptor Table 管理记录
        ;;
        .GdtPointer:
        .GdtLimit               RESW            1               ; GDT 表 limit 值
        .GdtBase                RESQ            1               ; GDT 表 base 值

        ALIGNB 4
        .GdtTop                 RESQ            1               ; 记录 GDT 表当前顶上的描述符地址
        
        ;;
        ;; Interrupt Descriptor Table 管理记录
        ;;
        .IdtPointer:
        .IdtLimit               RESW            1               ; IDT 表 limit 值
        .IdtBase                RESQ            1               ; IDT 表 base 值

        ALIGNB 4
        .IdtTop                 RESQ            1               ; IDT 表顶部


                                RESB            (4096 * 1) - $


        ;;
        ;; 定义 Global Descriptor Table 数据区域(共4K)
        ;;
        .Gdt:
        .NullDesc               RESQ            1                   
                                RESB            (4096 * 2) - $


        ;;
        ;; 下面是 IDT 所在区域(共4K)
        ;;
        .Idt:                   RESB            (4096 * 3) - $


        ;;
        ;; 下面是 TSS 区域(共4K)
        ;;
        .Tss:                   RESB            (4096 * 4) - $


        ;;
        ;; 下面是 IOMAP 区域(共8K)
        ;;
        .Iomap:                 RESB            (4096 * 6) - $
        

        ;;
        ;; 下面是 LDT 区域
        .Ldt:                   RESB            (4096 * 7) - $


        ;;
        ;; 下面是 EPT-PXT 表区域
        ;;
        .EptPxt                 RESB            (4096 * 8) - $


        ;;
        ;; 下面是 BTS buffer 区域(共4K)
        ;;
        .BtsBuffer:             RESB            (4096 * 9) - $

        ;;
        ;; 下面是 PEBS buffer 区域(共16*4K)
        ;;
        .PebsBuffer:            RESB            (4096 * (9+16)) - $


%ifdef DEBUG_RECORD_ENABLE
        ;;
        ;; 下面是 DEBUG_RECORD_STRUCTURE 区域(默认为32K)
        ;;
        .DrsBuffer:             RESB            (4096 * (9+16) + DRS_AREA_SIZE) - $
%endif
        
        .DecodeManageBlock:     RESB            (4096 * (9+17) + DRS_AREA_SIZE) - $
        
        .GpaMappedList          RESB            (4096 * (9+18) + DRS_AREA_SIZE) - $
        .ExtIntRteBuffer        RESB            (4096 * (9+19) + DRS_AREA_SIZE) - $

        SYSTEM_DATA_AREA_SIZE   EQU     $
        SDA_SIZE                EQU     $
endstruc

 

posted on 2017-03-19 11:31  yifi  阅读(994)  评论(0编辑  收藏  举报

导航