簡體   English   中英

為不同的Linux版本構建內核模塊

[英]Building kernel modules for different linux version

我是編寫內核模塊的新手,因此面臨很少的非技術問題。

因為為特定內核版本創建內核模塊(比如3.0.0-10,10是補丁號)需要相同版本的內核頭文件,所以它看起來很直接安裝內核頭文件並在那里開始開發。 但是修補內核版本的內核頭文件不可用。 因為我有一個客戶端內核vmlinuz-3.0.0-10在機器上運行並且在下載內核頭文件時它說沒有找到。

  • 另一種方法是獲取該特定內核的源代碼,但問題是同樣的補丁內核源不可用(它不需要獲取linux-kernel-3.0.0-10甚至linux-kernel-3.0.0的源代碼)和第10個補丁)。 在某些情況下,可以獲得運行內核的源代碼,但並非總是可行。

  • 另一種方法是構建除運行內核之外的內核,並在機器中放置內置內核。 但它需要構建該內核的模塊,這是一個耗時且耗費空間的過程。

因此,問這個問題的目的是了解內核驅動程序開發人員的偏好。 還有其他選擇嗎?

是否有可能在一個版本中編譯內核模塊並在另一個版本中運行(雖然它會給出錯誤,但有沒有解決方法?)

因此,構建新內核不是一個好選擇,因為它需要:

  • 構建內核
  • 構建模塊和固件
  • 構建標題在適當的位置移動上述所有內容(如果您的機器與您要開發模塊的機器不同)

因此,如果您有運行系統的內核頭文件,那么您不需要為任何內核版本下載源代碼,同時使用模塊

make -C /lib/modules/kernel-headers-x.y.z/build M=`pwd` modules

你的模塊就准備好了。

如果有更好的答案,我會毫不猶豫地接受他們中的任何一個。

我知道這個問題已經很久了。 我是內核開發的新手。 我也遇到了同樣的錯誤。 但現在我能夠在我構建它的不同內核中加載我的模塊。 以下是解決方案:

  1. 下載與您正在運行的映像相關的kernel-devel。 它應該盡可能接近版本。
  2. 檢查您在模塊中使用的函數是否與kernel-devel中的頭文件一起映射。
  3. 更改include / generated / utsrelease.h文件以獲取UTS_RELEASE值。 將其更改為在HW上運行的內核映像的版本。
  4. 使用此內核樹編譯模塊。
  5. 現在您可以將模塊插入內核中。

注意::如上所述Shahbaz可能會導致一些不需要的事件發生。 但如果你這樣做只是為了實驗,我認為它很好。 :)

有一種方法可以在一個內核上構建一個模塊並將其插入另一個內核中。 它是通過關閉某個配置。 我不是告訴你它是哪種配置,因為這絕對是危險的。 原因是內核之間可能存在更改,這可能會導致模塊的行為不同,從而導致完全凍結。

您應該做的是針對已經構建的內核(或至少是已配置的內核)構建模塊。 如果您有一個已修補的內核,那么您可以做的最好的事情就是構建該內核並使用該內核啟動您的操作系統。

我知道這很費時間。 我做了很多次,我知道它有多無聊,但一旦你做得對,它會讓你的生活更輕松。 內核編譯大約需要2個小時左右,但是如果你有一個多核CPU,你可以將它並行化。 此外,你可以在離開辦公室之前(或者如果在家里,睡覺前)讓它編譯,並讓它在晚上工作。

簡而言之,我強烈建議您自己構建自己感興趣的內核。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM