Linux驅動的兩種載入方式過程分析


一、概念簡述

在Linux下能夠通過兩種方式載入驅動程序:靜態載入和動態載入。

靜態載入就是把驅動程序直接編譯進內核。系統啟動后能夠直接調用。靜態載入的缺點是調試起來比較麻煩,每次改動一個地方都要又一次編譯和下載內核,效率較低。

若採用靜態載入的驅動較多,會導致內核容量非常大,浪費存儲空間。

動態載入利用了Linux的module特性,能夠在系統啟動后用insmod命令加入模塊(.ko),在不須要的時候用rmmod命令卸載模塊,採用這樣的動態載入的方式便於驅動程序的調試,同一時候能夠針對產品的功能需求。進行內核的裁剪,將不須要的驅動去除。大大減小了內核的存儲容量。

在台式機上,一般採用動態載入的方式;在嵌入式產品里。能夠先採用動態載入的方式進行調試,調試成功后再編譯進內核。

二、實例分析

以下以Linux下音頻驅動的載入為例,分析兩種方式的載入過程。

1、靜態載入

1)解壓內核,改動硬件架構和編譯器;

將內核壓縮文件linux-2.6.8.1-zzm.tar.bz2解壓到/home/sxy/文件夾下,命令是。解壓后得到內核源代碼文件夾文件linux-2.6.8.1-zzm,進入該文件夾,編輯Makefile文件,將ARCH改為arm。CROSS_CPMPILE改為arm-linux-,例如以下圖所看到的:


保存后退出。

2)配置內核;

在內核源代碼樹文件夾下,輸入make menuconfig命令,進入內核配置界面,進入“Load an Alternate Configuration File”選項,載入配置文件kernel_2410.cfg,保存退出。步驟例如以下圖所看到的:




再次輸入make menuconfig命令,編輯sound選項,將其編譯進內核(*。結果例如以下圖所看到的。最后保存配置,退出。

3)編譯內核。

在源代碼樹文件夾下輸入make zImage命令。編譯完畢后能夠在/arch/arm/boot/文件夾下生成zImage鏡像文件。

4)下載內核

將內核鏡像文件zImage下載到開發板上。當串口終端顯演示樣例如以下信息時,表示驅動載入成功。

2、動態載入

1)解壓內核,過程與靜態編譯時一樣,略。

2) 配置內核,前面過程與靜態編譯時一樣,再次輸入命令make menuconfig,配置sound選項時,將其編譯成模塊(M,結果例如以下圖所看到的。最后保存配置,退出;

這樣就將聲卡驅動編譯成模塊,能夠動態選擇是否載入到內核中。

3)下載內核

將內核鏡像文件zImage下載到開發板上,驗證是否能驅動聲卡的步驟例如以下:

說明:首先。將虛擬機下的/home/文件夾掛載到開發板上的/tmp/文件夾下。然后先后載入soundcore.ko s3c2410-oss.ko兩個模塊。最后通過lsmod命令查看是否載入上聲卡驅動,結果顯示載入成功,這樣就能夠在應用空間編程,實現音頻的錄放等操作。

PS採用make menuconfig命令時,選項*代表Y,表示將驅動編譯進內核;M表示將驅動編譯成模塊;空代表N。表示不編譯;

內核文件與模塊兩者有非常多東西必須匹配,編譯器版本號、源代碼版本號、編譯時的配置等。所以當內核文件改動了,譬如改動了驅動的編譯選項(YMN),那么就必須又一次編譯和下載內核,否則會出錯。

三、遇到的問題

問題:動態載入過程中,出現以下錯誤:

    

錯誤:注冊和注銷設備的符號未知。

解決方法:尋找依賴關系。查看幾個符號的定義。發如今soundcore.c文件里定義了以上幾個函數,同一時候導出了符號,以register_sound_dsp為例,例如以下圖所看到的:

所以應該先載入soundcore.ko,后載入s3c2410-oss.ko。

注意:在Kconfig和Makefile文件里定義了依賴關系,也能夠查找到問題的解決辦法。

2014年6月21日星期六11時25分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM