1. 程式人生 > >Linux驅動的兩種載入方式過程分析

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-,如下圖所示:<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHAgYWxpZ249"center">\


儲存後退出。

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,表示不編譯;

②核心檔案與模組兩者有很多東西必須匹配,編譯器版本、原始碼版本、編譯時的配置等,所以當核心檔案修改了,譬如修改了驅動的編譯選項(Y、M、N),那麼就必須重新編譯和下載核心,否則會出錯。

三、遇到的問題

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

\

錯誤:註冊和登出裝置的符號未知。

解決方法:尋找依賴關係,檢視幾個符號的定義,發現在soundcore.c檔案中定義了以上幾個函式,同時匯出了符號,以register_sound_dsp為例,如下圖所示:

\

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

注意:在Kconfig和Makefile檔案中定義了依賴關係,也可以查詢到問題的原因。

相關推薦

Linux驅動載入方式過程分析

一、概念簡述 在Linux下可以通過兩種方式載入驅動程式:靜態載入和動態載入。 靜態載入就是把驅動程式直接編譯進核心,系統啟動後可以直接呼叫。靜態載入的缺點是除錯起來比較麻煩,每次修改一個地方都要重新編譯和下載核心,效率較低。若採用靜態載入的驅動較多,會導致核心容量很

Qml檔案的載入方式

一種是QQmlApplicationEngine搭配Window,例如: #include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { Q

bootstrap的modal-remote載入方式

方法一: 使用連結 <a href="demo.jsp" data-toggle="modal" data-target="#mymodal">開啟</a> 當點選該連線時,demo.jsp的內容就可以動態的載入到<div class="mod

DLL的載入方式

DLL有兩種呼叫方式 一,隱式載入(需要.lib和.dll) 二,顯式載入(需要.dll) DLL隱式載入 隱式載入就是在程式編譯的時候就將dll編譯到可執行檔案中,這種載入方式呼叫方便,程式釋出的時候可以不用講dll帶著.缺點是,這樣編譯出

[Linux]PHP-FPM與NGINX的通訊方式

rom code pan ESS write 訪問權限 nec ner div 一、通過監聽TCP端口通訊 php-fpm.d/www.conf ; The address on which to accept FastCGI requests. ; Valid synt

Linux系統方式部署註冊中心

一.將注測中心打好jar包放在linux系統上執行 參考上一篇部落格:https://blog.csdn.net/wufewu/article/details/84646382, 模擬:將SPRINGCLOUD_EUREKASERVER(註冊中心模組)放入Linux系統上執行,其他兩個模

[轉載]從原始碼的角度分析vue-router前端路由實現方式

本文由淺入深觀摩vue-router原始碼是如何通過hash與History interface兩種方式實現前端路由,介紹了相關原理,並對比了兩種方式的優缺點與注意事項。最後分析瞭如何實現可以直接從檔案系統載入而不借助後端伺服器的Vue單頁應用。隨著前端應用的

Spring Boot Application 啟動方式分析

Spring Boot Application 兩種啟動方式分析 問題: Spring boot一般我們都會有 public static void main(String[] args) { SpringApplication.run(xxx.class, args);

WIN8 與WIN7的64位及32位 分別對Legacy BIOS+MBR和UEFI+GPT啟動方式和分割槽架構下的安裝可行性分析

微軟系統、相關產品官方映象下載:http://msdn.itellyou.cn/關於MBR、GPT、ESP、MSR、EFI、UEFI和WIN8中SECURE BOOT的基礎知識:1.MBR分割槽表:Master Boot Record,即硬碟主引導記錄分割槽表,只支援容量在 2.1TB 以下的硬碟,超過2

Linux方式安裝apache伺服器踩過的坑

記得第一次找工作面試時,面試官問:你如何理解apache?對於一個只在tomcat上開發剛入行的程式設計師,我只記得apache是一個開源組織,下面掌管著各種高大上,聽都沒聽過的專案,面試完後我才知道他想問的是apache伺服器,而且後面肯定還有和apache伺服器相關的提問,就這樣被我

linux work queue的排程方式

#include linux/init.h> #include linux/module.h> #include linux/moduleparam.h> #include linux/time.h> #include linux/timer.h> #include linu

Android-動態載入外掛化的實現方式(二):介面

上一篇部落格中http://blog.csdn.net/lxping51/article/details/71480239,主要通過反射的方式來實現動態載入外掛化,今天我們以介面的方式來達到目的。介面的實現比反射更為簡單,而且直接呼叫對效能有很大的提高。但是這也

深入Redis的RDB和AOF持久化方式以及AOF重寫機制的分析

快取伺服器有一個很重要的指標就是能否持久化,如果快取伺服器不支援持久化的話,一些相對重要的資料都不能存在快取伺服器中了,畢竟誰也不能保證服務百分百可用,一旦快取伺服器宕機,所有資料就都丟失了。 今天來分享一下Redis的持久化兩種持久化方式RDB和AOF。

android imageloader 載入圖片方式的差異

ImageLoader的兩種載入圖片方式: 1:loadImage 2:displayImage 區別: loadImage不會自己把圖片顯示在imageview上而displayImage會。 同時建議用displayImage(String uri, ImageAw

普通字元裝置驅動註冊方式(新&舊)

普通字元裝置驅動的兩種註冊方式(新&舊) 在核心中,對於一個普通的字元裝置驅動,不難發現有兩種註冊方式: register_chrdev族函式+建立裝置類、檔案的函式:這種方法是2.4版本

Linux網路連線方式

模式一:NAT方式 好處:路由器更換,或者交換機更換,網路仍然可以使用,所用使用最多 準備工作: 檢視VMware伺服器啟動情況,五個全開模式 vmnet8開啟模式 1 配置VMware交換機的ip地址,此處: 網路:VMnet8(固定) 子網ip:

Linux Shell的加密方式

gzexe 安裝及使用 系統自帶,無需安裝。 使用如下命令加密: gzexe tesh.sh 加密完成後,test.sh即加密後的檔案,同時原始檔備份為test.sh~。 特點 加密同時會壓縮檔案 加密功能比較弱,只能滿足一般

C++ 類的定義方式

命名 c++ ech += esp set with aced spa 類內定義 class Teacher { private: string _name; int _age; public: Teacher() { printf("create teche

屬性的定義方式

alt obj tro tran padding pad hit object 方式 裝飾器方式:[email protected]/* */ 經典類,[email protected]/* */(如上一步實例) # ###############

[轉]Web APi之認證(Authentication)實現方式【二】(十三)

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如