您的位置:首页 > 运维架构 > Linux

有关 Linux 下内核模块的开发方式的记录 .

2014-03-14 17:54 435 查看
1、本文全文为半香仙笛(Woody.c)原创

2、如果需要转载本文,请注明出处:http://blog.csdn.net/mcg890414/archive/2010/09/10/5874943.aspx

3、如果需要和笔者交流,请邮件至mcg890414@163.com



Thinking in Linux C...



前几天照着《Linux设备驱动开发详解》上的 代码翘入了计算机一段内核模块代码,但是完全没有编译成功,gcc告诉我,这个不认识,那个也不认识……



内核模块代码如下:

[cpp]
view plaincopyprint?

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT " Hello World ENTER/n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT " Hello World EXIT/n");
return;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("Woody.c");
MODULE_DESCRIPTION("A simple Hello world Module");
MODULE_ALIAS("a simplest module");
~

[python] 
view plaincopyprint?

# MakeFile 2.6:   
obj-m += hello.o  
# 产生对应的路径变量   
CURRENT_PATH := $(shell pwd)  
# 内核源码当前版本   
LINUX_KERNEL := $(shell uname -r)  
#内核源码绝对路径   
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)  
#编译对象   
all:  
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules  
#清理工作   
clean:  
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean  
~                                                                           

# MakeFile 2.6:
obj-m += hello.o
# 产生对应的路径变量
CURRENT_PATH := $(shell pwd)
# 内核源码当前版本
LINUX_KERNEL := $(shell uname -r)
#内核源码绝对路径
LINUX_KERNEL_PATH := /usr/src/linux-headers-$(LINUX_KERNEL)
#编译对象
all:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#清理工作
clean:
        make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
~




很给力。

make之后产生了我要的东西。

然后,insmod ./hello.ko

却告诉我:insmod: error inserting './hello.ko': -1 Operation not permitted

我郁闷了。。。这神马情况?

原来要加sudo,因为这是在往内核插入模块。

OK,成功了,再lsmod能看到hello的模块已经装载成功了

想看看printk的结果?dmesg,看到输出的结果了

嗯,该卸载了。。。

rmmod hello

呀。。。ERROR: Removing 'hello': Operation not permitted

又忘了sudo,这可不是好习惯。。

好了,dmesg看到了,成功卸载模块。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