如何在c或asm中切换到超级VGA?

如何在c或asm中切换到超级VGA?,c,assembly,x86-16,osdev,vga,C,Assembly,X86 16,Osdev,Vga,我正在创建一个图形操作系统,我目前使用的是我在保护模式之前启动的模式19,但我希望有一个更高的分辨率,谢谢大家。 我在asm中的图形激活 graphicmode: mov ax, 19; here select which mode you want int 16 感谢您的帮助: 我的程序运行了,但我画了0xA0000,我认为我的缓冲区不够,因为我只看到了屏幕的一部分。你能帮助我吗? 如何使用银行转帐? 如何在c或asm中切换到超级VGA 适用于带BIOS的旧80x86 PC;几乎所

我正在创建一个图形操作系统,我目前使用的是我在保护模式之前启动的模式19,但我希望有一个更高的分辨率,谢谢大家。 我在asm中的图形激活

graphicmode:
  mov ax, 19; here select which mode you want
  int 16
感谢您的帮助: 我的程序运行了,但我画了0xA0000,我认为我的缓冲区不够,因为我只看到了屏幕的一部分。你能帮助我吗? 如何使用银行转帐?

如何在c或asm中切换到超级VGA

适用于带BIOS的旧80x86 PC;几乎所有视频卡都支持VBE see。在这种情况下,您的代码将要求它提供视频模式编号列表,然后使用这些编号获取有关每个视频模式的信息,过滤掉软件不支持的视频模式,然后选择支持的最佳视频模式,并设置该视频模式。这是必要的,因为不同的计算机支持不同的视频模式。你不能期望像800*600这样的特定视频模式存在,因为当该视频模式不存在时,你的代码将被破坏并且不可用。使用VBE函数有3种不同的方法-使用实模式、使用VBE2.0引入的32位保护模式接口(在VBE3.0中已过时/可选),以及使用VBE3.0引入的16位保护模式接口;但是,某些情况下不支持某些功能,例如VBE2.0 32位保护模式接口大多只支持在设置视频模式后使用的功能

这意味着在引导后,对于BIOS来说,支持所有视频卡(带/不带VBE)、带/不带32位保护模式接口以及带/不带16位保护模式接口)在引导后更改视频模式是一个很大的难题;特别是当操作系统是64位的,不能使用virtual8086模式,并且必须实现模拟器/解释器来执行实模式代码,而不破坏操作系统的所有其他设备驱动程序时

对于配备UEFI的现代80x86 PC,请参见,UEFI功能与VBE获取视频模式列表、获取视频模式详细信息、设置视频模式类似。最大的区别在于API支持多个监视器,而VBE不支持多个视频卡;在调用ExitBootServices后,在引导后不能使用这些函数中的任何一个

另一种选择是编写本机视频卡驱动程序,而不是使用固件/依赖视频卡的ROM。这非常复杂且非常耗时,因为每个视频卡需要不同的代码;而且你总是需要一个后备来处理Oops,视频卡是如此的新,以至于我还没有为它编写一个本机视频驱动程序,所以它不需要避免支持使用固件UEFI或BIOS/VBE来查找/设置视频模式

要使操作系统在所有情况下都能工作,使用BIOS的旧计算机、使用UEFI的新计算机、使用/不使用本机视频驱动程序,唯一合理的方法是:

boot loader为所有监视器/视频卡设置默认视频模式,如果boot loader设计用于BIOS或UEFI GOP或UGA,则使用VBE,如果boot loader设计用于UEFI;然后告诉内核/OS帧缓冲区的详细地址、像素格式、每行像素的字节数、每个监视器的水平和垂直分辨率,然后OS使用这些详细信息绘制图形;因此,操作系统没有理由关心引导加载程序是否使用BIOS或UEFI

开机后;操作系统尝试为每个视频卡启动本机视频驱动程序。若找到了一个,那个么操作系统可以使用它来改变视频模式,并可能尝试找到一个更好的视频模式,该模式在引导过程中并没有作为引导加载程序的选项提供

如果没有合适的视频驱动程序,则操作系统无法在引导后更改视频模式;因为只有当固件是BIOS时,才可能支持这一点,对于BIOS来说,这太麻烦了。请注意,操作系统仍然可以在磁盘上的某个位置设置一些视频模式首选项信息,例如,在引导加载程序将查找的引导配置文件中,然后重新启动以使引导加载程序选择不同的模式

