作為一名嵌入式Linux的初學者,在拿到功能強大的RK3568開發板時,我的心情既興奮又忐忑。興奮在于終于可以動手實踐,忐忑則源于對復雜開發環境的恐懼。網絡上零散的資料、版本不匹配的工具鏈、以及深不見底的“坑”,都巨大挑戰。
然而,迅為提供的一站式資料包,可以讓嵌入式Linux學習之旅卻出乎意料地順暢和高效。本文將分享《【北京迅為】itop-3568開發板驅動開發指南》第3章 內核模塊實驗的完整過程。
迅為一站式學習教程資料包的價值所在
,迅為的一站式資料包在以下幾個方面讓我效率翻倍:
1.完整性:從工具鏈、源碼、到文檔和工具,所有要素版本匹配,開箱即用,形成了閉環生態。
2.指引性:步步為營的文檔如同一位無聲的導師,消除了過程中的不確定性,讓學習路徑清晰可見。
3.排障效率:技術支持是強大的“安全網”,能將絕大多數常見問題的解決,
對于一名新手而言,時間是最寶貴的成本。迅為的資料包所做的,正是通過體系化的知識工程,最大限度地節約的時間,保護了學習熱情,能夠快速進入嵌入式Linux開發的核心殿堂——驅動開發。這無疑是一次價值遠超硬件本身的投資。

北京迅為RK3568開發板:迅為RK3568開發板ARM3568J核心板瑞芯微人工智能AI鴻蒙Linux安卓
聯系我們獲得《迅為itop-3568開發板驅動開發指南》完整版本。
配套視頻資源:【北京迅為】嵌入式學習之Linux驅動, 免費在線觀看
【北京迅為itop-3568開發板驅動開發指南第 3 章 內核模塊實驗】
在上一章節編寫了最簡單的驅動程序helloworld。helloworld驅動程序要如何編譯并運行
呢?編譯驅動有兩種方法,分別是將驅動編譯進內核和將驅動編譯成內核模塊。我們先來學習
如何將驅動編譯成內核模塊。
把驅動編譯成內核模塊并運行需要設置交叉編譯器、編寫Makefile和編譯模塊三個步驟。
編譯好的內核模塊可以使用insmod命令加載到內核運行,從內核中卸載內核模塊使用rmmod
命令。
3.1 設置交叉編譯器
1.下載交叉編譯器
在網盤“iTOP-3568開發板\03_【iTOP-RK3568開發板】指南教程\02_Linux驅動配套資料\03_
交叉編譯器”路徑下下載交叉編譯器,將下載好的交叉編譯器拷貝到虛擬機Ubuntu環境中的
/usr/local目錄下,如圖3.1所示。

輸入tar -vxf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.gz命令解壓交叉編譯壓縮
包,解壓完畢后會生成交叉編譯器所在的文件夾。如圖3.2所示。

2.設置環境變量
在終端輸入sudo vi /etc/profile命令打開profile文件,接著在profile文件末尾添加以下
代碼。
export PATH=$PATH:/usr/local/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
添加完后如圖3.3所示。

保存退出后在終端輸入reboot命令重新啟動Ubuntu系統,使交叉編譯環境生效。
3.檢查是否設置成功
Ubuntu系統重新啟動登錄到系統后,打開命令行終端,輸入命令aarch64-linux-gnu-gcc -v,
如果終端有如圖3.4所示的打印信息,說明交叉編譯環境搭建成功。如果沒有出現如圖3.4的
打印信息,需要檢查上一步驟是否設置正確。

3.2 編寫 Makefile

編譯驅動程序需要使用Makefile文件。接下來為helloworld.c編寫一個簡單的Makefile,其
代碼如代碼清單3.1所示。

源文件helloworld.c與Makefile文件需要位于同一級目錄下。如下圖3.5所示:

3.3 編譯成內核模塊
在把驅動編譯成內核模塊之前需先編譯通過在Makefile文件中通過KDIR變量指定路徑下
的內核源碼。內核源碼編譯通過后,在Makefile與helloworld驅動路徑下輸入make命令即可
把helloworld驅動編譯成內核模塊,如圖3.6所示。

內核模塊是以ko為后綴名,因此編譯成功得到的helloworld.ko文件即內核模塊,也就是
編譯好的驅動程序。如圖3.7所示:

輸入make clean命令可清除編譯文件,如圖3.8所示:

3.4 模塊加載與卸載
內核模塊可以通過insmod命令加載、通過rmmod命令卸載。
將helloworld.ko內核模塊拷貝到iTOP-RK3568開發板上,通過insmod helloworld.ko命令加
載helloworld內核模塊,加載內核模塊時會調用驅動入口函數helloworld_init,從而輸出打印
字符串信息“helloworld_init”,如圖3.9所示:

如果要卸載helloworld內核模塊,執行rmmod helloworld命令。同理,在卸載內核模塊的
時候會執行驅動出口函數,所以可以看到驅動出口函數打印出來的字符串信息helloworld_exit,
如下3.10所示:

加載內核模塊也可以使用modprobe命令,它比insmod命令更強大,modprobe命令在加
載驅動模塊的時候,會同時加載該模塊依賴的其他模塊。比如helloworld.ko依賴before.ko,
使用insmod加載的時候,就必須先加載before.ko,然后再加載helloworld.ko才可以加載成功。
使用modprobe加載的時候,他會自動分析模塊的依賴關系,然后將所有依賴的模塊都加載到
內核當中,所以modprobe命令比較“聰明”。
同樣,在卸載驅動模塊的時候,如果模塊存在依賴關系,如果使用insmod命令,需要手
動卸載依賴的內核模塊,但是使用modprobe命令可以自動卸載驅動模塊所依賴的其他模塊。
如果驅動模塊是以modprobe helloworld.ko命令加載的,卸載的時候使用modprobe -r
helloworld.ko命令卸載。
但是,使用modprobe卸載存在一個問題,如果所依賴的模塊被其他模塊所使用,比如剛
才例子中的before.ko還被其他的模塊使用,這時候就不能使用modprobe卸載。所以要根據
需求選擇合適的命令進行操作。
3.5 查看模塊信息
lsmod命令可以列出已經載入Linux內核模塊,在helloworld驅動加載之后,使用lsmod
命令查看內核中加載的模塊,如圖3.11所示:

除了使用lsmod命令,也可以使用modinfo helloworld.ko命令可以獲得模塊的其他信息,
如模塊作者,模塊說明,模塊支持的參數等等。
-
開發板
+關注
關注
26文章
6289瀏覽量
118033 -
驅動開發
+關注
關注
0文章
140瀏覽量
12635 -
Linux驅動
+關注
關注
0文章
47瀏覽量
10480
發布評論請先 登錄
【迅為iTOP-Hi3403開發板】一站式啟動Hi3403 NPU開發:從運行例程開始,快速驗證AI效能
迅為3568開發板從零學習Linux驅動開發:迅為一站式資料包如何讓我效率翻倍
評論