我正在创建一个图形操作系统,我目前使用的是在保护模式之前启动的模式19,但我希望提前获得更高的分辨率。我在asm-中的图形激活
graphicmode:
mov ax, 19; here select which mode you want
int 16
感谢您的帮助:)我的程序运行了,但我画了0xA0000,我认为我的缓冲区不足,因为我只看到了屏幕的一部分。你能帮我吗?如何使用银行转换?图像
如何在c或asm中切换到超级VGA?
适用于带BIOS的旧80x86 PC;几乎所有的视频卡都支持VBE(请参阅https://en.wikipedia.org/wiki/VESA_BIOS_Extensions)。在这种情况下,您的代码会要求它提供视频模式编号列表,然后使用这些编号来获取有关每个视频模式的信息,并过滤掉您的软件不支持的视频模式,然后选择";最好的";支持的视频模式,并设置该视频模式。这是必要的,因为不同的计算机支持不同的视频模式(你不能只期望像800*600这样的特定视频模式存在,因为当视频模式不存在时,你的代码会被破坏和不可用)。有3种不同的方式来使用VBE功能-使用真实模式,使用VBE2.0引入的32位保护模式接口,该接口在VBE3.0中已过时/可选,以及使用VBE3.0引入的16位保护模式界面;然而,在某些情况下不支持某些功能(例如,VBE2.0 32位保护模式接口大多只支持在设置视频模式后使用的功能)。
这意味着(引导后),对于BIOS来说,要支持所有视频卡(有/没有VBE,有/没有32位保护模式接口,有/不带16位保护模式界面),引导后更改视频模式是一大痛苦;尤其是当操作系统是64位并且不能使用virtual8086模式时(并且必须实现模拟器/解释器来执行真实模式代码而不破坏操作系统的所有其他设备驱动程序)。
对于配备UEFI的现代80x86 PC(请参阅https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface),有一些UEFI功能与VBE类似(获取视频模式列表、获取视频模式详细信息、设置视频模式)。最大的区别是API支持多个监视器和多个视频卡(VBE不支持);并且在引导之后(在调用ExitBootServices()
之后)不能使用这些函数中的任何一个。
另一种选择是编写本地视频卡驱动程序,而不是使用固件/依赖视频卡的ROM。这非常复杂且非常耗时(因为每个视频卡需要不同的代码);并且您将总是需要一个回退来处理";哎呀,视频卡太新了,我还没有为它写一个本地视频驱动程序",因此它不避免需要支持使用固件(UEFI或BIOS/VBE)来查找/设置视频模式。
要使操作系统在所有情况下都能工作(带BIOS的旧计算机、带UEFI的新计算机、带/不带本地视频驱动程序),唯一合理的方法是:
-
引导加载程序使用VBE(如果引导加载程序是为BIOS设计的)或UEFI(GOP或UGA,如果引导加载软件是为UEFI设计的)为所有监视器/视频卡设置默认视频模式;然后告诉每个监视器的内核/OS细节(帧缓冲区地址、像素格式、每行像素字节数、水平和垂直分辨率),然后OS使用这些细节绘制图形;使得OS没有理由关心引导加载程序是在使用BIOS还是UEFI。
-
稍后在引导期间;操作系统尝试为每个视频卡启动一个本地视频驱动程序。如果找到了一个,操作系统可以使用它来更改视频模式,并可能在引导期间尝试找到更好的视频模式(这不是引导加载程序的选项)。
-
如果没有合适的视频驱动程序,那么OS在启动后无法更改视频模式;因为只有当固件是BIOS时才有可能支持它,而且(对于BIOS)太麻烦了。注意,OS仍然可以设置一些";视频模式偏好";引导加载程序将在磁盘上的某个位置(例如,在引导配置文件中)查找的信息,然后重新启动以使引导加载程序选择不同的模式。
注意,现代显示器有一个首选/本地分辨率(如果分辨率不同,则会进行"通常低质量"缩放),因此对于每个显示器来说,只有一种真正好的视频模式是任何人都想使用的;如果操作系统不是很糟糕;决议独立性";(参见https://en.wikipedia.org/wiki/Resolution_independence)。只有两种情况下,用户真正想在启动后更改视频模式——他们已经更换了显示器,而且他们这样做是出于性能原因。幸运的是,人们不会经常更换显示器(所以在这种情况下,重新启动只是一个小麻烦);并且性能应该不是问题,除非用户试图玩3D游戏(其中"每秒帧数"更重要并且处理量明显更高),否则用户无论如何都会感到恼火(除非有支持硬件加速3D的本地视频驱动程序)。换句话说,如果您没有本地视频驱动程序,并且在启动后无法更改视频模式;几乎没有人会在意。
如果您确实希望引导加载程序设置视频模式/s;那么它将取决于哪个引导加载程序。大多数通用的引导加载程序(例如GRUB)都会为您设置一个视频模式,并告诉您它设置的视频模式的信息,因此您根本不必这样做。
如果您正在编写自己的引导加载程序;则VBE和UEFI的相关规范可以很容易地在线获得(例如,参见上面链接的相应维基百科页面的"外部链接"部分);因此,您可以阅读规范,然后尝试编写代码(如果遇到问题,可以问一个更具体的问题)。
我的程序运行了,但我画了0xA0000,我认为我的缓冲区不足,因为我只看到了屏幕的一部分。你能帮我吗?如何使用银行转换?
对于旧的VGA";具有256种颜色的320×;模式所有东西都适合64KiB,所以你不需要任何银行切换。
请注意,对于更高分辨率的视频模式,您要么需要组切换(这对性能来说很糟糕,UEFI不支持,BIOS也太麻烦了),要么必须使用保护模式或长模式来访问线性帧缓冲区。当然,使用更高分辨率视频模式的图形操作系统将在RAM中有许多MiB的图形数据,用于图标、图片和缓冲区;所以实际模式(不能访问超过大约640KiB的RAM)无论如何都是完全不可用的。例如,出于性能原因;你最终需要在RAM中有一个缓冲区来完成所有绘图(然后,当所有绘图完成时,你会将结果像素数据从RAM中的缓冲区复制到视频卡的帧缓冲区);而对于像"视频"这样的视频模式;800x600,每像素32位";RAM中的缓冲区将单独花费约1875 KiB的RAM。