Ste*_*eve 13 c hardware x86 assembly operating-system
我想制作一个(非常简单的)操作系统.我目前正在学习显卡.
这是我目前所知的(如果我错了,请纠正我):
我想要做的是直接写入显卡的视频内存而不使用BIOS(因为我想了解事情是如何工作的).所以我有以下问题:
编辑:我正在使用x86.
Mar*_*oom 23
显卡是一个非常复杂的主题,我有信心说它们是你在PC上找到的最复杂的子系统.
如果您发现自己丢失了编程XHCI(USB 3.0)或旧的RTL8239A网络接口卡,那么请准备好,因为这要复杂得多.
图形控制器是非常有竞争力的营销产品 - 很少有供应商打开规格,当它发生时,它会给出故意的不良支持.
如果您添加硬件本身处理:编解码器,音频(是的,音频流),3D 可编程管道,视频信号和视频输出,表面格式,媒体格式,DMA和内存重新映射,那么您可以看到它不是轻松编写视频卡的任务.
在我看来,更好的方法是"追溯视频卡的历史".从MDA开始然后转到CGA然后转到EGA,最后转到VGA.
仍支持VGA版本,可在此处或英特尔本PDF的第一部分中找到规格.
您可以"轻松"地在没有BIOS的情况下对VGA进行编程 - 这意味着它已经是一个众所周知且有文档记录的硬件架构(但不一定容易配置).
我不记得先前的适配器是否是VGA的子集,如果不是,它们可能不再受支持.
您可以尝试使用虚拟机或模拟器.
当您对VGA感到满意时,可以移动到SVGA.
这就是麻烦:维基百科证实,VGA是最后一个真正标准化的视频卡/适配器接口:
与VGA不同,纯粹的IBM定义的标准 - 超级VGA从未正式定义.
组织VESA标准化了一个名为Video BIOS Extensions的BIOS API ,允许将SVGA卡用于无驱动的操作系统,但这不是你想要的.
您可以尝试逆向工程VBE BIOS,但我认为这将是一场噩梦 - 对IO端口和MMIO的无意义写入流.
在没有任何参考的情况下理解十分之一的配置寄存器几乎是不可能的.
请注意,到目前为止,我们仍在谈论1998年的技术.
在VESA VBE工作之后,不再发布标准接口 - 用于编程视频卡的唯一可靠方法是在不到20年的时间内与其供应商签署NDA.
幸运的是,最近(实际上,不再是),英特尔凭借其英特尔GFX(又名英特尔高清显卡)卡进入市场.
英特尔从未打算制造顶级视频卡,甚至没有密切关注 - 所以他们可以对他们的架构持开放态度,因为这不是他们的核心业务.
结果是这套奇妙的编程参考手册,描述了他们的视频卡的功能.
完成(传统的)最小信息来编程.
一般来说,业余爱好者在此之前停止(在SVGA检查点),因为硬件变得非常复杂并且工作量非常大.
例如,我的Haswell集成显卡记录有17个PDF,每个约250页(平均).显示部分单独
记录在PDF中,帧缓冲已经消失,有利于显示表面,硬件的显示部分是这样的:
虽然这可能不是很容易理解,但是在编写现代视频卡之前,应该了解程序员必须了解的众多技术.
你可以肯定地看一下Linux源代码,但要注意Linux内核通常不能立即理解,即使对于简单的控制器 - 它不是玩具操作系统,它是一个真正的操作系统,它有自己的API和接口,必须适合硬件接口(实际上是另一种方式).
此外,只有英特尔和AMD的视频驱动程序才是真正的开源,其他的是专有的或只是一堆无证的代码.
如果您只想编程VGA(确实是一项非常值得尊敬的任务!),您可以先设置视频模式 03h(文本模式)或13h(图形模式).
视频模式03h
帧缓冲区为0b8000h(物理地址),通常以0b800h:0000h的形式访问,因为它具有零偏移的便利性.
屏幕由80x25个字符组成,每个字符占用帧缓冲区中的一个字(16位).
低字节是字符代码 - 使用的字符映射将字形与代码相关联(例如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总线,并且必须读取/设置配置空间中的标准寄存器.
处理PCIe并不像处理PCI那么容易.
请注意,即使UART没有固定地址,它们默认配置为映射到传统(3f8h,2f8h,3e8h和2e8h)地址,但硬件是(是?)在PCI-to-LPC后面的SuperIO芯片中模拟PCI到ISA桥的桥.
随着英特尔平台集线器架构的出现(即南北桥的死亡),SuperIO芯片最终成为PCH或移至SPI控制器之后.
是否以相同方式访问所有图形卡,或者是否必须为所有可用图形卡创建设备驱动程序?
每张显卡都是一个美丽的恶毒生物.
每个型号都需要一个设备驱动程序.
一些驱动程序可以重用于整个系列的模型,但一般情况下并非如此.