计算机如何显示原始的低级文本和图形


46

我对计算机的兴趣与日俱增,这使我提出了更深层次的问题,而我们似乎再也不必问这些问题了。我们的电脑,在开机,据我了解,在文本模式,其中可使用软件中断来显示一个字符0x10AH=0x0e。我们都已经看到了著名的启动字体,无论启动什么计算机,该字体始终看起来相同。

那么,计算机到底如何在操作系统之下以最低级别输出图形?而且,由于声音听起来很慢,因此肯定不会通过软件中断一次不输出图形像素吗?

是否有定义顶点,多边形,字体等基本输出的标准(例如,在OpenGL以下,可能使用哪个OpenGL)?我要问的是,为什么在没有安装官方驱动程序的情况下OS'通常可以正常运行?他们如何做到的?

抱歉,如果我的假设不正确。我将非常感谢您详细阐述这些主题!


并不是所有的计算机,而是取决于显示硬件。基于IBM进化系列的PC最初只有文本模式,然后添加了各种图形模式。我们仍然有那个遗产。较旧的计算机通常只有文本模式。其他计算机仅具有图形模式,例如Amiga和原始的Macintoshes。
hippietrail

Answers:


25

这(部分)是BIOS的角色。

尽管实际计算机之间存在差异,但计算机的基本输入输出系统仍负责为操作系统提供通用接口。

也就是说,特别是对于图形,有多种绘制屏幕的方法。您可以发送一些TTY命令到BIOS,但这只是在实模式下。如果要在保护模式下绘制任何内容,则需要使用VGA绘制内容。我无法比OSDev更好地解释它,因此请在此处查看更多信息 -但基本上,您可以从地址开始写入内存(视频内存已映射内存),0xB8000以便在屏幕上绘制内容。

如果您需要比VGA更高的分辨率,则需要使用VESA BIOS扩展。我不熟悉它,但是请尝试查看GRUB源代码以获取更多信息。

一些有用的参考:


如果您碰巧熟悉D,我会在不久前写了一个小的引导加载程序,它可以写入屏幕(仅文本)。如果您有兴趣,请使用以下代码:

align(2) struct Cell { char ch; ubyte flags = 0x07; }

@property Cell[] vram()
{ return (cast(Cell*)0xB8000)[0 .. CONSOLE_WIDTH * CONSOLE_HEIGHT]; }

void putc(char c)
{
    if (isBochs) { _outp(0xE9, c); }  // Output to the Bochs terminal!

    bool isNewline = c == '\n';
    while (cursorPos + (isNewline ? 0 : 1) > vram.length)
    {
        for (short column = CONSOLE_WIDTH - 1; column >= 0; column--)
        {
            foreach (row; 0 .. CONSOLE_HEIGHT - 1)
            {
                uint cell = column + cast(uint)row * CONSOLE_WIDTH;
                vram[cell] = vram[cell + CONSOLE_WIDTH];
            }
            vram[column + (CONSOLE_HEIGHT - 1) * CONSOLE_WIDTH].ch = ' ';
        }
        cursorPos = cast(ushort)(cursorPos - CONSOLE_WIDTH);
    }
    if (isNewline)
        cursorPos = cast(ushort)
            ((1 + cursorPos / CONSOLE_WIDTH) * CONSOLE_WIDTH);
    else vram[cursorPos++].ch = c;
}

void putc(char c, ubyte attrib) { vram[cursorPos] = Cell(c, attrib); }

void memdump(void* pMem, size_t length)
{
    foreach (i; 0 .. length)
        putc((cast(char*)pMem)[i]);
}

void clear(char clear_to = '\0', ubyte attrib = DEFAULT_ATTRIBUTES)
{
    foreach (pos; 0 .. vram.length)
        vram[pos] = Cell(clear_to, attrib);
    cursorPos = 0;
}

@property ushort cursorPos()
{
    ushort result = 0;
    _outp(0x3D4, 14);
    result += _inp(0x3D5) << 8;
    _outp(0x3D4, 15);
    result += _inp(0x3D5);
    return result;
}

@property void cursorPos(ushort position)
{
    _outp(0x3D4, 14);
    _outp(0x3D5, (position >> 8) & 0xFF);
    _outp(0x3D4, 15);
    _outp(0x3D5, position & 0xFF);
}

感谢您的回答。为什么使用GRUB源代码?我不知道GRUB与图形本身有关。
Doddy

2
@panic Grub2可以做一些有趣的事情,包括在OS选择菜单上显示图像作为背景。不确定g。
2011年

