Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在不使用BIOS的情况下将数据写入图形卡?_C_Assembly_X86_Operating System_Hardware - Fatal编程技术网

C 如何在不使用BIOS的情况下将数据写入图形卡?

C 如何在不使用BIOS的情况下将数据写入图形卡?,c,assembly,x86,operating-system,hardware,C,Assembly,X86,Operating System,Hardware,我想做一个(非常简单的)操作系统。我目前正在学习图形卡 这是我目前所知道的(如果我错了,请纠正我): 图形卡有两种模式:文本模式和图形模式 您可以使用BIOS将数据写入图形卡(而不是直接访问图形卡) 我想做的是不使用BIOS直接写入图形卡的视频内存(因为我想了解事情是如何工作的)。因此,我有以下问题: 我怎么知道图形卡的视频存储器的基址是什么 通过探测PCI总线来获取基址,或者基址是固定的(就像COM端口基址是固定的一样) 所有图形卡的访问方式是否相同,或者我是否必须为所有可用的图形卡创建设

我想做一个(非常简单的)操作系统。我目前正在学习图形卡

这是我目前所知道的(如果我错了,请纠正我):

  • 图形卡有两种模式:文本模式和图形模式
  • 您可以使用BIOS将数据写入图形卡(而不是直接访问图形卡)
我想做的是不使用BIOS直接写入图形卡的视频内存(因为我想了解事情是如何工作的)。因此,我有以下问题:

  • 我怎么知道图形卡的视频存储器的基址是什么 通过探测PCI总线来获取基址,或者基址是固定的(就像COM端口基址是固定的一样)
  • 所有图形卡的访问方式是否相同,或者我是否必须为所有可用的图形卡创建设备驱动程序

  • 编辑:我正在使用x86。

    简介 图形卡是一个非常复杂的话题,我有信心说,它们是PC上最复杂的子系统。
    如果您发现自己丢失了一个(USB 3.0)或旧的网络接口卡的编程,那么请做好准备,因为这要复杂得多

    图形控制器是竞争激烈的市场营销产品,当它这样做时,它会故意提供较差的支持。
    如果您添加硬件本身处理的是:、表面格式、媒体格式,那么您可以看到对视频卡进行编程并非易事

    在我看来,更好的方法是“追溯视频卡的历史”。 从开始,然后移动到然后,最后到

    VGA旧版仍受支持,规格可在英特尔的第一部分或中找到。
    您可以在不使用BIOS的情况下“轻松”对VGA进行编程,这意味着它已经是众所周知且有文档记录的硬件体系结构(但不一定很容易配置)。
    我不记得以前的适配器是否是VGA的子集,如果不是,它们可能不再受支持。
    您可以尝试使用虚拟机或模拟器

    当您对VGA感到满意时,您可以转到。
    麻烦来了:正如维基百科所证实的,VGA是最后一个真正标准化的视频卡/适配器接口:

    与VGA不同,纯IBM定义的标准Super VGA从未正式定义过

    VESA组织对一个BIOS API进行了标准化,该API被称为允许在无人驾驶操作系统上使用SVGA卡,但这不是您想要的。
    您可以尝试对VBE BIOS进行反向工程,但我认为这将是一场噩梦——对IO端口和MMIO的毫无意义的写入流。
    在没有任何引用的情况下理解十分之一的配置寄存器几乎是不可能的

    请注意,到目前为止,我们仍在谈论1998年的技术。
    在VESA VBE的努力之后,没有更多的标准接口被发布-唯一可靠的方法是通过与供应商签署NDA来编程一个不到20年的视频卡

    幸运的是,最近(事实上不再如此),英特尔以其英特尔GFX(a.k.a.Intel HD Graphics)卡进入市场。
    英特尔从未打算制造一流的视频卡,甚至没有密切合作,所以他们可以公开自己的体系结构,因为这不是他们的核心业务。
    结果就是这套精彩的视频卡,描述了他们视频卡的功能。
    用(传统的)最少的信息来编程

    一般来说,爱好者会在这一点之前停止(在SVGA检查点),因为硬件变得非常复杂,工作量也非常巨大。
    例如,我的Haswell集成视频卡记录了17个PDF,每个PDF大约250页(平均)。
    显示部分单独记录在PDF中,帧缓冲区消失,有利于显示表面,仅硬件的显示部分如下:

    虽然这可能不是很容易理解,但它应该足以让程序员在编程现代视频卡之前了解许多技术

    您当然可以看一下Linux源代码,但要注意,Linux内核即使对于简单的控制器,通常也无法立即理解-它不是一个玩具操作系统,它是一个真正的操作系统,具有自己的API和接口,必须适合硬件接口(实际上是另一种方式)。
    此外,只有Intel和AMD视频驱动程序是真正开源的,其他的要么是专有的,要么只是一堆未记录的代码

    常用VGA模式编程概述 如果您只想编程VGA(确实是一项非常体面的任务!),您可以从03h(文本模式)或13h(图形模式)开始

    视频模式03h
    帧缓冲区位于0b8000h(物理地址),通常作为0b800h:0000h访问,因为它便于具有零偏移量。
    屏幕由80x25个字符组成,每个字符在帧缓冲区中占据一个字(16位)。
    低位字节是字符代码-使用的字符映射将a与代码关联(例如,41h与a)。
    高阶字节是属性字节-低半字节是前景色,高半字节是背景色。
    更多信息可以在上面的EGA/CGA/VGA链接中找到

    视频模式13h
    这是一种具有320x200像素的图形模式,帧缓冲区位于0a0000h(物理地址),出于上述相同原因,通常访问为0a000h:0000h。
    每个像素都是一个字节,字节的值选择像素的颜色。
    通过编程DAC寄存器(VGA适配器为3c7h、3c8h、3c9h),可以更改默认调色板

    答案 图形卡有两种模式:文本模式和图形模式

    不一定,托达