请注意,现代显示器有一个首选/本机分辨率,如果分辨率不同,通常会进行低质量缩放,因此每个显示器只有一个真正好的视频模式供任何人使用;如果操作系统不是很糟糕,它将提供独立的解决方案。只有两种情况下,用户会在引导后真正想要更改视频模式-他们已经更换了显示器,而且他们这样做是出于性能原因。幸运的是,人们并不经常更换显示器,因此在这种情况下重新启动只是一个小麻烦;除非用户尝试玩每秒帧数更重要的3D游戏,并且处理量明显更高,否则性能不应该成为问题,用户无论如何都会感到厌烦,除非有支持硬件加速3D的本机视频驱动程序。换句话说,如果您没有本机视频驱动程序,并且无法在引导后更改视频模式;阿尔莫斯 没有人会在乎的

如果您确实希望引导加载程序设置视频模式;然后它将取决于哪个引导加载程序。大多数通用引导加载程序(如GRUB)都会为您设置视频模式,并告诉您它设置的视频模式的信息,因此您根本不需要这样做

如果您正在编写自己的引导加载程序;然后,VBE和UEFI的相关规范很容易在网上获得,例如,请参阅上面链接的相应维基百科页面的外部链接部分;因此,您可以阅读规范,然后尝试编写代码,如果遇到问题,可以询问更具体的问题

我的程序运行了,但我画了0xA0000,我认为我的缓冲区不够,因为我只看到了屏幕的一部分。你能帮助我吗?如何使用银行转帐

对于带有256色模式的旧VGA 320*200,所有设备都适合64千兆位,因此您不需要任何银行切换

请注意,对于更高分辨率的视频模式,您可能需要切换组,这对性能非常糟糕,UEFI不支持,而且BIOS也不支持切换组,或者您必须使用保护模式或长模式来访问线性帧缓冲区。当然,使用更高分辨率视频模式的图形操作系统将在RAM中有许多MiB图形数据,用于图标、图片和缓冲区;所以不能访问超过640千字节内存的实模式无论如何都是完全不可用的。例如,出于性能原因;最后,你需要在RAM中设置一个缓冲区来完成所有的绘图,然后,当所有绘图完成后,你将把结果像素数据从RAM中的缓冲区复制到视频卡的帧缓冲区;对于像800x600这样每像素32位的视频模式,RAM中的缓冲区本身将消耗大约1875 KiB的RAM

如何在c或asm中切换到超级VGA

适用于带BIOS的旧80x86 PC;几乎所有视频卡都支持VBE see。在这种情况下,您的代码将要求它提供视频模式编号列表,然后使用这些编号获取有关每个视频模式的信息,过滤掉软件不支持的视频模式,然后选择支持的最佳视频模式,并设置该视频模式。这是必要的,因为不同的计算机支持不同的视频模式。你不能期望像800*600这样的特定视频模式存在,因为当该视频模式不存在时,你的代码将被破坏并且不可用。使用VBE函数有3种不同的方法-使用实模式、使用VBE2.0引入的32位保护模式接口(在VBE3.0中已过时/可选),以及使用VBE3.0引入的16位保护模式接口;但是,某些情况下不支持某些功能,例如VBE2.0 32位保护模式接口大多只支持在设置视频模式后使用的功能

这意味着在引导后,对于BIOS来说,支持所有视频卡(带/不带VBE)、带/不带32位保护模式接口以及带/不带16位保护模式接口)在引导后更改视频模式是一个很大的难题;特别是当操作系统是64位的,不能使用virtual8086模式,并且必须实现模拟器/解释器来执行实模式代码,而不破坏操作系统的所有其他设备驱动程序时

对于配备UEFI的现代80x86 PC,请参见,UEFI功能与VBE获取视频模式列表、获取视频模式详细信息、设置视频模式类似。最大的区别在于API支持多个监视器,而VBE不支持多个视频卡;在调用ExitBootServices后,在引导后不能使用这些函数中的任何一个

另一种选择是编写本机视频卡驱动程序,而不是使用固件/依赖视频卡的ROM。这非常复杂且非常耗时,因为每个视频卡需要不同的代码;而且你总是需要一个后备来处理Oops,视频卡是如此的新,以至于我还没有为它编写一个本机视频驱动程序,所以它不需要避免支持使用固件UEFI或BIOS/VBE来查找/设置视频模式

要使操作系统在所有情况下都能工作,使用BIOS的旧计算机、使用UEFI的新计算机、使用/不使用本机视频驱动程序,唯一合理的方法是:

