VirtualBox探究VESA SVGA 2

type.h

typedef unsigned int    uint32;
typedef unsigned short  uint16;
typedef unsigned char   uint8;

打印以下看看和我们预期是否一致!

sprintf(buf, "uint8[%d], uint16[%d], uint32[%d], long[%d], char*[%d]", sizeof(uint8), sizeof(uint16), sizeof(uint32), sizeof(long), sizeof(char *));
print_str_fix_pos((80*(startLine + 3)+0)*2, buf);
验证大小

参考

VBEInfo:https://www.cnblogs.com/zyl910/archive/2006/11/14/2186633.html
char far:https://zhidao.baidu.com/question/550069401.html

// vbe info:VGA图形系统相关参数
typedef struct vbe_info {       
    char          VBESignature[4];            // 字符串"VESA"          
    uint16        VBEVersion;                 // VBE版本号,BCD码
    char /*far*/  *OEMStringPtr;              // 指向OEM厂商的标志串的指针        
    uint32        Capabilities;               // 显示卡特性  
    uint16/*far*/ *VideoModePtr;              // 指向所支持显示模式列表的指针
    uint16        VRAMMemory;                 // 显示内存大小,单位为64KB      
    // 以下为VESA VBE 2.0版本以上定义
    uint16        OemSoftwareRev;             // VBE软件的OEM修订版本号,BCD码
    char /*far*/  *OemVendorNamePtr;          // 指向显示卡制造厂商的字符串指针
    char /*far*/  *OemProductNamePtr;         // 指向显示卡制造商的字符串的指针
    char /*far*/  *OemProductRevPtr;          // 指向显示卡修订版本号或唱片等级的字符串的指针
    uint8          reserved[222];             // 保留
    uint8          OEMData[256];              // VESA2.0版以上定义
} __attribute__((packed)) VBEINFO;

打印版本号和内存大小

    // 打印VbeVersion
    sprintf(buf, "VbeVersion       : 0x%4.4X", vbeInfo->VBEVersion);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);
    // 打印VRamMemory
    sprintf(buf, "TotalMemory      : 0x%4.4X (%ldKB)", vbeInfo->VRAMMemory, vbeInfo->VRAMMemory * (uint32)64);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);

版本号和显存大小

VBEVersion:VBE版本号,以BCD码表示。高字节为主版本号,低字节为副版本号。例如:VBE 2.0的VESA VESA Version为0200h,VBE1.2的VESA Version为0102h。注意,0102h表示V1.2版本,而不是V1.02版。
显存大小:16384/1024 = 16 MB。
虚拟机设置的显存大小就是16 MB

char far* 地址转换

物理地址 = 段地址*10H + 偏移地址

uint32 getAddrFromCharfar(uint32 far){
    return (far >> 16)/*高16位*/*0x10 + (far & 0xFFFF)/*低16位*/;
}

打印OEM厂商的标值串的指针

    // 打印OEMStringPtr
    sprintf(buf, "OEMStringPtr     : %s", (char*)getAddrFromCharfar((uint32)(vbeInfo->OEMStringPtr)));
    print_str_fix_pos((80*(startLine++)+0)*2, buf);

注意:不能直接打印far指针,要转换为真实的地址。

打印OEM厂商的标志串

OEMStringPtr:以NULL结尾的指向OEM厂商的标志串的实模式指针。字符串表明显示卡上的显存芯片的制造厂商,没有固定的格式,可用来标志IEM对特定硬件所支持的特性。该指针可能指向ROM,也可能指向RAM。该指针的长度也没有限制,但VESA组织推荐在256字节以内。字符串以NULL结尾。

打印显示卡特性

    // 打印显示卡特性
    sprintf(buf, "Capabilities     : 0x%8.8lX", vbeInfo->Capabilities);
    print_str_fix_pos((80*(startLine++)+0)*2, buf);
打印显示卡特性

Capabilities:显示卡能力特性。各位定义如下:
D0 = 0:DAC为固定宽度,每种颜色各占6位宽度;
1:DAC宽度可切换到每种颜色各占8位。
注:当DAC宽度可切换时,设置一个VESA显示模式后DAC宽度将还原为每种颜色6位。用VBE功能08h的子功能BL=0H可将DAC宽度切换为每种颜色占8位。
D1 = 0:显示卡兼容VGA;
= 1:显示卡不兼容VGA。
注:显示卡是否兼容VGA表明是否支持VGA模式、字体和I/O端口,但不能保证支持所有的VGA兼容模式、不能保证支持8x14点阵的字库。
D2 = 0:普通的RAMDAC操作
= 1:当对大块RAMDAC操作时,在VBE功能09h中使用BL=80H位屏蔽,使操作在CRT显示器垂直回扫期间按进行。
const DETAIL_BIT detailCapabilities[] ={
{0, "DAC is fixed width, with 6 bits per primary color", "DAC width is switchable to 8 bits per primary color"},
{1, "Controller is VGA compatible", "Controller is not VGA compatible"},
{2, "Normal RAMDAC operation", "When programming large blocks of information to the RAMDAC, use the blank bit in Function 09h."},
{3, "No hardware stereoscopic signaling support", "Hardware stereoscopic signaling supported by controller"},
{4, "Stereo signaling supported via external VESA stereo connector", "Stereo signaling supported via VESA EVC connector"}
....
后面使保留位。

你可能感兴趣的:(VirtualBox探究VESA SVGA 2)