此外,stdout就是這樣。 「屏幕」的概念是操作系統抽象。例如,在Linux和其他一些UNIX中,您的進程與TTY或PTY(電傳打字機和psudoteletypewriter)相關聯,這是stdout可以指向的位置,但不是必須的。標準輸出可以指向文件,網絡,任何東西!而且你必須區分一個真正的終端(認爲Ubuntu上的Ctrl-Alt-F1)和一個僞終端(認爲Konsole,CMD,Terminal.app)。當你有一個僞終端時,它會住在一個窗口中,這使得事情變得複雜10倍。如果你有一個僞終端,這裏可能是步驟(Linux)的:
- 進行系統調用(
write
)寫信給FD 0的字符串。
write
將寫入與FD 0相關的文件,該文件最有可能附加到您的PTY的從屬控制器。然後,終端仿真器(主控制器)接收輸出。
- 它使用某種圖形庫(GTK,Qt,SDL,OpenGL等)來渲染它的窗口緩衝區。這是字體幻想發生的地方。
- 窗口緩衝區被傳遞給窗口管理器和X窗口系統,該窗口系統將其與所有其他窗口和事物一起繪製。
至於視頻驅動程序,該系統的兩個部分使用視頻驅動程序:X窗口和OpenGL。視頻驅動程序由配置文件和硬件發現設置,其中操作系統(或BIOS)探測系統以查找所有可用的硬件和加載驅動程序。
CPU如何將數據放入總線? (據我所知,以下是x86和Linux的具體情況)。那麼,數據必須以某種方式到達顯卡。它可以通過幾種方式發生。視頻卡可將某些視頻內存映射到CPU內存,或者使用x86 I/O端口(in
和out
指令)。
讓我們看看第一種情況。所有視頻卡都在段地址0xb800處映射文本視頻緩衝區(有些還映射某種3d數據緩衝區,但我不確定)。所以,如果我想寫入字符串"Hello, world"
到視頻緩衝器,這裏的一些86 ASM:
mov es, B800H ;Set the extra segment to the video buffer
mov ds, cs ;Set the data segment
mov esi, hellomsg ;Set the source index to the hellomsg
mov edi, 0 ;Video buffer offset
mov ecx, [hellolen] ;How many characters
rep movsb ;Copy
;;Data
hellomsg db "Hello, world!" ;Null terminated hello world
hellolen dw 13
順便說一句,這是驅動程序或操作系統級別ASM - 它直接需要訪問視頻緩衝器,或至少,將視頻緩衝區映射到您的地址空間。另一個選項I/O端口是驅動程序參與的地方。由於哪些端口和寫入它們的是獨立於顯卡的,我不會舉例說明,但您可以查看它。
這個問題真的沒用。他們稱之爲**標準輸出**(簡稱標準輸出)出於某種原因:它是一種**標準**輸出方式,這意味着它在操作系統中的任何地方都存在。該位置的確切位置取決於操作系統(您未指定)。有關更多詳細信息,請研究您所問的特定操作系統的內核,因爲Linux和Windows(以及其他操作系統)在其實現方面有所不同。投票結束爲「不是真正的問題」。 –
我會舉一個任何操作系統的例子。而且,這個問題不僅僅侷限於內核。請不要關閉我有效的問題。 –
@JohnK:雖然這個問題沒有得到解決(並且是一個很好的問題),但試着在未來縮小問題的範圍。你看到我的回答有多長,只是表面上劃痕。所以如果你想知道每個步驟的細節如何,請將這些問題作爲個別問題提出。 – Linuxios