核心模組嵌入式

2021-08-19 14:01:47 字數 3241 閱讀 6949

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...