歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Ubuntu下編譯的第一個內核模塊

Ubuntu下編譯的第一個內核模塊

日期:2017/2/28 16:22:29   编辑:Linux教程

內核模塊是Linux內核向外部提供的一個插口,其全稱為動態可加載內核模塊(Loadable Kernel Module,LKM),我們簡稱為模塊。Linux內核之所以提供模塊機制,是因為它本身是一個單內核(monolithic kernel)。單內核的最大優點是效率高,因為所有的內容都集成在一起,但其缺點是可擴展性和可維護性相對較差,模塊機制就是為了彌補這一缺陷。

一、 什麼是模塊

模塊是具有獨立功能的程序,它可以被單獨編譯,但不能獨立運行。它在運行時被鏈接到內核作為內核的一部分在內核空間運行,這與運行在用戶空間的進程是不同的。模塊通常由一組函數和數據結構組成,用來實現一種文件系統、一個驅動程序或其他內核上層的功能。

應用程序與內核模塊的比較
為了加深對內核模塊的了解,表一給出應用程序與內核模塊程序的比較。
表一 應用程序與內核模塊程序的比較

從表一我們可以看出,內核模塊程序不能調用libc庫中的函數,它運行在內核空間,且只有超級用戶可以對其運行。另外,模塊程序必須通過module_init()和module-exit()函數來告訴內核“我來了”和“我走了”。

二、 編寫一個簡單的模塊

模塊和內核都在內核空間運行,模塊編程在一定意義上說就是內核編程。因為內核版本的每次變化,其中的某些函數名也會相應地發生變化,因此模塊編程與內核版本密切相關。以下例子針對Ubuntu 9.10 內核2.6.31-14-generic

1.程序舉例

#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
MODULE_LICENSE("GPL");
static int __init lkp_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
static void __exit lkp_cleanup(void)
{
printk(KERN_ALERT "Bye World!\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_AUTHOR("heyutao");
MODULE_DESCRIPTION("hello");

說明

所有模塊都要使用頭文件module.h,此文件必須包含進來。
頭文件kernel.h包含了常用的內核函數。
頭文件init.h包含了宏_init和_exit,它們允許釋放內核占用的內存。
lkp_init是模塊的初始化函數,它必需包含諸如要編譯的代碼、初始化數據結構等內容。
使用了printk()函數,該函數是由內核定義的,功能與C庫中的printf()類似,它把要打印的信息輸出到終端或系統日志。
lkp_cleanup是模塊的退出和清理函數。此處可以做所有終止該驅動程序時相關的清理工作。
module_init()和cleanup_exit()是模塊編程中最基本也是必須的兩個函數。
module_init()是驅動程序初始化的入口點。而cleanup_exit()注銷由模塊提供的所有功能。

Copyright © Linux教程網 All Rights Reserved