免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1542 | 回复: 0
打印 上一主题 下一主题

[linux内核编程入门].1.1.构建自己的内核模块 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-12 18:04 |只看该作者 |倒序浏览
[内核编程入门]构建自己的内核模块
虽然Linux是个宏内核系统,但是内核允许在运行时动态地加载或卸载模块。这项特性为Linux内核开发与使用带来了很多方便,比如基本内核映像可以做得足够小,新功能和驱动程序可以以模块的形式提供。同时,这样做也方便调试。本文中将描述如何构造一个最简单的内核模块。
1. 编写一个简单的内核模块
模块文件中需要有入口点和出口点,这是加载与卸载模块时要被调用的。这两个接口在include/linux/init.h定义,相当于模块的“构造”与“析构”函数:
module_init(init_func);
module_exit(exit_func);
其中,init_func与exit_func分别在模块被加载和卸载时调用,可以在这里执行初始化与清理工作。
在include/linux/module.h文件中,给出了一系列模块相关的接口,包括:
MODULE_LICENSE 声明版权
MODULE_AUTHOR 声明作者
MODULE_DESCRIPTION 给出模块的描述
等等
那么,我们可以给出一个最简单的模块:
#include
#include
#include
int init_hello()
{
        printk(KERN_INFO "Hello, world!\n");
        return 0;
}
void exit_hello()
{
        printk(KERN_INFO "Goodbye, world!\n");
}
module_init(init_hello);
module_exit(exit_hello);
2. 如何编译执行这个模块呢?
2.6的内核采用了"kbuild"构建系统。一般情况下,有两种方法来构造一个模块,一是直接放在内核源码树里,另外一个则是直接以模块形式发布
(1) 放入内核源码树
> 在源码子目录中,创建自己的目录,比如
# mkdir net/ipv4/hello
然后把源码hello.c放入其中。
> 修改该目录下的Makefile
# vim net/ipv4/Makefile
添加一行
obj-m += hello/
> 如果这个模块是需要有配置选项开启的,比如CONFIG_MY_HELLO,则还需要加入
obj-$(CONFIG_MY_HELLO) += hello/
> 最后,在hello目录下,添加自己的Makefile,一行搞定:
# vim net/ipv4/hello/Makefile
obj-m += hello.o
(2) 单独发布,放在内核代码外
在自己的源码树目录下,可以编写这样的Makefile
obj-m := hello.o
如果有多个文件,可以这样写:
obj-m := hello.o
hello-objs := hello-main.o hello-world.o
那么接下来,需要告诉make如何找到内核源码树和其他的Makefile
# make -C <kernel source path SUBDIRS=$PWD modules即可。
如下为一个简单的Makefile样例:
ifneq ($(KERNELRELEASE),)
obj-m  := hello.o
else
        KERNELSRC :=/lib/modules/$(shell uname -r)/build
        PWD :=$(shell pwd)
modules :  
        make -C $(KERNELSRC) SUBDIRS=$(PWD) $@
clean:
        rm -f *.o *.ko
endif
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/12325/showart_1898708.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP