載入和解除安裝核心模組
Linux核心模組可以根據需要載入到核心或從核心中解除安裝。這可以在不重新編譯核心或重啟系統的情況下完成,並且可以增強系統的功能。
如果沒有核心模組,作業系統將不得不把所有預期的功能都包含在基本核心中。這會導致記憶體浪費,因為大多數這些系統不會經常使用。此外,使用者每次需要新功能時都需要重新構建和重啟基本核心。
核心模組具有.ko副檔名,它們通常位於標準Linux系統中的/lib/modules//kernel/目錄中。
Linux核心模組中的主要模組包括:檔案系統驅動程式、裝置驅動程式和系統呼叫。
要將模組插入核心,請使用insmod命令。該命令的語法如下:
insmod <module_name>.ko
要從核心中刪除模組,請使用rmmod命令。正在被程式使用的模組無法刪除。rmmod命令的語法如下:
rmmod <module_name>.ko
可以使用lsmod命令檢視新建立的模組。此命令顯示當前載入到系統中的可載入核心模組,如下所示:
建立和載入核心模組
建立核心模組的步驟如下:
讓我們首先編寫一個**example.c**程式:
首先,新增標頭檔案:
#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h>
接下來,新增模組的描述和作者詳細資訊。不要忘記新增許可證:
MODULE_DESCRIPTION("Kernel module 1");
MODULE_AUTHOR("Harry");
MODULE_LICENSE("GPL");現在讓我們看看如何建立一個核心模組:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_DESCRIPTION("Kernel module 1 ");
MODULE_AUTHOR("Harry");
MODULE_LICENSE("GPL");
static int example_init(void)
{
pr_debug("Welcome! Good to have you here!
");
return 0;
}
static void example_exit(void)
{
pr_debug("Goodbye!
");
}
module_init(example_init);
module_exit(example_exit);上述程式中生成的日誌資訊不會顯示在控制檯中,而是儲存在專門預留的記憶體區域中。日誌守護程式 (syslog) 可以從該記憶體區域中恢復這些資訊。
現在讓我們看看如何編譯我們的核心模組:
標準編譯方法是kbuild。它使用兩個檔案:Makefile和Kbuild檔案進行編譯過程。Kbuild是Linux核心構建系統。
對於Makefile:
KDIR = home/dept/so2/linux kbuild: make -C $(KDIR) M=`pwd` clean: make -C $(KDIR) M=`pwd` clean
如上例所示,在Makefile檔案中呼叫make會導致在核心原始碼目錄(即home/employee/so2/linux)中呼叫make,並引用當前目錄(即M = `pwd`)。這個過程最終會導致讀取當前目錄中的Kbuild檔案,並按照該檔案中指示的指令編譯模組。
現在編譯模組:
EXTRA_CFLAGS = -Wall -g obj-m = example.o
插入模組:
insmod example.ko
現在,可以使用lsmod命令檢視新建立的模組。lsmod命令顯示當前載入的可載入核心模組。
$lsmod demo glue_helper ssdhci_acpi sdhci_cpi ahci
可以使用dmesg命令檢視上述輸出。此命令用於寫入Linux中的核心訊息。
$dmesg | tail -2 Welcome! Good to have you here! Goodbye!
構建模組後,將建立以下檔案:
- example.o - 這是連結前的模組目標檔案
- example.mod.c - 此檔案包含模組資訊
- example.mod.o - 這是編譯和連結example.mod.c後建立的檔案
- modules.order - 這指定了兩個或三個模組的連結順序
- modules.symvers - 如果存在任何符號版本,則指定這些符號版本。
- example.ko - 這是連結example.o和example.mod.o後建立的模組核心目標檔案
現在讓我們回顧一下上面我們看到的內容。
載入核心模組
要載入核心模組,可以使用insmod命令:
$insmod example.ko
現在,讓我們顯示模組的內容:
dmesg命令用於顯示核心訊息。
# dmesg | tail -2 Welcome! Good to have you here! Goodbye!
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP