显存读写

news/2025/2/5 6:58:56/

        要在显示屏显示图像,方法有两种,mmio pio。现在的显卡都应当支持vbe。

         vbe 提供了保护模式的接口,bios方式太旧了,且保护模式操作太复杂,故想找个简单的方式,但这方面的资料太少,花了不少时间,终于成功。

         利用bios 10号中断取得保护接口信息,除5、7、9号程序,还有几个端口信息,好不容易找到保护模式切换显示模式的使用方法。不过还不确定bios返回端口的具体用途,但显示设置的函数实验成功。

        显存的访问,在低分辨率及字符模式,地址在0xa0000---0xbffff之间,但到了高分辨率就一般在高端内存。网上查的说可以直接访问,我怎么实验都没成功。搞了一个星期,终于可以正确显示。

      要想访问显存,有3步:

     1. 显存的物理地址,英文叫LFB,可以bios 1号中段获取,资料上说可以自主设置,不过我在bochs上没成功,不知哪里出错了,后来没搞了。

      2. MTRR,说起来有点复杂,意思就是把显存地址注册到地址空间。独显、核显、仿真对地址分配有没区别,还待实验。

      3. 显卡设置,开启lfb。好象只能显示真彩色,低色彩的还没成功。

    开启之后,就显存地址就是物理地址了,统一在4G之内,读写也正常,屏幕显示正常,不过bochs显示内存指令不能显示,不知道是bochs的问题,还是本来就这样。关键代码在下面

void BgaSetVideoMode(unsigned int Width, unsigned int Height, unsigned int BitDepth, int UseLinearFrameBuffer, int ClearVideoMemory)
{
    // VBE disabling
    BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
    //
    BgaWriteRegister(VBE_DISPI_INDEX_XRES, Width);
    BgaWriteRegister(VBE_DISPI_INDEX_YRES, Height);
    BgaWriteRegister(VBE_DISPI_INDEX_BPP, BitDepth);
    BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED |
        (UseLinearFrameBuffer ? VBE_DISPI_LFB_ENABLED : 0) |
        (ClearVideoMemory ? 0 : VBE_DISPI_NOCLEARMEM));
}

 

DWORD find_empty_mtrr()
{
    
        //RDMSR将64位由ECX寄存器指定的MSR(model specific register,
        //模式指定寄存器)的内容读出至寄存器EDX:EAX中
        //(在支持intel64架构的处理器中RCX的高32位忽略)。
        //MSR的高32位内容存放在EDX寄存器中,
        //MSR的低32位内容存放在EAX寄存器中
        //(在支持intel64架构的处理器中RDX和RAX的高32位忽略)。
        //如果MSR中没有64位(有些位没有实现),
        //则EDX:EAX中没有实现的位置则未定义。
        //寄存器2个一组
        DWORD empmtrr,port,val1,val2;
        empmtrr=0;
        for (port=0x201;port<0x200+16;port=port+2)
        {
            rdmsr(port,val1,val2);
            if (!(val1&0x0800))
            {
                port--;
                empmtrr=port;
                break;
            }
        }
        return empmtrr;
}
void enableMtrr(DWORD addr)
{

    DWORD mttr,val1,val2;
    mttr = find_empty_mtrr();
    // ; LFB , +8 M , write combine
    //|64 保留    | 物理地址 12|11  8|7 type |0
    //|64 保留    | 掩码|Valid 11|10 保留 |0    
    wrmsr(mttr,addr | 1,0);
    
    wrmsr(mttr+1,0xff800800,0xf); 
//     enable mtrr's
    rdmsr(0x2ff,val1,val2);  
    wrmsr(0x2ff,val1 | 0x800 ,val2);
     
        
}

 


http://www.ppmy.cn/news/602001.html

相关文章

显存(Video Memory)

转自&#xff1a;http://happyseeker.github.io/kernel/2016/03/01/about-Video-Memory.html 闲话 在从事图形优化工作之前&#xff0c;一直对显存(Video Memory)充满了好奇&#xff0c;很想了解其管理方式、基本原理、与内存的区别等&#xff0c;但一直没有时间和机会去研究&…

gddr6速率_美光GDDR6内存可上20Gbps,带宽堪比HBM 2显存

拼 命 加 载 中 ... 下一代显存标准已经确定是GDDR6了&#xff0c;其速率相比目前的GDDR5将翻倍&#xff0c;可达16Gbps&#xff0c;此前各种爆料称NVIDIA的GTX 1180显卡将会率先使用GDDR6显存。从现有情况来看&#xff0c;GDDR6显存最快会在今年下半年开始用于显卡&#xff0c…

学计算机电脑显存多少为好,显卡显存越大越好吗?显存对电脑速度的影响 (全文)...

对于刚接触DIY领域的小白玩家来说&#xff0c;衡量显卡性能的指标就是GPU芯片和其频率&#xff0c;这也确实是显卡性能的决定性因素。但除了GPU&#xff0c;还有一个对显卡性能影响较大的部分&#xff0c;那就是显存。 显卡显存越大越好吗&#xff1f;显存对电脑速度的影响 显存…

怎么看显存大小,型号,频率大全

http://hi.baidu.com/bjmoto123/blog/item/bcac928114c4ae177af480fa.html http://jsjren.com/jisuanjijichuzhishi/html/37.html

DDR、GDDR、QDR的区别

NVIDIA新一代显卡即将出炉&#xff0c;尽管对于个中细节并不了解细节&#xff0c;但业界普遍认为无论是NVIDIA还是AMD&#xff0c;新一代显卡搭载GDDR6显存可能性极高。什么&#xff1f;我的电脑才用上DDR4&#xff0c;怎么显卡就用GDDR6了&#xff1f;而且频率还跑得那么高&am…

内存频率的介绍说明

1、什么是内存频率&#xff1f; 所谓的内存频率就是指内存条的主频率&#xff0c;内存主频代表着该内存所能达到的最高工作频率&#xff0c;内存主频是以MHz&#xff08;兆赫&#xff09;为单位来计量的。 内存主频率越高&#xff0c;在一定程度上代表着内存所能达到的速度越…

学生使用的台灯该怎么选择?学生台灯应该这样选

随着时代快速发展&#xff0c;目前我国近视人数达到了7亿&#xff0c;呈现低龄化趋势&#xff0c;儿童及青少年人数占了53.8%。而且现在的学生学业负担都很重&#xff0c;每个家长都不希望自己的孩子近视或加深近视了&#xff0c;都会想尽一切办法保护视力。而护眼台灯就成了家…

ppt文件全部删除怎么恢复?别急,这些方法能挽救

PPT文件全部删除怎么恢复&#xff1f;如果您不小心将PPT文件删除&#xff0c;不要担心&#xff0c;您可能还有机会将其恢复。在下面的文章中&#xff0c;我们将介绍一些技巧来恢复已删除的PPT文件。 第一部分&#xff1a;关于PPT文件 PPT文件是指Microsoft PowerPoint软件创建…