Linux内核模块编程
来源:互联网 发布:cn域名ns记录 编辑:程序博客网 时间:2024/04/30 22:18
1. 内核模块
通常我们说的内核模块全称是可加载内核模块(loadable kernel modules)。如果没有 内核模块的话,那么对Linux这种单内核系统而言,所有模块需要全部放在内存中,而且每次更改都需要重新编译,重新启动系统,有了它则避免了以上问题,可以在需要的时候加载内核中。
2. 内核模块基本结构
基本结构包括,头文件,模块信息,初始化及退出清理模块函数。
//hello world#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>/*模块信息*/MODULE_AUTHOR("newand");MODULE_LICENSE("GPL");MODULE_DESCRIPTION("Hello Module");/*初始化模块*/static int __init hello_init(void){//netfilter注册模块函数//nf_register_hook(&nf_out_modify);printk("<1>Hello World module init\n");return 0;}/*清理模块*/static void __exit hello_exit(void){//netfilter卸载模块函数//nf_unregister_hook(&nf_out_modify);printk("<1>Hello World module exit\n");}/*模块初始化入口*/module_init(hello_init);/*模块卸载时出口*/module_exit(hello_exit);
第2行:所有模块必须有,内核模块的标志
第3行:常用内核函数
第4行:头文件init.h包含了宏_init和_exit,它们允许释放内核占用的内存。
第7-9行:内核模块信息
第11-18行:加载内核模块时由第28行进入,调用此处init。
第20-25行:模块退出时进行的清理工作在这里调用处理。
3. makefile
#Makefile2.6 in ubuntuobj-m += hellomod.o # 产生hellomod 模块的目标文件CURRENT_PATH := $(shell pwd) #模块所在的当前路径LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL) #Linux内核源代码的绝对路径all:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了clean:make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理
4. 运行
运行主要涉及到四个命令
insmod:加载模块(root运行)
rmmod:卸载模块(root运行)
dmesg:查看内核信息(调试时,printk的信息会显示在此)
lsmod:显示所有已加载模块
5. Linux编程时常用命令
编程时需要查找某个函数,某个结构体,字符串等信息,除了搜索引擎外,还可以使用以下几个命令。
4.1 man 可以查看一些方法的使用
如:
~$ man printf
4.2 locate 可以定位到输入文件名的位置,它搜索一个系统每日更新的包含文件信息的数据库。
如:
~$ locate skbuff.c/home/***/文档/linux network program/src file/19/sip_skbuff.c/home/***/ns/nsc-0.5.3/linux-2.6/net/core/skbuff.c/home/***/ns/nsc-0.5.3/linux-2.6.18/net/core/skbuff.c
4.3 grep -n '查找字符串' 位置
如果想要查找某个字符串在哪些文件中出现过,可以用这个命令,比较方便。
如:
~$ grep -n 'NF_IP6_PRI_FIRST' /usr/include/linux/*/usr/include/linux/netfilter_ipv6.h:61:NF_IP6_PRI_FIRST = INT_MIN,
参考
[1] linux内核之旅,http://www.kerneltravel.net/?page_id=8
[2] http://en.wikipedia.org/wiki/Loadable_kernel_module
[3] Peter Jay Salzman ,Michael Burian ,Ori Pomerantz 《The Linux Kernel Module Programming Guide 》
注:[3]这本书值得看一下。
- Linux内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- linux内核模块编程
- Linux 内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- Linux内核模块编程
- LINUX内核模块编程
- linux内核模块编程
- linux内核模块编程
- Linux内核模块编程
- Linux 内核模块 编程
- Linux内核模块编程
- Linux 内核模块编程
- Linux 内核模块编程
- Linux内核模块编程
- linux内核模块编程
- Eclipse启动无响应 停留在Loading workbench状态
- 美文欣赏
- Ogrekit源码Windows平台编译_Android环境搭建
- Java的Properties配置文件用法 .
- enum的用法
- Linux内核模块编程
- GetCurrentDirectory()和GetModuleFileName()函数的区别
- OC NSLog 打印bool值
- 散列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- Android得到位图方式
- dede学习总结
- 队列解决队员分配问题
- Java的Properties配置文件用法【续】 .
- CFileFind