boot loader为所有监视器/视频卡设置默认视频模式,如果boot loader设计用于BIOS或UEFI GOP或UGA,则使用VBE,如果boot loader设计用于UEFI;然后告诉内核/OS帧缓冲区的详细地址、像素格式、每行像素的字节数、每个监视器的水平和垂直分辨率,然后OS使用这些详细信息绘制图形;因此,操作系统没有理由关心引导加载程序是否使用BIOS或UEFI

开机后;操作系统尝试为每个视频卡启动本机视频驱动程序。若找到了一个,那个么操作系统可以使用它来改变视频模式,并可能尝试找到一个更好的视频模式,该模式在引导过程中并没有作为引导加载程序的选项提供

如果没有合适的视频驱动程序,则 引导后,en操作系统无法更改视频模式;因为只有当固件是BIOS时,才可能支持这一点,对于BIOS来说,这太麻烦了。请注意,操作系统仍然可以在磁盘上的某个位置设置一些视频模式首选项信息,例如,在引导加载程序将查找的引导配置文件中,然后重新启动以使引导加载程序选择不同的模式

请注意,现代显示器有一个首选/本机分辨率,如果分辨率不同,通常会进行低质量缩放,因此每个显示器只有一个真正好的视频模式供任何人使用;如果操作系统不是很糟糕,它将提供独立的解决方案。只有两种情况下,用户会在引导后真正想要更改视频模式-他们已经更换了显示器,而且他们这样做是出于性能原因。幸运的是,人们并不经常更换显示器,因此在这种情况下重新启动只是一个小麻烦;除非用户尝试玩每秒帧数更重要的3D游戏,并且处理量明显更高,否则性能不应该成为问题,用户无论如何都会感到厌烦,除非有支持硬件加速3D的本机视频驱动程序。换句话说,如果您没有本机视频驱动程序,并且无法在引导后更改视频模式;几乎没有人会在意

如果您确实希望引导加载程序设置视频模式;然后它将取决于哪个引导加载程序。大多数通用引导加载程序(如GRUB)都会为您设置视频模式,并告诉您它设置的视频模式的信息,因此您根本不需要这样做

如果您正在编写自己的引导加载程序;然后,VBE和UEFI的相关规范很容易在网上获得,例如,请参阅上面链接的相应维基百科页面的外部链接部分;因此,您可以阅读规范,然后尝试编写代码,如果遇到问题,可以询问更具体的问题

我的程序运行了,但我画了0xA0000,我认为我的缓冲区不够,因为我只看到了屏幕的一部分。你能帮助我吗?如何使用银行转帐

对于带有256色模式的旧VGA 320*200,所有设备都适合64千兆位,因此您不需要任何银行切换


请注意,对于更高分辨率的视频模式,您可能需要切换组,这对性能非常糟糕,UEFI不支持,而且BIOS也不支持切换组,或者您必须使用保护模式或长模式来访问线性帧缓冲区。当然,使用更高分辨率视频模式的图形操作系统将在RAM中有许多MiB图形数据,用于图标、图片和缓冲区;所以不能访问超过640千字节内存的实模式无论如何都是完全不可用的。例如,出于性能原因;最后,你需要在RAM中设置一个缓冲区来完成所有的绘图,然后,当所有绘图完成后,你将把结果像素数据从RAM中的缓冲区复制到视频卡的帧缓冲区;对于像800x600这样每像素32位的视频模式,RAM中的缓冲区本身将消耗大约1875 KiB的RAM。

您的操作系统是否在真实模式下运行?不,他在保护模式下工作如果您在保护模式下,调用int 16如何工作?@exporarity:mov ax,19的结果与您建议的状态相同,这就是mov-ah,0\mov-al,19。@ecm哦,我不知道,我习惯于认为mov不会触及字大小目的地的较高字节,除非在某个地方明确说明了操作大小或源大于255,非常感谢您澄清您的操作系统是否在实模式下运行?不,他在受保护模式下工作如果你在受保护模式下,调用int 16如何工作?@exporarity:mov ax,19的结果与你建议的相同,即mov ah,0\mov al,19。@ecm哦,我不知道,我习惯于认为mov不会触及字大小目的地的较高字节,除非在某个地方明确说明了操作大小或源大于255,非常感谢您澄清在真实模式下,您当然可以使用非真实模式访问LFB而无需切换银行。在真实模式下,您当然可以使用非真实模式访问LFB而无需切换银行。