2016-12-14 105 views
1

我在使用和编程电脑多年后意识到,实际上在屏幕上绘制的软件堆栈对我来说大多是个谜。操作系统如何在屏幕上绘制窗口?

我曾经研究过一些嵌入式LCD GUI应用程序,我认为这提供了一些关于简化堆栈的线索,但对于像Windows操作系统这样的整个画面仍然很模糊。

据我所知:

  • 最低级别0是电子硬件(集成电路),其提供了一种数字接口把一个像素在屏幕的特定颜色或灰度灯罩上。界面在数据表中有记录,因此您可以知道如何切换数字线以按照您的需要转换任何像素。
  • 下一级1是一个硬件驱动程序。这通常将硬件抽象为通用接口。像SetPixel()等
  • 下一级2是2D/3D图形库(其中我有限制部件/单屏幕体验)。较低级别似乎提供了表示屏幕像素的缓冲区或内存范围。图形库对此进行了抽象,以便您可以调用DrawText(“text”,10,10,“font”)等函数,并以正确的方式为您设置像素。

  • 下一级将是操作系统的魔力。窗口/按钮/窗体/ WPF /等在内存中创建,然后路由到适当的驱动程序,同时也被引导到屏幕的某个部分?

但是,像Windows这样的东西真的有用吗?

  • 我会假设GPU适合0级和1级之间的GPU。GPU直接驱动显示器上的像素,现在1级驱动程序是GPU驱动程序。有更多功能可用于启用GPU提供的附加功能。 (这是怎么回事?操作系统是否在3D空间中传递三角形阵列,并且GPU将其处理为3D透视图然后将其在屏幕上查看?)

尽管对我来说最大的神秘是当你进入窗口的一部分的事情。您可以将素描,视觉工作室和FPS游戏同时运行,并且能够在它们之间切换,或者在某些情况下可以将它们平铺在屏幕上,或者然后分布在多个屏幕上。这是如何跟踪和渲染的?其中每一个都必须在后台运行,操作系统将不得不说哪个图形管道应该连接到屏幕的哪一部分。 Windows如何说这部分屏幕是3D游戏,这部分是2D WPF应用程序?

最重要的是,你在一个应用程序中使用DirectX,而在另一个应用程序中使用Qt。我记得有多个运行相同技术的游戏或应用程序,因此如何运作?从我可以看到你将有应用程序 - >图形库(DirectX,WPF等) - >帧缓冲区 - > Windows导向器(在哪里和什么部分的屏幕应该这个帧缓冲区缩放) - >驱动程序?

最后,它只是切换位来指示哪个像素应该是什么颜色,但它是一个很大的切换位的方式来到那里的地狱。

如果我启动Visual Studio并创建一个基本的WPF应用程序,当我在屏幕上放下一个按钮并点击开始时,背景中会发生什么?我已经看到VS设计师放弃它,在XAML中创建它,我甚至在嵌入式系统中逐个像素地手动绘制东西,但之间会发生什么,所谓的三明治肉?

我已经使用过Android,iOS,Windows和Linux,它似乎是一种常见的功能,但我从未见过或听到过我如何在上面概述的背后的解释,我只有一个略有教育的猜测。

是否有人能够说明这是如何工作的?

回答

1

VGA

假设86,VGA存储器是在一个标准的视频缓冲器地址中最低的1 MIB映射(0x000B8000用于文本模式和0x000A0000用于图形模式)。还有许多VGA寄存器可以控制卡的行为。有两种广泛使用的视频模式,模式0x12(16色640x480)和模式0x13(256色320x200)。模式0x12涉及用VGA寄存器交换平面(蓝色,绿色,红色,白色),而模式0x13涉及具有可使用VGA寄存器修改的256色调色板。

通常,依赖于VGA的操作系统会在引导时使用BIOS设置模式,或者在运行时(如果知道它在做什么)写入相应的VGA寄存器。要绘制到屏幕上,视频驱动程序要么只是写入视频内存(模式0x13),要么结合写入VGA寄存器(模式0x12)。

今天使用的大多数卡仍然(部分)与VGA兼容。

VBE

几年以后,VESA发明“VESA BIOS扩展”,这对显卡的标准接口,并允许更高的分辨率和更大的色彩深度。视频内存通过两种不同的方式暴露出来:分组模式和线性帧缓冲器。分区模式会将视频内存的一小部分暴露给低地址(0x000A0000),并且视频驱动程序在每次屏幕更新时都需要切换银行。线性帧缓冲器是一种更方便的解决方案,它可以将整个视频内存映射到非标准的高地址。

在引导期间,操作系统会调用VBE接口来查询支持的模式并设置最方便的模式,或者它将绕过VBE接口并直接写入所需的视频硬件寄存器(如果它知道它是什么这样做)。在分区模式和线性帧缓冲区之间,视频驱动程序会写入视频内存映射到的指定内存地址。

今天使用的大多数卡仍然(部分)VBE兼容。

现代视频接口

平时最现代化的视频接口,没有记录广为VGA和/或VBE。但是,视频内存仍然映射到一个地址,而硬件寄存器和/或缓冲区包含有关图形卡行为的可修改信息。不同之处在于接口不再标准化,现在的高级操作系统对每个显卡都需要不同的驱动程序。

+0

谢谢glauxosdever!据我所知,这听起来像我上面描述的0级/ 1级。仍然不确定这是如何看待高层次的。直到Linux或Windows本身的“窗口管理器”才被理解。非窗口操作系统看起来很简单,但我无法找到有关当您开始使用/不使用图形卡运行窗口管理器时发生的问题。 Windows内部只是看到一个图形API,底层驱动程序系统处理图形是否连接到哪个图形控制器硬件? – Dru

+0

通常,窗口管理器调用底层图形API,然后调用(内核,然后调用)图形驱动程序。括号内的文本是否相关取决于内核是单片还是微内核。 – glauxosdever

相关问题