一、linux核心簡介
1.linux系統由兩部分組成:核心空間和使用者空間。
2.使用者空間包括:使用者應用程式和C庫
3.核心空間包括:系統調用介面、核心和體繫結構相關代碼。
4.ARM處理器7種工作模式:使用者模式,快速中斷模式、外部中斷模式、管理員模式、資料訪問終止、系統模式、未定義指令異常
5.為什麼linux系統劃分為使用者空間和核心空間?
出於安全的考慮,linux利用處理器的分級的工作模式的特點,使用其中兩級分別運行核心和應用程式。使作業系統得到充分保護。
6.系統調用和硬體中斷:使程式執行在核心空間和使用者空間兩個狀態切換。
7.Linux核心結構(組成):
系統調用介面:串連核心空間與使用者空間
進程管理:進程建立、進程通訊、進程調度
記憶體管理:記憶體配置回收、地址轉換(虛-物理)
體繫結構相關代碼:CPU相關代碼
裝置驅動:
網路通訊協定棧:
虛擬檔案系統:
二、核心原始碼
arch:architecture縮寫。體繫結構相關代碼。
block:部分塊裝置驅動。
crypto:加密。
drivers:裝置驅動
fs:檔案系統
include:核心需要的標頭檔
lib:庫檔案
mm:記憶體管理代碼(與體繫結構無關的)
三、核心配置與編譯
1.清除臨時檔案、中間檔案、設定檔
make clean:刪除大部分中間產生的檔案儲存設定檔.o
make mrproper:刪除中間檔案及設定檔
make distclean:在mrproper基礎上刪除補丁、編輯器備份等。
2.配置核心
make config:基於文字模式的互動式配置
make menuconfig:基於文字模式的菜單型配置(菜單由核心內scripts產生)
make oldconfig:使用已有的設定檔(.config)
make xconfig:圖形化配置
3.如何配置
Arch/$cpu/configs目錄下有供參考的設定檔。可以在此基礎上修改,進行配置。
4.編譯核心
x86:
make zImage:x86下只能用於小於512k的核心。
make bzImage。
如需擷取詳細編譯資訊,後面添加V=1,如
make zImage V=1
5.編譯核心模組:(必須先編譯核心)
make modules
6.安裝核心模組:
make modules_install
四、Linux核心模組開發
1.什麼是核心模組(特點)
模組本身不被編譯進核心
可以根據需求,在核心運行期間動態安裝或卸載
2.核心模組程式
模組載入函數(必須):通過module_init宏指定。
模組卸載函數(必須):通過module_exit宏指定。
3.核心模組編譯
通過makefile
單個檔案的
ifneq ($(KERNELRELEASE),)obj-m := hello.oelseKDIR :=/lib/modules/2.6.18-53.e15/build //核心原始碼的路徑all: make -C $(KDIR) M=$(PWD) modules //進入-C後面的目錄,使用其makefile編譯;核心模組代碼的位置,PWD=目前的目錄clean: rm -f *.ko *.o *.mod.o *.mod.c *.symversendif
多個檔案的
ifneq ($(KERNELRELEASE),)obj-m := hello.o //內科模組的名字hello-objs := main.o add.o //核心模組需要的源檔案elseKDIR :=/lib/modules/2.6.18-53.e15/build //核心原始碼的路徑all: make -C $(KDIR) M=$(PWD) modules //進入-C後面的目錄,使用其makefile編譯;核心模組代碼的位置,PWD=目前的目錄clean: rm -f *.ko *.o *.mod.o *.mod.c *.symversendif
4.核心模組的安裝與卸載
insmod 載入
rmmod 卸載
lsmod 查看
modprobe 載入:會查看依賴的模組,並首先載入
5.模組可選資訊
許可證聲明:MODULE_LICENSE("GPL")
作者聲明:MODULE_AUTHOR
………………
模組參數:module_param指定模組參數,用於在載入模組是傳遞參數給模組。
module_param(name,type,perm)
name:模組參數的名稱
type:參數的類型 bool,int,charp
perm:模組參數的存取權限 S_IRUGO :任何使用者都有讀許可權 S_IWUSR
int a=3;char *st;module_param(a,int,S_IRUGO);module_param(st,charp,S_IRUGO);
6.核心符號匯出
EXPORT_SYMBOL(符號名)
EXPORT_SYMBOL_GPL(符號名):只能用於包含GPL許可證的模組。
7.核心版本不匹配問題
核心模組的版本由所依賴的核心代碼版本決定。
當前正在啟動並執行核心的版本。
insmod程式在這兩個版本不同時,會出現錯誤。
解決辦法:
(1)使用modprobe --force-modversion強行載入
(2)確保相同,uname -r可以查看當前啟動並執行核心版本。