目錄
一、設(shè)備類型
二、模塊
構(gòu)建模塊
安裝模塊
載入模塊
一、設(shè)備類型
在 Linux 以及 Unix 系統(tǒng)中,設(shè)備被分為以下三種類型:
- 塊設(shè)備(blkdev):以塊為尋址單位,塊的大小隨設(shè)備的不同而變化;塊設(shè)備通常支持重定位(seeking)操作,也就是對數(shù)據(jù)的隨機訪問。如硬盤、藍(lán)光光碟和 Flash 這樣的存儲設(shè)備都是塊設(shè)備。塊設(shè)備是通過稱為 ”塊設(shè)備節(jié)點“ 的特殊文件來訪問的,并且通常被掛載為文件系統(tǒng)。
- 字符設(shè)備(cdev):不可尋址,只提供數(shù)據(jù)的流式訪問,即一個一個字符或字節(jié)地訪問。如鍵盤、鼠標(biāo)和打印機等都是字符設(shè)備。字符設(shè)備是通過稱為 ”字符設(shè)備節(jié)點“ 的特殊文件來訪問的,與塊設(shè)備不同,應(yīng)用程序通過直接訪問設(shè)備節(jié)點與字符設(shè)備交互。
- 網(wǎng)絡(luò)設(shè)備:有時也被稱為以太網(wǎng)設(shè)備(ethernet devices),提供了對網(wǎng)絡(luò)的訪問,這是通過一個物理適配器和一種特定的協(xié)議進(jìn)行的。它不是通過設(shè)備節(jié)點來訪問,而是通過套接字 API 這樣的特殊接口來訪問。
并不是所有設(shè)備驅(qū)動都表示物理設(shè)備。有些設(shè)備驅(qū)動是虛擬的,僅僅提供訪問內(nèi)核功能而已。這種設(shè)備被稱為 ”偽設(shè)備“ (pseudo device),如內(nèi)核隨機數(shù)發(fā)生器(/dev/random)、空設(shè)備(/dev/null)等。
二、模塊
盡管 Linux 是 ”單塊內(nèi)核“(monolithic)的操作系統(tǒng),但 Linux 內(nèi)核時模塊化組成的,它允許內(nèi)核在運行時動態(tài)地向其中安裝或卸載一個模塊。
下面編寫一個 Hello,World!的模塊程序:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/* 初始化函數(shù),當(dāng)模塊裝載時被調(diào)用 */
static int hello_init(void)
{
printk(KERN_ALERT "Module installed!\n");
return 0;
}
/* 退出函數(shù),當(dāng)模塊卸載時調(diào)用 */
static void hello_exit(void)
{
printk(KERN_ALERT "Module removed!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
這是一個非常非常簡單的內(nèi)核模塊程序,hello_init() 是模塊的入口點,它通過 module_init() 例程注冊到系統(tǒng)中,在內(nèi)核裝載時調(diào)用。這個 init 函數(shù)僅僅打印了一行簡單的信息,但在實際的模塊中,該函數(shù)還會注冊資源、初始化硬件、分配數(shù)據(jù)結(jié)構(gòu)等。而 hello_exit() 函數(shù)負(fù)責(zé)對 init 函數(shù)以及在模塊生命周期過程中所作的一切事情進(jìn)行撤銷與清理工作。
構(gòu)建模塊
下面開始構(gòu)建模塊。有兩種方法來構(gòu)建模塊:
第一種是放在內(nèi)核源代碼樹中。這樣構(gòu)建的模塊會正式成為 Linux 內(nèi)核中的一部分,設(shè)備驅(qū)動程序存放在內(nèi)核源碼樹根目錄下的 /drivers 的子目錄下,根據(jù)不同的設(shè)備類型,字符設(shè)備存放于 /drivers/char,塊設(shè)備存放于 /drivers/block 等。
假如我們編寫的模塊類型是字符設(shè)備,那就把模塊文件移動到?/drivers/char 目錄下,然后往?/drivers/char 目錄下的 Makefile 文件中添加一行:
obj-m += hello.o
然后編譯內(nèi)核,重新裝載內(nèi)核即可。
第二種是放在內(nèi)核代碼外。將 hello.c 放到 /drivers/char 目錄下后,在內(nèi)核代碼外創(chuàng)建一個 Makefile 文件,內(nèi)容如下:
# -C 后為你的內(nèi)核源碼樹所在位置
# make -C /root/linux_kernel_learning/linux-2.6 modules
obj-m += hello.o
然后執(zhí)行如下指令來構(gòu)建模塊:?
make -C /root/linux_kernel_learning/linux-2.6 SUBDIRS=$PWD modules
安裝模塊
編譯后模塊將被裝入到目錄 /lib/modules/<version>/kernel/drivers/char?下:
下面的構(gòu)建命令用來安裝編譯的模塊(在內(nèi)核源碼樹目錄下執(zhí)行):
make modules_install
載入模塊
載入一個模塊:文章來源:http://www.zghlxwxcb.cn/news/detail-681870.html
insmod hello.ko
卸載一個模塊:文章來源地址http://www.zghlxwxcb.cn/news/detail-681870.html
rmmod hello.ko
到了這里,關(guān)于Linux內(nèi)核學(xué)習(xí)(十三)—— 設(shè)備與模塊(基于Linux 2.6內(nèi)核)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!