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"}
....
后面使保留位。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容