2015-10-15 77 views
-2

想象用戶空間線程(通過WinApi創建)。用戶線程(OS Windows)的內核模式堆棧是什麼?

旁邊:

  • 線程環境塊
  • GDI處理,OpenGL的處理
  • 用戶空間的棧
  • Therad內核(寄存器)

聽說其持有的堆棧內核模式 - 12 KB - x86,24 KB - x64

q1:什麼是內核堆棧的問題?

據我瞭解,當我們執行系統調用我們:

  1. 填入值,或在我們的上下文指針

  2. 啓動寄存器通過INT中斷甚至CALL(遠調用保護模式)

  3. 在這裏,我們是在內核中斷服務例程。

Q2:我覺得 OS阻止用戶線程,直到OS未完成的任務。是這樣嗎?

也許我們現在是在其中設備I/O控制管理器(如果我們發送IRP包)的一部分。也許在其他一些(如果我們決定創建信號量)。如果這段代碼是可重入的,那麼我認爲系統可以從池中獲得一個內核線程。

Q3:我認爲,內核線程共享任何用戶空間線程誰發起這一切工作。我錯了嗎?

+0

你的第(3)步是錯誤的 - 線程沒有被阻止,它繼續運行在內核模式,使用它的內核模式堆棧。如果操作需要I/O或不能立即完成的IPC,則*線程將被阻塞。但在很多情況下,線程會自行執行請求的操作,並在完成時轉換回用戶模式。 (對於每次轉換到內核模式,要求上下文切換到另一個線程的速度要慢得多)。 –

+0

謝謝,但對我來說,內核由4個線程(kerels數)組成,用戶空間可以由10個進程組成每個100個線程....爲什麼os需要在內核上存儲1000個內核?我認爲操作系統可以推動任務到隊列中,阻止你的線程...... – bruziuz

+0

我在內核模式下工作,但我沒有創建線程他們....所以我不能說精確 – bruziuz

回答

0

我調查的問題了一下:

Q1:現在的問題是什麼內核堆棧?

a:它是與用戶線程關聯的內核堆棧。由於異常光纖不是 一個真正的線程,並且不包含內核堆棧。

Q2:我覺得OS阻止用戶線程,直到OS未完成的任務。是這樣嗎?

a:如果用戶線程執行系統調用或「陷阱」,那麼我們進入內核模式,內核代碼將在上下文中執行,並調用「異常上下文的陷阱」,而且這段代碼可以看到用戶進程的所有內存,線程啓動它。真的可以說它是類似的線程。

Q3:我覺得這線程共享任何用戶空間線程誰發起這一切工作。我錯了嗎?

一個:在這種「異常上下文的陷阱」的kenrel代碼看到用戶空間線程進程所有者的用戶空間充滿存儲器。當用戶空間的線程執行I/O請求時,I/O分派器(在內核模式下)執行工作驅動程序例程之一的調用...(它將在用戶空間線程的上下文中執行)。它的目的是使....

但它在內核中存在另外兩個方面:

  1. 中斷背景下,有大約馬培德內存

  2. Kerenel模式線程上下文中沒有存在garantees。正如在msdn中所說的關於PsCreateSystemThread 「這樣的系統線程沒有TEB或用戶模式上下文,並且只能在內核模式下運行。」


文學:

  1. Windows 2000設備驅動程序的書,第二版,藝術貝克,傑裏洛薩諾 第3章,內核模式I/O處理

  2. InsideMicrosoft®Windows®2000,Third Edition,David A. Solomon和Mark E. Russinovich,第6章。

p.s.我不會提供書籍鏈接,因爲它受到了計算器策略的限制。有人給我更多的缺點,我會在這個論壇,由於愚蠢的問題和愚蠢的鏈接被阻止...

相關問題