編寫linux模組(由淺入深)

2021-06-29 02:48:52 字數 1838 閱讀 7955

在編譯核心時確保開啟載入模組支援。

loadable module support --->

[*] enable loadable module support

[*] module unloading

[ ] module versioning support (experimental)

[*] automatic kernel module loading

勾選如上選項,重新編譯安裝核心。

首先確保執行的核心和源**版本一致。

進入linux原始碼目錄drivers/misc/,建立檔案mymodule.c, **如下

#include #include #include static int __init mymodule_init(void)

static void __exit mymodule_exit(void)

module_init(mymodule_init);

module_exit(mymodule_exit);

module_license("gpl");

然後在同乙個目錄下的makefile檔案追加一行

obj-m += mymodule.o

編譯

make -c subdirs=$pwd modules

載入

insmod ./mymodule.ko
成功會列印出 hello module! 移除

rmmod mymodule

現在來用模組做一些有意思的事。

有乙個關鍵是模組只能訪問核心匯出的函式和變數。示例如下:

在核心kernel/prink/printk.c中新增全域性變數

int my_variable = 0;
重新編譯並重啟核心

在mymodule_init中新增如下**:

extern int my_variable;

printk ("my_variable is %d\n", my_variable);

my_variable++;

重現編譯並載入模組

這次出現了錯誤資訊      insmod: error inserting './mymodule.ko': -1 unknown symbol in module
它的意思是核心不允許模組訪問變數, 當模組載入的時,它查詢函式和變數的外部引用,my_variable變數一定是在核心中,只是沒有找到。

在prinkf.c my_variable下新增匯出符號**

export_symbol(my_variable);
問題解決。

載入模組

my_variable is 0

hello module!

# rmmod mymodule && insmod ./mymodule.ko
列印:

unloading my module.

my_variable is 1

hello module!

模組可以訪問核心中匯出的函式和方法,許可權很高。建議在虛擬機器裡測試編寫**,因為一不小心系統就崩了。

# insmod module.ko [param1=value param2=value ...]

未完成

linux核心模組的編寫

之前學了核心模組的編寫,但是沒有動手實驗,這次試驗才發現還是有好動東西需要學習!我的環境是虛擬機器跑centos 7 1.首先編寫模組 include include module license dual bsd gpl static int hello init void static void...

lua模組編寫

lua允許我們編寫自定義模組以便後面呼叫,在編寫模組之前我們先認識2個知識點 1.lua語言中陣列,模組其實都是table 2.在之前的lua基本語法裡我們知道函式是可以賦值給變數的 好,我們新建乙個檔案my.lua 如下 local my my.name 滄浪水 my.url www.freecl...

Python Jupyter 編寫模組

1.在jupyter notebook新建乙個python檔案 2.在檔案裡定義乙個名為say hi的函式,並且將檔案重新命名為mymodule1 3.儲存之後可看到當前資料夾多了乙個mymodule1.ipynb 4.開啟mymodule1.ipynb檔案,選擇file download as p...