從第二章開始要涉及到程式設計的內容,本章主要以模組程式設計和核心程式設計,我們將構造乙個簡單的模組。
hello world:hello world 是我們接觸程式設計最為簡單的程式,我們講述的是核心模組程式設計而不是應用程式程式設計,下面給大家看乙個完整的模組**。
#include
#include
module_license(「dual bsd/gpl」);
static int hello_init(void)
static void hello_exit(void)
module_init(hello_init);
module_exit(hello_exit);
上面就是乙個完整的helloworld模組,其中乙個模組(hello_init)被裝載核心是呼叫,而另乙個(hello_exit)則在模組被移除是呼叫。第三行特殊巨集用來告訴核心,該模組採用自由許可證,如果沒有這個宣告,核心在裝載該模組的時候可能會產生警告,函式printk是在核心中定義的,功能和printf類似,因為核心需要單獨的函式列印。kern_alert定義了這句話的優先順序。(如果是在虛擬機器中執行的話,當你使用insmod裝載的話可能會看不到輸出的helloworld,但是lsmod的時候會看到已經裝載的hello模組,rmmod解除安裝),乙個驅動函式一定要經過,裝載解除安裝。我們編譯helloworld的時候要使用makefile,makefile檔案如下:
obj-m := hello.o
kerneldr := /usr/src/linux-2.6.26
pwd := $(shell pwd)
modules:
$(make) -c (ke
rnel
dr)m
=(kerneldr) m=
(kerne
ldr)
m=(pwd) modules
moduels_install:
$(make) -c (ke
rnel
dr)m
=(kerneldr) m=
(kerne
ldr)
m=(pwd) modules_install
然後通過在你編譯的資料夾中make一下如果沒錯的話,會生成乙個.ko的檔案,我們使用insmod ./hello.ko 就可以裝載hello模組,使用rmmod解除安裝。
3. 核心模組與應用程式的對比:模組初始化,模組解除安裝。當你使用時候載入初始化,使用完畢進行解除安裝,而應用程式不需要管資源的釋放或者其他清除工作,而模組的退出函式必須自己撤銷初始化函式所做的一切。
4. 使用者空間和核心空間:模組是執行在核心空間內,而應用程式執行在所謂的使用者空間內。os需要對核心空間進行保護,以防止應用程式可以操作核心從而發生錯誤,就像linux中的root使用者和普通使用者的區別。
5. 核心中的併發處理:核心程式設計區別於常見應用程式程式設計的地方在於對併發的處理。先解釋一下什麼是併發:在作業系統中,是指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機上執行,但任乙個時刻點上只有乙個程式在處理機上執行。應用程式一般都按順序有序的進行執行,而我們在核心**中必須考慮到併發。在同一時刻,可能有很多裝置在執行著我們的驅動。所以linux核心**包括驅動程式**,必須是可重入的,就是必須能夠同時執行在多個上下文中。所以我們在程式設計的時候一定要注意併發的問題。
6. 細節問題:應用程式在虛擬記憶體中布局,並且具有一塊很大的棧空間,棧是用來儲存函式呼叫歷史以及活動函式中的自動變數的。核心中並沒有很大的棧空間留給我們使用,所以在我們程式設計的時候需要謹慎。
7. 編譯,裝載和解除安裝模組:上面說過我們使用驅動程式的時候必須先編譯,然後裝載,解除安裝。下面我會給大家詳細介紹模組在核心中是如何編譯的,如何裝載與解除安裝的。首先我們要考慮到針對不同的核心版本,我們可能在程式設計時候略有不同。在構造核心模組之前,有一些必要的條件,我們應該有正確的編譯器、模組工具和一些必要的工具。採用makefile對我們編寫的檔案進行編譯,編譯成功後會生成.ko的核心模組檔案,該檔案的意義就是把核心的一些功能移動到核心外邊, 需要的時候插入核心,不需要時解除安裝。在編譯完成後,下一步就是將模組裝載到核心中,我們使用insmod命令將所編譯好的模組載入到核心中,採用rmmod解除安裝模組。
LDD3讀書筆記(第3章 字元驅動)
include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取主次編號的巨集.dev t mkdev unsigned int major,unsigned int minor 從主次編號來建立...
LDD3讀書筆記(第5章 記憶體分配)
include void kmalloc size t size,int flags 記憶體分配函式 後備快取記憶體 include kmem cache t kmem cache create const char name,size t size,size t offset,unsigned l...
LDD3 讀書筆記 之 第 3 章 字元驅動
本章介紹了下面符號和標頭檔案.struct file operations 和 struct file 中的成員的列表這裡不重複了.include dev t dev t 是用來在核心裡代表裝置號的型別.int major dev t dev int minor dev t dev 從裝置編號中抽取...