1. 程式人生 > >Linux 裝置驅動開發 —— 驅動開發環境建立(一)

Linux 裝置驅動開發 —— 驅動開發環境建立(一)

引言
  Linux 裝置驅動簡介:它在 Linux 系統中扮演著重要角色,是很多獨立的“黑盒子”的總稱,使某個特定硬體響應一個定義良好的內部程式設計介面,這些介面完全隱藏裝置的工作細節。使用者操作通過一組標準化的呼叫執行,而這些呼叫是和特定的驅動程式無關的。將這些呼叫對映到作用於實際硬體裝置特有的操作上是裝置驅動程式的任務。這個程式設計介面能夠使得驅動程式獨立於核心的其它部分而建立,在必要的情況下,可在執行時“插入”核心。這種模組化的特點,使得 Linux 裝置驅動程式的編寫非常簡單,因此核心驅動程式的數目也增長迅速。

例項
  Linux 裝置驅動程式可以認為是一個學名,我們通常稱之為“模組”,也就是位於 Linux OS 的 /lib/modules/`uname -r`/kernel 目錄下以 *.ko 為字尾的檔案。
  在此,先為大家呈現一個簡單的裝置驅動程式:simple-lkm.ko
清單一、simple-lkm.c

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("GPL");

static int my_module_init( void )
{
  printk(KERN_INFO "my_module_init called.  Module is now loaded.\n");

  return 0;
}

static void my_module_cleanup( void )
{
  printk(KERN_INFO "my_module_cleanup called.  Module is now unloaded.\n");

  return;
}

module_init( my_module_init );
module_exit( my_module_cleanup );

清單二、Makefile

OBJ    = simple-lkm
obj-m := $(OBJ).o

KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD       = $(shell pwd)

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
install:
	insmod $(OBJ).ko
uninstall:
	rmmod $(OBJ).ko

clean :
	rm -rf *.o *.mod.c *.ko *.symvers
清單三、執行make的輸出結果
[[email protected]
simple]# make make -C /lib/modules/2.6.18-194.el5/build M=/home/king/design/simple modules make[1]: Entering directory `/usr/src/kernels/2.6.18-194.el5-i686' CC [M] /home/king/design/simple/simple-lkm.o Building modules, stage 2. MODPOST 1 modules CC /home/king/design/simple/simple-lkm.mod.o LD [M] /home/king/design/simple/simple-lkm.ko make[1]: Leaving directory `/usr/src/kernels/2.6.18-194.el5-i686' [[email protected] simple]# ls Makefile Module.symvers simple-lkm.c simple-lkm.ko simple-lkm.mod.c simple-lkm.mod.o simple-lkm.o [[email protected] simple]# modinfo simple-lkm.ko filename:       simple-lkm.ko license:        GPL srcversion:     DF84301A43D077CFC697B75 depends:         vermagic:       2.6.18-194.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
  可以從清單二看出編譯模組與普通的應用程式不同,比如大多國內的 C 語言書籍裡邊的第一個例子“hello world”,執行“gcc -o hello hello.c”即可。其實驅動開發環境就是Makefile中“default”這一選項中“KERNELDIR”目錄。為什麼說就是這個目錄?對清單二進行解析,其意為:該 make 實現模組編譯,需要切換到驅動開發環境下,引用環境中的”modules“規則,編譯當前目錄的原始碼,以”OBJ“為名輸出結果。
  過程資訊和結果如清單三,simple-lkm.ko 就是例項想要的裝置驅動程式輸出的模組。

驅動開發環境建立
  以 RHEL 5.5 32bit 系統為例,該環境的建立最終就是使 Linux OS 存在可用的”/lib/modules/2.6.18-194.el5/build“,”build“是什麼目錄,我們可以看到它是一個連結,它的源是”/usr/src/kernels/2.6.18-194.el5-i686“目錄,該目錄內容如清單四。
清單四、build 目錄頂層目錄內容

