osdev - 保护/长模式下的视频输出
问题描述
我是 Lukas,我对在受保护/长模式下在屏幕上绘制像素有疑问,而视频生成通常是操作系统。我的问题是,我如何在屏幕上以高分辨率显示某些东西,例如 1920*1080,或者对我来说更好,在 1680*1050(因为我的显示器有点旧),以及如何为我的显示器制作特定的驱动程序显卡 - 主计算机上的 Intel Integrated HD 620。在我的开发服务器上,我的主板上有一些集成 VGA 控制器 - 英特尔 4 系列芯片组集成图形控制器(第 3 版) - 我认为要控制这张特定的卡,我只需要标准 VGA 控制器的东西 - 比如它的端口、DAC 等等,但是我不知道如何为我的外部 GPU(我的意思是不集成在主板上)制作驱动程序,它是富士通 4 系列芯片组集成图形控制器,我可以在哪里获得有关它的信息,还有我在哪里可以获得关于整个主题的信息,也许还有一些教程。非常感谢您的帮助!
PS:对不起我的英语,我不是英国人。
解决方案
我的问题是,我如何在屏幕上以高分辨率显示某些东西,例如 1920*1080,或者对我来说更好,在 1680*1050(因为我的显示器有点旧),以及如何为我的显示器制作特定的驱动程序视频卡,在哪里可以获得有关它的信息,以及在哪里可以获得有关整个主题的信息,也许还有一些教程。非常感谢您的帮助!
第一个问题是设置可用的视频模式。为此,有3种情况:
- 使用 BIOS/VBE 功能。这在早期启动代码中很容易,但在启动后就非常混乱。
- 使用 UEFI 功能(GOP、UGA)。这在早期启动代码中很容易,但在启动后就不可能了。
- 为每个可能的视频卡编写本机视频驱动程序。这是不可能的——你不能为尚不存在的显卡编写驱动程序,因此每次发布新的显卡时,无论编写一个驱动程序需要多长时间(对于“唯一开发人员”来说,你永远没有时间写一篇)。
“最理智”的选择是“引导加载程序使用任何固件提供的默认视频模式设置并提供帧缓冲区的操作系统详细信息(如果有合适的原生视频驱动程序,则可以使用原生视频驱动程序在早期启动后更改视频模式) )”。
请注意,对于所有这些情况(BIOS、UEFI 和本机驱动程序),都涉及一个选择过程——您希望从显示器获取描述其支持内容的信息、从视频卡获取有关其支持内容的信息以及从操作系统获取的信息关于它支持什么;然后使用所有信息来找到一切都支持的最佳视频模式。您不想仅仅因为显卡支持就设置 1920*1600 视频模式(然后让您的旧显示器显示黑屏,因为它不支持该特定视频模式)。
用于放置像素;公式多为“ address = video_frame_buffer_address + y * bytes_per_line + x * bytes_per_pixel
”;video_frame_buffer_address
您想映射帧缓冲区的任何地方的虚拟地址在哪里;bytes_per_line
帧缓冲区的物理地址以及和的值bytes_per_pixel
是来自 BIOS 或 UEFI 或本机视频驱动程序的详细信息。
对于在屏幕上显示任何东西,像这样放置像素是一个巨大的性能灾难(你不希望address = video_frame_buffer_address + y * bytes_per_line + x * bytes_per_pixel
每个像素的“”计算开销)。相反,您需要更高级别的函数(例如,绘制字符、绘制线条、填充矩形等),以便您可以计算一次起始地址,然后在绘制时调整该地址,而不是再次进行完整计算。例如; 为了绘制一个矩形,你最终可能会得到类似“ for each horizontal line in rectangle { memset(address, colour, width); address += bytes_per_line; }
”的东西。
然而; 您还应该知道(为了增加您的代码在更多不同计算机上工作的机会)您将需要支持多种不同的颜色深度和像素格式;如果您有 10 种不同的绘图功能(绘制字符、线条、矩形等)并支持 10 种不同的颜色深度/像素格式;然后它增加了 100 种不同的功能。一个更简单的替代方法是使用通用像素格式(例如“每像素 32 位 ARGB”)并使用该通用像素格式将所有绘图绘制到 RAM 中的缓冲区,然后具有将数据从 RAM 中的缓冲区传送到帧缓冲区,同时将数据转换为视频模式实际需要的任何内容。
推荐阅读
- amazon-s3 - AWS Boto3 S3 复制不复制标签
- python - 关于python中txt文件数据分析和峰值检测的问题
- graph - 使用 bazel cquery 的 output=graph 的解决方法
- python-3.x - 为什么即使属性确实存在,Python 也会给出 AttributeError
- javascript - 区分 HTML
使用 JQuery/JS
- c# - 如何使用 .NET3.5 从 32 位应用程序中读取 64it 注册表
- android - 如何使用 navigatio 和 dagger2 制作片段单例?
- google-apps-script - 使用 Google Apps 脚本填写 Google 表单
- php - 在 Yii2 应用中获取所有路由(模块、控制器、动作)
- python - 如何实现将文件路径作为参数并根据python中的查询字符串显示文本列表的函数?