zoukankan      html  css  js  c++  java
  • 处理器虚拟化——基本数据结构

     在系统平台里两个重要的数据结构:
     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
  • 相关阅读:
    http请求需要了解的一些信息
    mac修改终端配色方案
    SpringBoot之使用Redisson实现分布式锁
    https://coding.m.imooc.com/classindex.html?cid=402
    构建微电影
    一个开源的后台管理项目
    mysql
    redis安装
    maven 安装
    Django2.1集成xadmin管理后台所遇到的错误集锦,解决填坑
  • 原文地址:https://www.cnblogs.com/yifi/p/6579796.html
Copyright © 2011-2022 走看看