[[email protected] 2.6.18-194.el5-i686]# ll
總計 904
drwxr-xr-x 26 root root   4096 2011-09-19 arch
drwxr-xr-x  2 root root   4096 2011-09-19 block
drwxr-xr-x  4 root root   4096 2011-09-19 crypto
drwxr-xr-x 68 root root   4096 2011-09-19 drivers
drwxr-xr-x 66 root root   4096 2011-09-19 fs
drwxr-xr-x 22 root root   4096 2011-09-19 include
drwxr-xr-x  2 root root   4096 2011-09-19 init
drwxr-xr-x  2 root root   4096 2011-09-19 ipc
-rw-r--r--  1 root root  57768 2010-03-17 kabi_whitelist
drwxr-xr-x  5 root root   4096 2011-09-19 kernel
drwxr-xr-x  5 root root   4096 2011-09-19 lib
-rw-r--r--  1 root root  48242 2010-03-17 Makefile
drwxr-xr-x  2 root root   4096 2011-09-19 mm
-rw-r--r--  1 root root 168370 2010-03-17 Module.kabi
-rw-r--r--  1 root root   2065 2010-03-17 Module.markers
-rw-r--r--  1 root root 412606 2010-03-17 Module.symvers
drwxr-xr-x 43 root root   4096 2011-09-19 net
drwxr-xr-x  4 root root   4096 2011-09-19 samples
drwxr-xr-x 10 root root   4096 2011-09-19 scripts
drwxr-xr-x  4 root root   4096 2011-09-19 security
drwxr-xr-x 18 root root   4096 2011-09-19 sound
-rw-r--r--  1 root root  47540 2010-03-17 symsets-2.6.18-194.el5.tar.gz
drwxr-xr-x  2 root root   4096 2011-09-19 usr

  發行版的這一目錄一般隨光碟或ISO檔案發放,RHEL 5.5 32bit 系統的這一目錄有”kernel-devel-2.6.18-194.el5.i686.rpm“生成,只要我們找到該 rpm 包,安裝到系統就可以構建 RHEL 5.5 32bit 的裝置驅動開發環境,參考命令如清單五。
清單五、裝置驅動開發環境 rpm 包
[[email protected] ~]# rpm -ivh kernel-devel-2.6.18-194.el5.i686.rpm
  官方發行版的驅動開發環境構建就完成,當然,kernel-devel 包有很多依賴關係,如 gcc、glibc 等。可以根據提示逐一安裝缺少元件的 rpm 包。

  這樣的環境構建在 Linux 環境下應該是非常簡單的。下一講,我們一起來看看如何構造自己的核心開發環境。

參考文獻
《linux 裝置驅動程式》第三版, By Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman

相關推薦

Linux 裝置驅動開發 —— 驅動開發環境建立

引言   Linux 裝置驅動簡介:它在 Linux 系統中扮演著重要角色,是很多獨立的“黑盒子”的總稱,使某個特定硬體響應一個定義良好的內部程式設計介面,這些介面完全隱藏裝置的工作細節。使用者操作通過一組標準化的呼叫執行,而這些呼叫是和特定的驅動程式無關的。將這些呼叫對映

Docker for Windows安裝與Linux+PHP開發環境搭建

Docker是什麼? 簡單得來說,Docker是一個由GO語言寫的程式執行的“容器”(Linux containers, LXCs); 目前雲服務的基石是作業系統級別的隔離,在同一臺物理伺服器上虛擬出多個主機。Docker則實現了一種應用程式級別的隔離; 它改變我們基本的開發、操作單元,

Linux開發環境搭建

Linux 開發環境搭建 1. 安裝Ubuntu 14.04系統 下載IOS映象,並使用VMware 建立虛擬機器並安裝VMware-tool Ubuntu 14.04的下載地址:Ubuntu 14.04 安裝過程比較簡單,可參考很多教程 2. 安裝中文輸入法 在Ub

ESP8266 機智雲 開發環境搭建安裝Linux系統

ESP8266 學習資料是越來越多了,記錄一下開發環境的搭建方法。 準備 首先要先安裝這個軟體   VMware Workstation Pro 搜尋搜尋就會找到了的,這就不多說了。 然後下載

嵌入式開發環境搭建 虛擬機實現橋接Ethernet網口 並且通過WIFI進行NAT聯網

war bubuko 搭建服務器 6.4 網線 16.4 聯網 橋接 圖片 背景:   目前手頭上有一塊JZ2440的板子,之前有搭建完整套開發環境,由於虛擬機故障需要從新搭建服務器端,故在此記錄搭建步驟 環境:   Ubuntu16.4   VMWare 12 先行條件:

VsCode + node+ vue.js 開發環境搭建

