1. 程式人生 > >Linux裝置驅動初探_多原始檔Makefile

Linux裝置驅動初探_多原始檔Makefile

首先介紹一下__init這個標誌在驅動原始檔中的作用吧。

核心中帶“__”的函式:核心API函式具有這種名稱的,通常都是一些介面的底層函式,應該謹慎使用。實質上,這裡的雙下劃線就是要告訴程式設計師:謹慎呼叫,否則後果自負。以__init為例,__init表明該函式僅在初始化期間使用。在模組被裝載之後,模組裝載器就會將初始化函式扔掉,這樣可以將函式佔用的記憶體釋放出來,已做它用。注意,不要在結束初始化之後仍要使用的函式(或者資料結構)上使用__init、__initdata標記。這裡摘抄網上的一段總結,如下。

__init, __initdata等屬性標誌,是要把這種屬性的程式碼放入目標檔案的.init.text節,資料放入.init.data節──這一過程是通過編譯核心時為相關目標平臺提供了xxx.lds連結指令碼來指導ld完成的。
   對編譯成module的程式碼和資料來說,當模組載入時,__init屬性的函式就被執行;
   對靜態編入核心的程式碼和資料來說,當核心引導時,do_basic_setup()函式呼叫do_initcalls()函式,後者負責所有.init節函式的執行。
   在初始化完成後,用這些關鍵字標識的函式或資料所佔的記憶體會被釋放掉。
1) 所有標識為__init的函式在連結的時候都放在.init.text這個區段內,在這個區段中,函式的擺放順序是和連結的順序有關的,是不確定的。 
2) 所有的__init函式在區段.initcall.init中還儲存了一份函式指標,在初始化時核心會通過這些函式指標呼叫這些__init函式指標,並在整個初始化完成後,釋放整個init區段(包括.init.text,.initcall.init等),注意,這些函式在核心初始化過程中的呼叫順序只和這裡的函式指標的順序有關,和1)中所述的這些函式本身在.init.text區段中的順序無關。 

接下來說明一下如果有多個原始檔來編譯連結組成最終的驅動.ko檔案,那麼他們的Makefile該如何書寫。

核心模組的編譯與應用程式的編譯有些區別,此hello world模組的編譯命令為:

make -C /xxx/xxx/kernel_src/ M=$(PWD) modules

其中/xxx/xxx/kernel_src/ 為已經配置編譯過的核心原始碼路徑,ubuntu下一般在/lib/modules/$(shell uname -r)/build目錄下。

在編寫應用程式時,我們一般都是由多個原始檔組成的,這個時候編譯肯定就不能繼續使用命令列編譯了,就要使用到Makefile。同樣,驅動模組的編譯也需要使用的makefile,下面就是一個在編譯含有多個原始碼檔案的驅動模組時可以參考的Makefile檔案。

在編寫應用程式時,我們一般都是由多個原始檔組成的,這個時候編譯肯定就不能繼續使用命令列編譯了,就要使用到Makefile。同樣,驅動模組的編譯也需要使用的makefile,下面就是一個在編譯含有多個原始碼檔案的驅動模組時可以參考的Makefile檔案。


  1. ifndef CROSS_COMPILE  
  2. export CROSS_COMPILE ?=arm-none-linux-gnueabi-  
  3. endif  
  4. ARCH ?= arm  
  5. SRC_DIR := /home/XXX/XXX  
  6. OBJ_DIR  := $(SRC_DIR)/obj  
  7. PWD := $(shell pwd)  
  8. LINUX_SRC ?= /home/XXX/kernel  
  9. CFG_INC = -I$(SRC_DIR) \  
  10.     -I$(DIR_A) \  
  11.     -I$(DIR_B)  
  12. CFG_FLAGS += -O2  
  13. EXTRA_CFLAGS  += $(C_FLAGS) $(CFG_INC) $(CFG_INC)  
  14. obj-m := mymodule.o  
  15. mymodule-objs := a.o  
  16. mymodule-objs += b.o  
  17. mymodule-objs += c.o  
  18. modules:  
  19.     @make ARCH=$(ARCH) -C $(LINUX_SRC) M=$(PWD) modules  
  20. clean:  
  21.     @echo "cleaning..."  
  22.     rm -f mymodule.ko mymodule.o mymodule.mod.* modules.order Module.symvers  
  23.     rm -f $(mymodule-objs)  

相關推薦

Linux裝置驅動初探_原始檔Makefile

首先介紹一下__init這個標誌在驅動原始檔中的作用吧。 核心中帶“__”的函式:核心API函式具有這種名稱的,通常都是一些介面的底層函式,應該謹慎使用。實質上,這裡的雙下劃線就是要告訴程式設計師:謹慎呼叫,否則後果自負。以__init為例,__init表明該函式僅在初

Ioctl命令組成、阻塞IO實現、IO路複用 >>Linux裝置驅動程式

我又來了,一天學習一點點,一天成長一點點就會很開心的說! 今天的狀態很好,況且還有好喝的咖啡陪伴著我,元氣滿滿喲!^. ^? 文章目錄 [0x100]內容概述 [0x200] 編寫ioctl的命令編號 [0x210]命令編號組成

linux裝置驅動makefile入門解析

