我想制作一个(非常简单的)操作系统。我目前正在学习显卡。
这是我目前所知的(如果我错了,请纠正我):
我想要做的是直接写入显卡的视频内存而不使用BIOS(因为我想了解事情是如何工作的)。所以我有以下问题:
编辑: 我使用的是x86。
答案 0 :(得分:20)
图形卡是一个非常复杂的主题,我有信心说它们是您在PC上找到的最复杂子系统。
如果您发现自己丢失了编程XHCI(USB 3.0)或旧的RTL8239A网络接口卡,那么请准备好,因为这要复杂得多。
图形控制器是竞争非常激烈的营销产品 - rarely a vendor opens the specifications,当它发生时,它会给予故意的不良支持。
如果您添加硬件本身处理:codecs,audio (yes, audio streams too),3D programmable pipelines,video signals and video outputs,表面格式,媒体格式,DMA and memory remapping那么您可以看到编写视频卡并非易事。
在我看来,更好的方法是回顾历史"的视频卡。 从MDA开始,然后转到CGA,然后转到EGA,最后转到VGA。
仍然支持VGA版本,可以在here或英特尔this PDF的第一部分找到规格。
您可以在没有BIOS的情况下对VGA进行编程,轻松地#34; - 这意味着它已经是一个众所周知的文档化硬件架构(但不一定容易配置)
我不记得先前的适配器是否是VGA的子集,如果不是,它们可能不再受支持。
您可以尝试使用虚拟机或模拟器。
如果您对VGA感到满意,可以转到SVGA 麻烦来自于维基百科确认,VGA是最后一个真正标准化的视频卡/适配器接口:
与VGA不同 - 纯粹的IBM定义标准 - Super VGA从未正式定义过。
组织VESA对名为Video BIOS Extensions的BIOS API进行了标准化,以允许将SVGA卡用于无人驾驶操作系统,但这并非您所寻求的。
您可以尝试对VBE BIOS进行逆向工程,但我认为这将是一场噩梦 - 对IO端口和MMIO进行无意义的写入流。
在没有任何参考的情况下理解十分之一的配置寄存器几乎是不可能的。
请注意,到目前为止,我们仍在谈论1998年的技术 在VESA VBE工作之后,不再发布标准接口 - 用于编程视频卡的唯一可靠方法是在不到20年的时间内与其供应商签署NDA。
幸运的是,最近(实际上,不再是),英特尔凭借其英特尔GFX(英特尔高清显卡)卡进入市场。
英特尔从未打算制造顶级视频卡,甚至没有密切关注 - 所以他们可以对他们的架构持开放态度,因为这不是他们的核心业务。
结果是这个奇妙的Programming Reference Manuals集描述了他们的视频卡的功能
完成(传统的)最小信息来编程。
一般情况下,业余爱好者会在此之前停止(在SVGA检查站),因为硬件变得非常复杂并且工作量非常大。
例如,我的Haswell集成显卡记录有17张PDF,每张约250页(平均)
显示部分单独记录在PDF中,帧缓冲已经消失,有利于显示表面,硬件的显示部分就是这样:
虽然这可能不是很容易理解,但在编程现代视频卡之前,应该了解程序员必须了解的众多技术。
你肯定可以看一下Linux源代码,但要注意Linux内核通常不会立即理解,即使对于简单的控制器 - 它不是玩具操作系统,它是一个真正的操作系统,有自己的API和接口,必须适合硬件接口(实际上是另一种方式) 此外,只有英特尔和AMD的视频驱动程序才是真正的开源,其他的是专有的或只是一堆无证的代码。
如果您只想编程VGA(确实是一项非常值得尊敬的任务!),您可以从setting the video modes 03h(文本模式)或13h(图形模式)开始。
视频模式03h
帧缓冲区为0b8000h(物理地址),通常以0b800h:0000h的形式访问,因为零点偏移很方便。
屏幕由80x25个字符组成,每个字符占据帧缓冲区中的一个字(16位)
低字节是字符代码 - 使用的字符映射将glyph与代码关联(例如41h与A)。
高位字节是属性字节 - 低半字节是前景色,高半字节是背景色。
更多信息可以在上面的EGA / CGA / VGA链接中找到。
视频模式13h
它是一个320x200像素的图形模式,帧缓冲区为0a0000h(物理地址),通常以0a000h:0000h的形式访问,原因与上述相同。
每个像素都是一个字节,字节的值选择像素的颜色
可以通过编程DAC寄存器(VGA适配器的3c7h,3c8h,3c9h)来更改默认调色板。
显卡有两种模式:文本模式和图形模式。
不一定,今天这种区别可能不再存在了 MDA只有一种文本模式 EGA,CGA和VGA以及SVGA都有。
现代方法是绘制文本,但是在启动期间或特定情况下(例如BSOD),将使用文本模式下的基本视频驱动程序。
此驱动程序可能使用BIOS服务,因为视频驱动程序可能不可用/可靠。
您可以使用BIOS将数据写入显卡
直到SVGA时代,然后停止了BIOS支持。
我如何知道显卡视频内存的基地址是什么,这是通过探测PCI总线获取基地址,还是修复基址来完成的(就像COM端口基地址一样)固定的例子)?
视频卡已通过历史记录连接到ISA,PCI,AGP和PCIe总线 只有ISA总线不可配置(至少不是从头开始),其他的每个功能都有可配置的BAR(基地址寄存器)(PCI总线中最小的可寻址实体)。
为了获得视频卡的MMIO寄存器的基址,必须读取/设置PCI或PCIe总线must be enumerated以及配置空间中的标准寄存器。
处理PCIe并不像处理PCI那么容易。
请注意,即使UART没有固定地址,默认情况下它们也会配置为映射到传统(3f8h,2f8h,3e8h和2e8h)地址,但硬件在({3}}芯片中是(是?)在PCI-to-LPC桥之后,模拟PCI-to-ISA桥 随着英特尔平台集线器架构的出现(即南北桥的死亡),SuperIO芯片最终进入SuperIO或移至PCH之后。
是否所有图形卡都以相同方式访问,或者是否必须为所有可用图形卡创建设备驱动程序?
每张显卡本身就是一个美丽的恶毒生物 每种型号都需要设备驱动程序 一些驱动程序可以重用于整个模型系列,但一般情况下并非如此。