2012-08-31 38 views
2

在任何入門課程中,您首先學習的是System.out.println,printf等打印到標準輸出並在屏幕上彈出。我想知道該過程中的所有詳細步驟。總之我知道參與下,但我不知道所有的細節:從標準輸出到我的電腦屏幕

  • 一個系統調用的內核做
  • 的文字是光柵化
  • CPU是執行程序指令(使用共享庫吧?)
  • 驅動程序爲屏幕涉及
  • CPU會談某些總線(PCI? ?或PCIe)主板
  • 總線上發送數據到屏幕

一些具體的問題,我有是:

  • 如何計算機知道標準輸出放在屏幕上的意思嗎?如果連接了多個屏幕怎麼辦?它如何知道硬盤驅動器或以太網插口的屏幕?
  • 視頻驅動程序如何參與等式?它如何知道使用什麼驅動程序?
  • CPU如何將數據放在總線上?例如,它如何知道要寫入的地址?如何使用該地址將數據發送到寫入位置?您能否提供一些在此過程中使用的示例CPU指令?

謝謝!

+0

這個問題真的沒用。他們稱之爲**標準輸出**(簡稱標準輸出)出於某種原因:它是一種**標準**輸出方式,這意味着它在操作系統中的任何地方都存在。該位置的確切位置取決於操作系統(您未指定)。有關更多詳細信息,請研究您所問的特定操作系統的內核,因爲Linux和Windows(以及其他操作系統)在其實現方面有所不同。投票結束爲「不是真正的問題」。 –

+0

我會舉一個任何操作系統的例子。而且,這個問題不僅僅侷限於內核。請不要關閉我有效的問題。 –

+0

@JohnK:雖然這個問題沒有得到解決(並且是一個很好的問題),但試着在未來縮小問題的範圍。你看到我的回答有多長,只是表面上劃痕。所以如果你想知道每個步驟的細節如何,請將這些問題作爲個別問題提出。 – Linuxios

回答

2

此外,stdout就是這樣。 「屏幕」的概念是操作系統抽象。例如,在Linux和其他一些UNIX中,您的進程與TTY或PTY(電傳打字機和psudoteletypewriter)相關聯,這是stdout可以指向的位置,但不是必須的。標準輸出可以指向文件,網絡,任何東西!而且你必須區分一個真正的終端(認爲Ubuntu上的Ctrl-Alt-F1)和一個僞終端(認爲Konsole,CMD,Terminal.app)。當你有一個僞終端時,它會住在一個窗口中,這使得事情變得複雜10倍。如果你有一個僞終端,這裏可能是步驟(Linux)的:

  1. 進行系統調用(write)寫信給FD 0的字符串。
  2. write將寫入與FD 0相關的文件,該文件最有可能附加到您的PTY的從屬控制器。然後,終端仿真器(主控制器)接收輸出。
  3. 它使用某種圖形庫(GTK,Qt,SDL,OpenGL等)來渲染它的窗口緩衝區。這是字體幻想發生的地方。
  4. 窗口緩衝區被傳遞給窗口管理器和X窗口系統,該窗口系統將其與所有其他窗口和事物一起繪製。

至於視頻驅動程序,該系統的兩個部分使用視頻驅動程序:X窗口和OpenGL。視頻驅動程序由配置文件和硬件發現設置,其中操作系統(或BIOS)探測系統以查找所有可用的硬件和加載驅動程序。

CPU如何將數據放入總線? (據我所知,以下是x86和Linux的具體情況)。那麼,數據必須以某種方式到達顯卡。它可以通過幾種方式發生。視頻卡可將某些視頻內存映射到CPU內存,或者使用x86 I/O端口(inout指令)。

讓我們看看第一種情況。所有視頻卡都在段地址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端口是驅動程序參與的地方。由於哪些端口和寫入它們的是獨立於顯卡的,我不會舉例說明,但您可以查看它。

+0

感謝您提供非常詳細的解釋。這給了我很多參考資料,我可以查找更多的理解。再次感謝您的時間和精力。 –

+0

@JohnK:好的!很高興我能幫上忙。只是不斷詢問並對組裝問好奇! (沒有多少人是)。 – Linuxios