公 告

欢迎各位网友添加友情链接,在您添加本博客:http://linux0818.blogspot.com/ 做为链接后, E-mail:linux0818@gmail.com给我,我将将您的网址添加到本博客。

2008年10月14日星期二

添加一个自己的模块到linux内核中

如何将自己写的程序编译能模块,然后加载到linux内核中,有两种方法,步骤如下:
方法一:         //属于临时加载
1. 在你的程序目录下写好C代码, 命名为 My_mod.c 下面是个简单的例子:
/***********************************************************************************************/
#include <linux/module.h>    //写驱动等可参照linux源代码中的相应的驱动程序
#include <linux/kernel.h>
MODULE_LICENSE("GPL");  //必须遵循GPL协议
 
static int __init Mymod_init(void)   //初始化函数
{   
printk("Hello,my name is xiong feng,initial...\n");  //编译到内核中的程序不能用C中的函数  \
return 0;    //只能用EXPORT_SYMBOL声明过的函数,用grep -R EXPORT_SYMBOL * 可以查找  \
}                   //当然必需在linux-source源码目录下
 
static void __exit Mymodclean_exit(void)    //退出函数

printk("Hello,my name is xiong feng,clean...\n");  //
}
module_init(Mymod_init)   //这两名当然不能少
module_exit(Mymodclean_exit)
/***********************************************************************************************/
上面程序有5个块:
             a. 头文件        b. MODULE_LICENSE("GPL")       c. init函数        d.  exit函数
 
             e. module_init(Mymod_init) ;   module_exit(Mymodclean_exit)
可参考里面的多数C文件写,如:linux-source-2.6.15/sound/drivers/mtpav.c
2. 写Makefile文件:
/***********************************************************************************************/
KERNELDIR = /usr/src/linux-headers-2.6.15-23-386/    系统的linux头文件
obj-m = My_mod.o   //My_mod.o为 下一步make后生成的. o文件
all:
        $(MAKE) -C $(KERNELDIR) SUBDIRS=`pwd` modules
/***********************************************************************************************/
其格式可仿照 linux-source-2.6.15/Documentation/kbuild/modules.txt  文件写
3. Mymod.c 和 Makefile两个文件在同一目录下,然后在当前目录下执行:make
4. ls 查看当前目录就有了如下文件:
Makefile    My_mod.c     My_mod.ko     My_mod.mod.c     My_mod.mod.o     My_mod.o
现在就可以加载你的模块到内核中了:
    insmod   My_mod.ko      //将该模块插入到内核中
    lsmod                             //显示已加载的模块
    rmmod    My_mod.ko      //删除已加载的模块
 
方法二:     //永久性加载
1. 步骤如方法一
2. 将My_mod.c 文件拷到linux-source-2.6.15你想加载到哪个目录中,如我想加载到声卡驱动linux-2.6.11.1/sound中,
将My_mod.c拷到linux-2.6.11.1/sound中。
3. cd  linux-2.6.11.1/sound
    在Kconfig中加入下面几行:
/****************************************************************************************************/        config BearBeeModules      //粗体为变量名,可随便命名
        tristate "Bear Bee's Modules"   //粗体为你在下面的make menuconfig中看到的模块名
        ---help---
        Let's me tell you!   //粗体为你在make menuconfig中看到的帮助信息
/****************************************************************************************************/
4. 在Makefile中加入:
obj-$(CONFIG_BearBeeModules) += My_mod.o
//第一个粗体与第3步的变量名相同,第二个的粗体为make后生成的.o文件,前面与你的C文件名相同.
5.  cd  linux-2.6.11.1/
     make  menuconfig
然后在Sound-->中的Open Sound System-->中找到<>Bear Bee's Modules 选中为加载模块的形式,如下
<M>Bear Bee's Modules,然后保存退出。
6. 在linux-2.6.11.1/目录下执行:make ;  make  install ; make modules ; make  modules_install即可
7. 重启就可以在屏幕上看到你加载模块的信息了,或用dmesg | grep M_mod 查看你的模块是否加载进去

--
/**************************************/
Name: Xiong Feng
E-mail:linux0818@gmail.com
MSN:linux0818@hotmail.com
QQ:23562033
Address: GuangZhou.China
/**************************************/

没有评论:

发表评论