linux核心模組程式設計特點:
1>不能使用c庫和c標準標頭檔案
2>必須使用gnu規範
3.沒有記憶體保護機制
4.不能處理浮點運算
5.注意同步和併發的問題
6.注意可移植性
一,模組函式
(1)載入函式:
//將模組函式用關鍵字static修飾,避免和核心函式重名
//_init 把標記的函式放在elf檔案的特定**段,模組載入這些段的時候會單獨分配記憶體,這些函式被成功呼叫後,模組的引導程式會釋放這部分的記憶體空間。
static int _init ***(void)
(2)解除安裝函式:
static void _exit ***(void)
(3)使用module_init和module_exit修飾:告訴核心模組的載入函式和解除安裝函式
二,模組如何使用
模組的操作命令
insmod
載入模組,核心會執行模組載入函式
rmmod
解除安裝模組,核心會執行模組解除安裝函式
lsmod
檢視當前已載入的模組
modinfo
檢視模組資訊
modprobe
載入模組,核心會執行模組載入函式
modprobe和insmod的區別
modprobe需要模組資訊檔案的支援modules.dep,modprobe還會檢查模組的依賴,自動載入依賴的模組,insmod則沒有這些性質
modinfo也需要modules.dep的支援
模組許可證(gpl)
module_license("gpl v2");
如果不加,核心提示警告資訊,核心有些函式將無法使用
核心的輸出級別和printk的輸出級別
printk函式時具有列印級別,級別0-7,數字越小,級別越高
當printk的輸出級別小於核心的輸出級別時,printk列印的內容就可以被列印出來。否則printk的列印資訊將被忽略
核心也有預設的輸出級別
檢視核心的輸出級別
cat /proc/sys/kernel/printk
7 4 1 7
核心輸出級別為7
printk的預設級別為4
如何修改核心的預設輸出級別
方法1:
echo 5 > /proc/sys/kernel/printk
方法1無法修改在核心啟動時的輸出資訊
方法2:
通過uboot的環境變數bootargs傳遞列印級別的引數
set bootargs root=/dev/nfs init=/linuxrcnfsroot=192.168.1.141:/home/student/workdir/rootfsip=192.168.1.20:192.168.1.141:192.168.1.1:255.255.255.0::eth0:onconsole=ttysac0,115200 debug //級別為10
set bootargs root=/dev/nfs init=/linuxrc nfsroot=192.168.1.141:/home/student/workdir/rootfsip=192.168.1.20:192.168.1.141:192.168.1.1:255.255.255.0::eth0:onconsole=ttysac0,115200 quiet //級別為4
set bootargs root=/dev/nfs init=/linuxrcnfsroot=192.168.1.141:/home/student/workdir/rootfs ip=192.168.1.20:192.168.1.141:192.168.1.1:255.255.255.0::eth0:onconsole=ttysac0,115200 loglevel=6 //直接指定級別
三,核心模組引數
作用:在載入模組和載入模組後,能夠給模組傳遞相應的引數資訊
(1)引數格式:
module_param(name,type,perm)
module_param_array(name,type,nump,perm)
(2)檢視模組引數對應檔案的許可權
cat /sys/module/模組名/paramters/ 目錄下有對應的檔案
如果模組引數的許可權為0,在該目錄下就不會有對應的檔案
如果模組引數的許可權非0,在該目錄下有對應的同名檔案,同時該檔案的許可權和定義模組引數是提供的許可權相同
我們可以通過修改這些檔案的內容來實現對模組引數的修改
四,核心模組依賴
乙個模組使用了另乙個模組的變數或者函式,第乙個模組就依賴於第二個模組
如果乙個模組中的變數或者函式希望被別的模組使用,需要將對應的變數或者函式匯出。
(1)工作原理:
利用export_symbol巨集生產乙個特定的結構並放在elf檔案的乙個特定段中,核心啟動過程中,會將之前沒有分配位址的變數和函式(符號內心是u)提供乙個位址,並將這個位址填充到結構體中。模組載入時候,引導程式將去處理u符號,在特殊段中搜尋符號的名字(變數,函式等),如果找到了,則將獲得的位址填充在被載入模組的相應段中。=》確定符號的位址。
(2)模組的匯出符號
export_symbol
export_symbol_gpl
注:引用模組的變數和函式(匯出變數)時:使用extern
前乙個匯出的內容所有模組都能使用
後乙個匯出的內容只有遵循gpl協議的模組才能使用
所以模組程式設計是一定要新增
module_license("gpl v2");
核心模組和普通應用程式的差異對比:
(1) 核心模組是作業系統核心的一部分,執行在核心空間。而應用程式執行在使用者空間。
(2) 核心模組中的函式時被動呼叫的,應用程式是順序執行的。
(3) 核心模組處於c函式庫之下,所以不能夠呼叫c函式庫。
(4) 核心模組要做一些清除性的工作,比如在乙個操作失敗後或者在核心的清除函式中。而應用程式有些工作不需要做。
(5) 核心模組如果產生了非法訪問,將很有可能導致系統的崩潰,而應用程式通常只會影響到自己。
(6) pritk和peintf行為很相似,但是printk不支援浮點數。
嵌入式核心製作
一.核心簡介 1.系統架構 1 linux是由使用者空間和核心空間構成的 2 使用者空間主要是使用者應用程式以及一些c庫檔案,配置檔案。一般是看得見的。3 核心空間主要是系統呼叫介面,狹義上的核心,處理器架構相關的 4 劃分兩個空間的理由 處理器有不同的工作模式,不同的模式許可權不一樣,可以執行的指...
嵌入式 Linux核心模組開發入門示例
what?linux核心的整體結構非常龐大,其包含的元件也非常多,如何使用需要的元件呢?把所有元件都編譯進核心檔案,即 zlmage或bzlmage,但這樣會導致兩個問題 一是生成的核心檔案過大 二是如果要新增或刪除某個元件,需要重新編譯整個核心。模組功能 有沒有一種機制能讓核心檔案 zlmage或...
嵌入式核心初學習
要學習arm linux核心,得先移植到開發板上去執行了,才有興趣進行下一步的研究。人就是這樣,沒先看到現象就不太願意去詳細學習。一 接下來就得移植arm linux核心到開發板,移植過程一般有三種方式 1 直接在解壓後的核心資料夾 linux不是這樣叫的,我為了好理解 中,使用 make menu...