以下內容僅作參考,能力有限,如有錯誤還請糾正。 對於一個普通的linux裝置驅動模組,以下是一個經典的makefile程式碼,使用下面這個makefile可以 完成大部分驅動的編譯,使用時只需要修改一下要編譯生成的驅動名稱即可。只需修改obj-m的值。 ifneq ($(K

[ARM-LInux開發]linux裝置驅動makefile入門解析

以下內容僅作參考,能力有限,如有錯誤還請糾正。對於一個普通的linux裝置驅動模組,以下是一個經典的makefile程式碼,使用下面這個makefile可以完成大部分驅動的編譯,使用時只需要修改一下要編譯生成的驅動名稱即可。只需修改obj-m的值。ifneq ($(KERN

linux裝置驅動程式中的阻塞、IO路複用與非同步通知機制

一、阻塞與非阻塞 阻塞與非阻塞是裝置訪問的兩種方式。在寫阻塞與非阻塞的驅動程式時,經常用到等待佇列。 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,函式只有在得到結果之後才會返回。 非阻塞指不能立刻得到結果之前,該函式不會阻塞當前程序,而會立刻返回。 函式是否處於阻

linux裝置驅動開發學習--記憶體和IO訪問

一 I/O 埠 1. 讀寫位元組埠(8 位寬) unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); 2. 讀寫字埠(16 位寬) unsigned inw(unsigne

linux裝置驅動模型 - regmap

1. regmap介紹 regmap主要是為了方便操作暫存器而設計的,它將所有模組的暫存器(包括soc上模組的暫存器和外圍裝置的暫存器等) 抽象出來,用一套統一介面來操作暫存器 比如,如果要操作i2c裝置的暫存器,那麼就要呼叫i2c_transfer介面,要操作spi裝置的暫存

linux裝置驅動模型 - device/bus/driver

在linux驅動模型中,為了便於管理各種裝置,我們把不同裝置分別掛在他們對應的總線上,裝置對應的驅動程式也在總線上找,這樣就提出了deivce-bus-driver的模型,硬體上有許多裝置匯流排,那麼我們就在裝置模型上抽象出bus概念,相應的device就代表裝置,driver表示驅動,

linux裝置驅動模型 - sys/kobject

1. sysfs 1.1 sysfs檔案系統註冊 在系統啟動時會註冊sysfs檔案系統 (fs/sysfs/mount.c) int __init sysfs_init(void) { int err; sysfs_root = kernfs_creat

linux裝置驅動模型 - 驅動框架

linux驅動模型框架如圖所示: 1. kernfs 驅動最終是提供給使用者層使用,那麼其中的介面就是通過kernfs檔案系統來註冊,kernfs是一個通用的核心虛擬檔案系統 2. sysfs/kobject sysfs是裝置驅動檔案系統,裝置之間的各種關係會在在/

linux裝置驅動(3)I2C驅動

i2c驅動程式的核心是建立i2c_driver結構體 /* This is the driver that will be inserted */ static struct i2c_driver at24cxx_driver = { .driver = { .name

linux裝置驅動開發》,基於最新的linux 4.0核心-----筆記

第二章 Linux 的核心結構及構建 ---->這一章是自己總結的 1、核心結構(主要是下面這幾個部分) 系統呼叫介面<–>System call interface 程序管理<------>Process manag

linux裝置驅動 按鍵幾種寫法總結

對於基礎按鍵的驅動,有如下幾種寫法: (1)查詢 所謂查詢方法,主要描述應用程式會在while(1)裡面一直read,如果沒有資料會導致阻塞,佔用CPU;這種方法是最差的。   (2)中斷 中斷配合休眠會避免查詢法佔用CPU的缺點。 應用程式和查詢法沒有什麼區別, 但是驅動裡面的read

linux 裝置驅動 nand驅動框架

nand 裝置驅動(一)架構 使用mini2440 - nand 1. nand硬體 1.1 資源 LDATD0~7資料線和地址線是複用的,都是8位 既可以傳輸資料(命令或者資料), 也可以傳送地址訊號 訊號說明: CLE: 命令鎖存, 高表示cmd ALE: 地址鎖存, 高表示地址

linux裝置驅動載入的先後順序

                        &

嵌入式Linux開發——(十七)Linux裝置驅動開發

一、字元裝置驅動程式 1)應用程式、庫、核心、驅動程式的關係 2)Linux驅動程式的分類和開發步驟     ①Linux的外設可分為3類:字元裝置(character device)、塊裝置(block device)、網路介面(network interfa

linux裝置驅動模型之Kobject、kobj_type、kset

一、sysfs檔案系統簡介: 1、sysfs概述 sysfs檔案系統是核心物件(kobject)、屬性(kobj_type)、及它們相互關係的一種表現。 sysfs非常重要的特徵:使用者可以從sysfs中讀出核心資料,也可以將使用者資料寫入核心。 2、核心結構與sysfs對應關係:

linux裝置驅動原理與本質

任何計算機系統都是軟體和硬體的結合體,如果只有硬體而沒有軟體,則硬體是沒有靈魂的軀殼;如果只有軟體沒有硬體,則軟體就是一堆無用的字元。在底層硬體的基礎上,作業系統覆蓋一層驅動,遮蔽底層硬體的操作,通過特定的軟體介面去操作底層硬體,使用者在使用者空間可以很容易的把軟體設計目標放在策略與需求上,可以很方

淺談裝置驅動的作用與本質,有無作業系統Linux裝置驅動的區別

  一、驅動的作用 任何一個計算機系統的執行都是系統中軟硬體協作的結果,沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則只是一堆廢鐵。硬體是底層基礎,是所有軟體得以執行的平臺,程式碼最終會落實為硬體上的組合邏輯與時序邏輯;軟體則實現了具體應用,它按照各種不同的業務需求而設計,滿足了使用

Linux裝置驅動開發詳解 第3版 (即 Linux裝置驅動開發詳解 基於最新的Linux 4 0核心 )進展同步更

                本博實時更新《Linux裝置驅動開發詳解(第3版)》的最新進展。 目前已經完成稿件。 2015