2016-12-14 57 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

相關問題