Linux內核模塊
proc文件系統
文件系統內核?Linux內核模塊
§? 內核模塊是內核的擴展,它供了在內核運
行過程中動態加載的特性.
內核 獲取進程句柄、§? 模塊被加載進系統后,就在內核態下運行了,
成了內核的一部分,可以讀寫內核數據結構.
§? 內核模塊通常用來實現設備驅動程序.
Linux的內核。模塊的工作原理
§? 模塊運行Linux內核空間
§? 內核符號表保存了內核導出一些符號(APIs和全
centos7內核列表,局變量)
§? 內核動態的加載模塊,模塊導出的所有符號成為
內核符號表的一部分
linux系統內核版本?§? 模塊可以使用導出的符號
§? /proc/kallsyms 記錄了所有的符號
EXPORT_SYMBOL(name)
內核模塊編譯?EXPORT_SYMBOL_GPL(name)
Hello World例子(2.6 內核模塊)
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
模塊初始化和釋放
§? 模塊的初始化函數負責注冊模塊所供的
任何設施.
§? module_init在模塊的目標代碼中增加一個
特殊的段,用于說明內核初始化函數所在的
位置
static int __init initialization_func(void)
{
/*初始化代碼*/
}
module_init(initialization_func);
§? 清除函數,該函數在模塊被移除前注銷接口并向系
統返回所有資源
§? module_exit 幫助內核找到模塊的清除函數,如
果一個模塊未定義清除函數,內核就不允許卸載該
模塊
§? 宏 __init 和 __exit可以使函數在運行完成后自動
回收內存
static void __exit cleanup_func(void)
{
/*這里是清除代碼*/
}
module_exit(cleanup_func)
編譯模塊(2.6 內核)
§? 必須使用Makefile
§? Makefile文件
obj-m := hello.o
§? 編譯命令
make –C ~/kernel-2.6 M=`pwd` modules
§? obj-m := Module.o表示編譯后生成Module.ko模塊
§? -C 內核源碼路徑 M= 外部模塊 `pwd`該模塊文件
所在路徑
命令
§? insmod 加載模塊
§? rmmod 卸載模塊
§? lsmod 列出當前系統所有已加載模塊
§? modinfo 查看模塊信息
§? dmesg 查看內核系統日志
模塊相關宏
§? 模塊參數
module_param(變量名稱,類型,sysfs入口項訪
問許可掩碼)
§? 參數值在insmod裝載模塊時賦值
§? 模塊說明相關宏
?? MODULE_LICENSE() 說明代碼許可類型
?? MODULE_DESCRIPTION() 模塊述
?? MODULE_AUTHOR() 作者
?? MODULE_VERSION()模塊版本
內存操作
§? 內核空間與用戶空間
§? 內核空間與用戶空間的數據交換
get/put_user(x, ptr)
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态