【问题标题】:How are low-level graphical interfaces programmed? [closed]低级图形界面是如何编程的? [关闭]
【发布时间】:2016-05-25 18:46:05
【问题描述】:

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

编辑:我的意思是什么系统调用用于使这成为可能?

Boot menu

【问题讨论】:

  • 加载栏很可能是通过回车实现的。其余的我不确定。
  • “低级图形界面是如何编程的?” - 使用文本编辑器和可能的 IDE。 - 抱歉,这个问题太宽泛了。
  • 虽然这是一个非常广泛的问题,但它可能会使用直接像素操作,例如在 (x,y) 位置的像素处指定颜色并绘制实际字符。
  • 可能使用了 ncurses 库。

标签: c linux graphics low-level grub


【解决方案1】:

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

对于那些支持 ASCII 字符集的人,可以修改内存中字符的实际字形图像。每个可用的字符都是一个简单的位图,可以在内存中修改它以显示您想要的外观。

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

我不敢相信我刚才记起了这件事,但是内存地址A000显然已经烙印在我的脑海里了。你可以在https://en.wikipedia.org/wiki/Enhanced_Graphics_Adapter阅读更多内容

当然,还有更高的屏幕模式支持写入实际像素,这就是我们过去编写游戏的方式。众所周知,320x200 VGA 模式非常简单快速地获得“逼真”和流畅的动画图形,令人惊叹的 256 色,而无需担心位平面或任何东西。

这基本上是在低级别发生的事情。 BIOS 对这些被遗忘的图形模式的支持已经存在了很长时间,但是现代硬件已经将我们从这些模式中抽象出来,我们现在倾向于通过驱动程序或操作系统抽象直接与图形卡通信。

【讨论】:

  • 你知道我将如何在 C 中处理这个问题吗?我确实知道相当多的汇编,但我知道 Linux 主要是用 C 语言编写的。
  • 查看处理设置屏幕模式、修改 ASCII 字形表或一般传统 DMA 屏幕寻址/图形内存段的旧代码。可能需要少量的组装。应该在 80 年代的大量书籍中四处游荡。不了解可移植性或与现代硬件的相关性。对你来说可能不是问题。
  • 也许是this will get you started。这似乎很熟悉。然后你只需找出你想要的特定屏幕模式的基地址和内存布局,然后从那里开始。在 C 中使用内联 asm 块创建一个简单的函数来设置中断。
  • 我应该补充一点,我不知道这是否会导致 Linux 中的任何内存保护错误。我从未尝试过。在正常运行级别中使用控制台 TTY 可能不是一个好主意。
  • 搜索 ralf brown 的中断列表以获取完整的 bios 调用列表。查找 Michael Abrash 以获得许多低级图形的东西。模式 x 可能很有趣。以及 VESA 的东西,试图在视频卡供应商之间为更高分辨率的视频模式制作更通用的接口,有时您可能在 bios rom 中拥有 vesa 或稍后加载的 vesa 驱动程序 (autoexec.bat/config.sys)基本上给了你同样的东西。
【解决方案2】:

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

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

对于较低级别的可以尝试SVGAlib(我还没有尝试过)。 大多数来自内核的 Linux 低级图形似乎都在使用VESA BIOS Extensions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多