一、前言
也學了10天左右的linux驅動開發了,一般學習新知識的時候,我都喜歡首先理清思路,然後纔去關注更加細節的東西,這次也不例外。
正如我前面寫的幾篇博客,主要內容包括linux內核
和linux發行版
的概念與區別;linux系統
和linux內核源碼
的目錄分析;設備驅動
的作用,裸機設備驅動
和linux系統中的設備驅動
有什麼區別等等,都是在以一個小白的視角來記錄一些必須提前瞭解的知識。當我們後面遇到一些概念或者一些操作的時候,能夠幫助我們更快的理解這些概念和操作具體是什麼意思,我相信這是非常有幫助的。
在前面我已經寫了兩篇關於如何從零開始寫一個簡單的字符設備驅動的文章,但是即使在已經瞭解了字符設備驅動開發的大致流程的情況下,我依然有很多的疑問,那就是我到底應該如何把編寫好的驅動真正的使用起來?
通過這幾天迷迷糊糊的資料查詢,終於是有了初步的瞭解。今天我就來簡單的說一下,當然不會涉及到很多的細節,旨在理清思路,還是那句話思路很重要。
以下都是我自己的一些理解,加上搜索到的一些資料,有錯誤是在所難免。如果有錯誤,還請大家指出來(哈哈)!!
二、兩種使用方式
正如我們的題目所述,新編寫的驅動程序主要有兩種處理方式,也即我們可以通過兩種方式來使用我們新編寫的驅動。一種方式是將驅動程序編譯成.ko
文件,另一種方式就是將驅動程序直接編譯進內核
。它們剛好對應着動態編譯和靜態編譯這兩種編譯模式。
-
靜態編譯:就是將驅動源碼,放到
kernel內核
的源碼中的對應文件夾下面,並且需要添加或者修改Kconfig
和Makefile
文件,再通過圖形界面來配置相應的選項,配置好選項後保存退出,然後編譯,最後編譯出來的是一個整合後用於燒錄到板端
的文件,如zImage
。具體可以參考這篇文章:linux驅動程序——將驅動程序編譯進內核 -
動態編譯:就是將驅動源碼編譯成
.ko
文件,最後通過insmod
命令去板端
加載這個.ko
文件。具體可以參考我之前的兩篇博客:如何開始編寫你的第一個字符設備驅動?和 如何編寫應用程序去驗證我們的字符設備驅動程序?
你可能已經發現,就是我們提到了板端
這個詞,沒錯,這裏我們就是假設你有一個能夠運行linux系統
的板子,比如運行raspbian
的Raspberry Pi
或者運行armbian
的orange Pi
,當然還有很多其他類型的板子。我們是使用PC
來開發驅動程序,並且執行編譯操作,然後將生成的一些文件拷貝到板端
進行運行驗證。
三、還有哪些需要我們注意?
從以上的描述中,你可能已經大致瞭解對寫好的驅動程序進行動態編譯和靜態編譯是什麼意思了,其實這裏面還有一些問題需要注意。
1、內核源碼
- 其實我剛開始的時候對於內核源碼的選擇糾結了很久,因爲內核源碼一般有三個來源,分別是linux官方的內核,芯片廠商修改後的內核以及開發板廠商(或者說適配系統到該板子的一方)修改後的內核。
- 其實很好理解,後面兩者都是爲了適應自己的芯片或者開發板專門對內核做了修改,加入了一些新的功能,我們上面所說的驅動開發就屬於這種情況。所以,最合適的當然是板子中運行的系統對應的內核,對應的就是第三種來源。例如對樹莓派的內核進行修改和編譯的時候就會從樹莓派的官網去下載內核源碼。
- 但是其他的相同版本號的內核可以使用嗎?我的理解是可以,因爲本身目前所使用系統的內核就是一步一步在最基礎的內核上修改得到的。但是,顯而易見的是使用這種內核進行驅動開發是相對較困難的,所以一般都是使用和板子上運行的系統正在使用的內核對應的內核。
2、交叉編譯器
- 因爲我們是在
PC
上進行的驅動開發,所以最後編譯的時候,如果直接使用gcc
,那麼編譯出的模塊是隻能運行在x86
平臺上的,因此我們需要使用交叉編譯器
將其編譯成能夠在ARM
平臺上運行的模塊。以上所說的還是比較容易理解的。