1.安裝最新的 vscode ,這個很容易安裝。 2.要在機器上開發 vue.js 有兩種模式,一種直接用 .js ,這種方式不用 安裝.node  環境,另一種用 webpack, 3.在機器安裝 node node-v10.8.0-x64.msi,在安裝過程中可能會出

linux驅動篇之 driver_register 過程分析

linux驅動註冊過程分析--driver_register(一) 個人筆記,歡迎轉載,請註明出處,共同分享 共同進步  http://blog.csdn.net/richard_liujh/article/details/45825333 kernel版本3.10.1

Windows下C語言開發環境配置:MinGW的簡介和安裝

Windows下C語言開發環境配置(一):MinGW的安裝和eclipse的配置 1.什麼是MinGW? MinGW即Minimalist GNU for Windows,是一個簡單Windows本地應用的開發環境。MinGW包含有一組GNU編譯器的集合(包

Weex環境構建Weex+Android開發環境

構建痛點 Weex與Android是兩個開發環境,最終的關聯點是weex生成的js放到Android的Assets中,當然Android也可以採用遠端方式載入js,這個暫時還沒用到。下面介紹對兩個平臺簡單整合。 weex環境 通過weex命令初始化weex

Ubuntu12.04的嵌入式開發環境搭建

Ubuntu12.04開發arm體系程式的環境搭建。包括VMware8安裝Ubuntu12.04、minicom的安裝說明、nfs的安裝說明、svn的安裝說明、qt的安裝說明等。 一、VMware8安裝Ubuntu12.04 本機系統: WIN7    虛擬機器:VMwa

Android JNI開發之NDK環境配置eclipse

最近開發一個小專案,需要用到native方法,於是需要配置NDK環境。首先肯定是網上找,網上比較多,但是都不全,有的已經過時了。所以,我綜合大家之長,寫了如下配置流程,供大家使用,有什麼不對的請大家指正。 總共分為5步: 1、下載NDK。這個我不說了。

Spring Security技術棧開發企業級認證與授權環境搭建

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

Vue.js2.0開發環境搭建

最近,vue.js越來越火。在這樣的大浪潮下,我也開始進入vue的學習行列中,在網上也搜了很多教程,按著教程來做,也總會出現這樣那樣的問題(坑啊,由於網上那些教程都是Vue.js 1.x版本的,現在用Vue.js 的構建工具都已經升級到2.0版本了),經過了一段時間的摸索和看

Vue開發環境配置

專註 成功 名稱 似的 bsp ubd unit test eset module 一、安裝node   到node官網:https://blog.csdn.net/wulala_hei/article/details/85000530 下載系統對應版本安裝即可。   

Linux之Ubuntu環境配置

sogou home ade -- linux下 安裝 linux64 x64 inux Linux下的搜狗輸入法安裝: 1.搜狗官網下載Linux64bit版本文件,默認在/home/username/Downloads目錄下。 2.cd /home/username/D

Qt5.9.1結合REF開發基於chorm的瀏覽器

編譯 ++ mar 建立 eat generate sha 設計 source 下載cef3的源碼 cef簡介   嵌入式Chromium框架(簡稱CEF) 是一個由Marshall Greenblatt在2008建立的開源項目,它主要目的是開發一個基於Google Chr

Kotlin開發基礎從0開始

code ... 多說 lang 學習 function ria lis lac 為什麽學習kotlin kotlin在今年的Google IO 上正式被確認為Android的官方開發語言,想必原因大家也能猜到一二,一是Google與oracle關於Java相關的版權相關的

尋找bug並消滅系列——記錄在Android開發所遇到的bug

ont 屬性 XML android oid content 事件監聽器 監聽 設置 之前使用了Android Studio的插件直接為button綁定了監聽器,並實現onClick方法(我的onClick方法無論點擊哪一個都是要實現setcontentview這個方法設置

全棧開發之HTML快速入門

ack enter 提示 其他 red tle 顯示圖片 val password 一、HTML 是什麽? HTML 指的是超文本標記語言 (Hyper Text Markup Language) HTML 不是一種編程語言,而是一種標記語言 (markup lan

一個開發小程序的嘗試

bubuko image 發現 pid 圖標 bsp order 。。 平臺 -----------------大佬勿噴 —— 這是個分割線---------------- 小程序都火了那麽久了,忽然有想法自己也嘗試做一個。 (ps: 繼開發公眾號未果、學習java未果、學