@panic:我不确定是GRUB还是GRUB2(我一般使用“ GRUB”),但是它们肯定可以在我的显示器上切换为本机1600x900分辨率,因此,我确定它们具有您可以研究的东西。(我已经看过他们一段时间了,我记得他们对您有所帮助,但是我已经有一段时间了,所以我不记得您应该看哪个文件了。)
Mehrdad

这个术语是否memory-mapped意味着RAM中有一个“缓冲区”区域,CPU(或另一个DMA单元?)可以代表图形卡和试图写入显示器的程序进行读写?
n611x007 2013年

1
@naxa:一个好问题……通常,内存映射的硬件意味着内存中的地址实际上并不对应于RAM。相反,对其进行读取或写入对应于在某些硬件上执行某些操作。就是说,我不确定如何区分实际RAM和使一块内存看起来像RAM的硬件...在这种情况下可能是实际RAM,但我的印象是读写被拦截通过硬件。
Mehrdad

25

从IBM PC及其克隆的早期开始,显示适配器的硬件就非常简单:一小块内存专用于一个字符单元网格(标准模式下为80x25个字符),每个单元有两个字节的内存。一个字节选择了字符,另一个字节选择了它的“属性”-前景色和背景色以及颜色适配器的闪烁控制;单色适配器的粗体,下划线,闪烁或反向视频。硬件根据字符存储器的内容从字符形状的ROM表中查找像素。

为了提供一定程度的硬件独立性,字符映射表的BIOS接口要求执行软件中断,以便在屏幕上设置单个字符单元。这是缓慢且低效的。但是,字符存储器也可以由CPU直接寻址,因此,如果您知道存在什么硬件,则可以直接写入存储器。无论哪种方式,一旦设置,字符将一直保留在屏幕上直到更改,并且您需要使用的总字符存储为4000字节-大约是单个32x32全彩色纹理的大小!

在图形模式下,情况相似。屏幕上的每个像素都与内存中的特定位置相关联,并且有一个BIOS设置像素接口,但是高性能工作需要直接写入内存。诸如VESA之类的后来标准使系统可以执行一些基于BIOS的慢速查询,以了解硬件的内存布局,然后直接使用内存。这是OS无需专用驱动程序即可显示图形的方式,尽管现代OS的确也包括每个主要GPU制造商的硬件的基本驱动程序。即使是最新的NVidia卡也将支持几种不同的向后兼容模式,可能一直追溯到IBM CGA。

3D图形和2D之间的一个重要区别是,在2D中,您通常不需要每帧都重新绘制整个屏幕。在3D模式下,即使相机移动了一点点,屏幕上的每个像素也可能会改变。在2D模式下,如果不滚动,则大部分屏幕将保持逐帧不变,即使滚动,通常也可以进行快速的内存到内存复制,而不用重新构图整个场景。因此,这就像在每帧每个像素上执行INT 10h一样。

资料来源:我真的很老


非常有用,谢谢。我希望我可以接受不止一个!
Doddy

8

在引导过程中,系统BIOS查找视频适配器。特别是,它将查找视频适配器的内置BIOS程序并运行它。此BIOS通常在内存中的位置C000h中找到。系统BIOS执行video BIOS,从而初始化视频适配器。

BIOS可以在没有操作系统或驱动程序的情况下本地显示视频/图形的级别或模式,这主要取决于视频BIOS本身。

源/更多信息在这里 -“系统启动顺序”


6

据我所知,我们的计算机在启动时处于文本模式,当AH = 0x0e时,可以使用软件中断0x10显示字符

您在谈论旧版BIOS功能。实际上,您根本不需要使用此类功能。您可以直接将它们写入视频内存。

到底,计算机如何在操作系统之下以最低级别输出图形?

这与操作系统的运行方式息息相关。无论如何,在硬件级别上的操作是相同的:视频卡具有视频RAM,该RAM存储(简化)要在屏幕上绘制的下一个图像。您可以认为每个地址都是代表一个像素的字节(实际上通常每个像素需要一个以上的字节)。然后,视频控制器负责将其转换为监视器可以理解的信号。

是否有定义顶点,多边形,字体等基本输出的标准(例如,在OpenGL以下,可能使用哪个OpenGL)?

AFAIK,不。没有关于逻辑图形表示的标准。

我要问的是,为什么在没有安装官方驱动程序的情况下OS'通常可以正常运行?他们如何做到的?

因为它已将驱动程序与操作系统捆绑在一起。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.