低级图形界面如何编程?

3
最近,我一直在尝试使用像Arch Linux这样的东西,并引发了一些问题。我经常看到图形在操作系统的非常低级部分中使用(例如GRUB或几乎所有启动菜单)。其中一些甚至具有图像。我还可以在诸如“pacman”命令之类的东西中看到图形操作,其中加载栏将更改而不干扰其上方的文本。另一个例子是像cfdisk这样的程序。我只想知道这些类型的功能是如何编程的?
编辑:我的意思是使用哪些系统调用使其成为可能?
引用:启动菜单

加载条可能是通过回车符实现的。其他部分我不确定。 - Tony Ruth
“低级图形界面是如何编程的?” - 使用文本编辑器和可能的集成开发环境(IDE)。- 抱歉,这个问题太过宽泛。 - too honest for this site
虽然这是一个非常广泛的问题,但它可能使用直接像素操作,比如指定位置(x,y)处像素的颜色并绘制实际字符。 - DMH
可能会使用ncurses库。 - emlai
2个回答

4

当我学习编程时,这种事在MSDOS中非常普遍。 通过简单的汇编指令可以访问一组基本的硬件屏幕模式。

对于支持ASCII字符集的人,可以修改内存中字符的实际字形图像。 每个可用字符都是一个简单的位图,可以在内存中修改为任何外观。

例如,在彩色屏幕模式(例如CGA,EGA)中,文本可以通过特定的内存区域呈现,其中一个字节指定字符,另一个字节指定颜色(对于EGA,前景和背景各为4位)。 只需将值写入其中即可在屏幕上显示。 如果您已修改了字符表,则会显示修改后的字符。

我简直不敢相信我现在才想起来,但内存地址A000显然深深地印在我的脑海中。 您可以在https://en.wikipedia.org/wiki/Enhanced_Graphics_Adapter上阅读更多信息。

当然,还有更高的屏幕模式支持编写实际像素,这就是我们过去编写游戏的方式。著名的320x200 VGA模式非常容易和快速地获得“逼真”和流畅的动画图形,可以使用令人惊叹的256种颜色,而不用担心位平面或其他任何东西。
在低级别上,这本质上就是正在发生的事情。 BIOS对这些被遗忘的图形模式的支持已经存在了很长时间,但现代硬件已经将我们从这些模式中抽象出来,现在我们倾向于通过驱动程序或操作系统抽象直接与显卡通信。

你有任何想法如何在C语言中实现这个吗?我确实了解一定量的汇编语言,但我知道Linux主要是用C语言编程的。 - bobby
请查找旧代码,处理设置屏幕模式、修改ASCII字形表或一般遗留DMA屏幕寻址/图形内存段。可能需要少量汇编语言。这些代码应该在80年代的许多书籍中都有。不确定其可移植性或与现代硬件的相关性。对您来说可能不是问题。 - paddy
1
搜索Ralf Brown的中断列表以获取完整的BIOS调用列表。查询Michael Abrash以获取大量低级图形内容。Mode X可能很有趣。使用VESA功能尝试在视频卡供应商之间创建更通用的接口以支持更高分辨率的视频模式,有时可以在BIOS ROM中找到VESA或者在稍后加载的VESA驱动程序(autoexec.bat/config.sys)。这基本上提供了相同的功能。 - old_timer
ASCII 字符集肯定存在,并且 BIOS 和 DOS 调用它也是众所周知的。 - old_timer
@dwelch 不,我认为chcp 20127会在每个版本的MS-DOS上都给你一个错误。 - Tom Blodget
显示剩余4条评论

0

我从备受推崇的Fractint(原始版本运行在DOS上)中学到了如何初始化和操作低级直接内存访问图形模式。所有好东西都在一个名为video.asm的文件中。除了EGA/VESA等,它还处理了当时可用的一些图形卡,比如Hercules。

他们选择了X服务器将其移植到Linux作为XFractint。应用程序的大部分原始外观、感觉和精神仍然保持不变。这可能是一个很好且安全的开始方式。

对于更低级别的尝试,可以尝试SVGAlib(我没有尝试过)。 大多数Linux低级图形内核似乎都使用VESA BIOS扩展


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接