2013-04-10 113 views
4

我有一個關於Linux深入工作的問題。Linux系統調用流程序列號

比方說一個多線程處理在CPU中被執行。在這種情況下,我們將有一個在CPU上執行的線程。在更寬的畫面中,我們將把屬於該進程的相應頁面加載到RAM中執行。

可以說線程進行系統調用。在此之後,我對這些工作有點不清楚。中斷將產生一個呼叫。我的一個問題是誰會回答這個問題?

比方說,該系統具有M:N用戶級線程內核級線程映射,我假設相應的內核級線程會回答這個電話。

所以內核會查找中斷向量表,並得到其需要執行的程序。我的下一個問題是哪個堆棧將用於執行中斷?它會成爲內核線程堆棧還是用戶級線程堆棧? (我假設它將是內核線程堆棧。)

回到程序流程可以說操作正在使用fopen打開文件。接下來的問題是,如何從ISR跳轉到系統調用?或者我們的ISR映射到系統調用?

同樣在當正在執行的內核線程我假設在RAM上「OS區」將用於安置被執行系統調用的頁面更退一步海闊天空。最後,我假設相應的內核線程正在由CPU調度程序處理,其中上下文切換將發生在從用戶級線程到對應的內核級別線程在系統調用被應答時。

我已經做了很多假設,這將是絕對精彩,如果任何人都可以清除疑慮或至少可以指導我在正確的方向。

+2

您是否介意重新設置文本牆的格式,以便讀起來更容易一些?謝謝。 – NPE 2013-04-10 05:23:19

+0

另外,閱讀Linux編程的幾本書。您首先需要了解應用程序方面,例如http://advancedlinuxprogramming.com/然後你需要了解內核的觀點,並且還有很多書籍...... – 2013-04-10 05:25:46

+0

嗨巴西爾,我已經閱讀了Linux上的多本書,他們幾乎給了我相同的信息。然而,我無法將所有東西縫合在一起。實時操作整個過程的方式。 – 2013-04-10 05:53:28

回答

7

注:我與ARM機主要工作,所以對這些事情可能是ARM具體。另外,我會盡可能地儘量簡化它。隨時糾正任何可能錯誤或過於簡化的事情。

可以說線程進行系統調用。在此之後,我對這些工作有點不清楚。中斷將產生一個呼叫。我的一個問題是誰會回答這個問題?

通常,處理器將在內核模式下的某個預定位置開始執行。內核將保存當前的進程狀態並查看用戶空間寄存器以確定請求了哪個系統調用並將其分派給正確的系統調用處理程序。

所以內核會查找中斷向量表,並得到其需要執行的程序。我的下一個問題是哪個堆棧將用於執行中斷?它會成爲內核線程堆棧還是用戶級線程堆棧? (我假設,這將是內核線程的堆棧。)

我敢肯定它會切換到內核堆棧。如果他們使用用戶空間堆棧,將會有一些相當嚴重的信息泄漏安全問題。

回到程序流程可以說操作是使用fopen打開文件。接下來的問題是,如何從ISR跳轉到系統調用?或者我們的ISR映射到系統調用?

fopen()實際上是一個libc函數,而不是系統調用本身。它可能(並且在大多數情況下)會在其實現中調用open()系統調用。

,處理過程(大致)是:

  1. 用戶空間調用fopen()
  2. fopen執行系統調用open()
  3. 這會觸發某種異常或中斷。作爲響應,處理器切換到更高特權模式並開始在內核中的某個預設位置執行。
  4. 內核確定它是什麼樣的中斷和異常,並對其進行適當的處​​理。在我們的例子中,這將是一個系統調用。
  5. 內核通過讀取用戶空間寄存器並提取任何參數並將其傳遞給適當的處理程序來確定正在請求哪個系統調用。
  6. Handler運行。
  7. 內核將任何返回碼放入用戶空間寄存器中。
  8. 內核將執行轉移回發生異常的位置。

同樣在當正在執行的內核線程我假設在RAM上「OS區」將用於安置被執行系統調用的頁面更退一步海闊天空。

頁面不執行任何操作:)通常,在Linux中,任何映射在0xC0000000之上的地址都屬於內核。

再次從另一個角度看待它(希望你仍然和我一起)最後我假設相應的內核線程正在由CPU調度程序處理,其中上下文切換將發生在用戶級線程當系統調用正在被應答時,將其發送到相應的內核級線程。

有了先發制人的內核,線程不會受到歧視。據我的理解,一個新的線程不是爲服務系統調用而創建的 - 它只是運行在請求系統調用的同一線程中,內核模式除外。

這意味着處於內核模式下的服務於系統調用的線程可以被調度出來,就像任何其他線程一樣。因此,這是您在爲內核開發時聽到'用戶空間上下文'的地方。這意味着它在用戶模式線程上以內核模式執行。

這有點難以解釋這個,所以我希望我說得對。

+0

我有一個小的跟進問題。在你最後一段中你提到過一個線程將有兩種模式,即用戶模式和內核模式。 因此,根據我的理解,當系統調用時,線程從用戶模式進入內核模式。 我的問題是如何適應Linux支持的線程模型,如1; 1:1:n和m:n線程。因此,如果我們有1:n,並且我們有2個線程,當他們兩個同時進行系統調用時,另一個將被阻塞,直到完成此線程的服務爲止。 – 2013-04-14 08:31:47

+1

取決於什麼樣的系統調用。如果他們完全不相關,他們不會阻止,他們只是平行運行。如果他們都試圖訪問內核中的相同資源,它將取決於資源在內核中的鎖定方式。這可能意味着一個線程被阻塞,直到另一個線程完成訪問資源。 – tangrs 2013-04-14 11:01:11