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