2014-10-08 43 views
2

更多概述問題比技術。我可以看到Linux內核開發人員的位置,我不知道你想成爲一個內核模塊?與使用系統調用和執行相比,哪種類型的任務最適合作爲內核模塊完成?你會爲內核模塊寫什麼?

less /proc/modules在我的系統上顯示dm_log,device-mapper的記錄器。爲什麼要從內核完成日誌記錄,而不是用戶空間呢?

+0

只是你知道,device-mapper是一個內核組件。所以如果我們要從中導出日誌消息,我們必須在內核中執行它(因爲內核是產生日誌消息的東西) – 2014-10-08 13:58:41

回答

3

你想成爲一個內核模塊?

儘管大多數人將內核模塊(僅)與設備驅動程序關聯,但是其他內核服務(如文件系統和網絡協議處理程序)也可以構建爲模塊。
內核模塊與靜態鏈接(即構建在內核中)的主要基本原理是運行時可配置性(這反過來提高了內存效率)。可選特性,服務和驅動程序可以不在啓動的內核之外,但仍可以在需要時加載。
加載模塊的開銷,模塊所需的存儲空間(內核通常以壓縮形式存儲,而模塊未壓縮)以及每個模塊浪費的內存頁的片段通常被認爲是可接受的折衷。

與使用系統調用和做某些事情相比,哪種類型的任務最適合作爲內核模塊完成?

這是一個單獨的問題,沒有真正涉及到以前。實際上你應該比較用戶模式和內核模式。內核模式是使用一個模塊(它必須被加載)還是靜態鏈接的代碼(它總是可用的)並不是實際問題的重要方面。 (其他回答說:「運行模塊代碼當一個小的性能損失是由於虛擬內存開銷」提到了是不正確。)

用戶模式服務或驅動器具有的優點是:

  • 通常更容易和更快實現(不需要構建和安裝內核)。大多數C程序員只能學習C運行時庫,所以內核環境而不是用戶模式可能是一種學習體驗。

  • 更容易控制專有的源代碼。可免除GNU GPL。

  • 受限制的權限不太可能會無意中取消系統或創建安全漏洞。

內核模式服務或驅動程序具有以下優點:

  • 狀況多於一個程序系統中的不雜亂的排斥鎖。

  • 設備可訪問性可以通過文件權限進行控制。

  • 只要系統正在運行,設備或服務的狀態就是連續且可用的。每次程序啓動時,用戶模式驅動程序都必須將設備重置爲已知的靜態狀態。

  • 更一致/準確的定時器和減少的事件延遲。

的用戶模式與內核模式的一個例子是加入到Linux內核中2.6.30版Reliable Datagram Sockets。之前的RDS是一種基於UDP的用戶模式協議,但通過「acking/windowing/fragmenting/re-ordering等」進行了增強。在重負載下,用戶模式協議的定時器不準確,因此額外的重傳和丟棄的消息導致穩定性和性能問題。切換到內核模式網絡協議旨在改進/解決這些問題。

但是內核模式存在缺陷(或責任)。內核代碼負責確保系統的完整性和安全性。 RDS被發現在內核中引入了一個security hole

爲什麼要從內核進行日誌記錄,而不是做用戶空間?

可能有幾個原因,但是對於這個例子,日誌請求者可能會處於內核模式而不是用戶模式,所以這樣可以避免模式切換的尷尬。

0

內核模塊通常用於您平臺上可能沒有的外設驅動程序。這樣,如果外設在平臺上不可用,則不會消耗內存和CPU時間來添加未使用的代碼。

+0

這個問題不涉及內置驅動程序與模塊,它關注內核模塊與用戶空間。 – 2014-10-09 16:49:00

1

系統調用設備驅動程序/sys/procmmap用戶API允許用戶空間程序只對內核中的符號和數據提供有限的高度受控的接口。這些接口不允許訪問您想要使用驅動程序(如dm_log)登錄的大部分數據和事件。要將這些數據導出到用戶空間,您需要一個內核模式驅動程序,可以是編譯的或者是可加載的內核模塊。

對於中斷處理,系統調用,設備文件,/proc/sys文件系統,即用戶空間API,內核代碼和模塊代碼沒有區別。

這裏有一些理由使用Linux內核模塊技術:

  1. 從內核到一個模塊移動碼降低內核
  2. 減少內核的大小減少內核啓動時的大小 - 該模塊在用戶空間啓動時加載,或之後,如果需要時
  3. 模塊代碼是使用vmalloc加載到內核空間虛擬存儲器,並因此更有效地利用內核空間內存在的是,如果所分配的內存被釋放模塊被卸載,而內存爲編譯進內核的未使用的驅動程序不能被釋放
  4. 模塊允許在不重新編譯,重新安裝甚至重新引導內核的情況下添加內核功能。這通常會縮短開發時間。
  5. 模塊允許另外的功能在任意稍後的時間
  6. 從內核模塊移動功能允許靈活的配置 - 同樣的內核可以在多種類型的系統中使用,或者在由於隨時間變化的同一系統外圍設備的變化,每個系統少不必要的代碼
  7. 的新功能可以被分佈作爲一個模塊文件,該文件是更容易運輸和安裝

缺點使用模塊是:

  1. 如果需要編寫一個執行在不同的處理器模式,諸如ARM FIQ模式代碼,然後需要編譯分別使用「裸機」工具鏈的代碼,並在模塊中嵌入編譯代碼。該裸機代碼將無法訪問內核符號,因爲它在當時基址不可知的情況下在內存中執行。 OTOH可以在常規內核編譯期間編寫FIQ模式代碼並將其編譯到內核中,並且代碼可以在FIQ模式下運行時訪問內核符號,因爲基本內核中的虛擬地址和實際地址相同。
  2. 沒有因虛擬內存開銷

關於用戶空間的驅動程序運行模塊的代碼時,如果是這樣的OP的真正意圖是一個小的性能損失 - 用戶空間的驅動程序是正義的,在用戶空間運行的程序只要。因此,他們沒有比任何其他用戶空間應用程序更多的內核符號或內存訪問權限,也就是說沒有太多。

+3

這解決了使用模塊vs靜態鏈接到內核的原因,但我認爲最初的問題是要求使用模塊vs用戶空間設備驅動程序的原因(「系統調用和執行的東西」) – 2014-10-08 13:32:07

+0

@AdrianCox:原始的措辭的OP沒有向我表明對用戶空間驅動程序概念的認識。無論如何,我添加了關於'dm_log'的OP問題的最後部分的具體參考。 – 2014-10-08 13:39:10

+0

*「3.模塊代碼加載到虛擬內存中」* - 整個內核位於虛擬內存中。你在寫什麼? – sawdust 2014-10-08 19:00:20