載入和解除安裝核心模組


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!

更新於:2020年6月22日

734 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.