有关 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");
~
很给力。
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看到了,成功卸载模块。
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看到了,成功卸载模块。
相关文章推荐
- 有关 Linux 下内核模块的开发方式的记录
- Linux 下内核模块的开发方式的记录 及问题解决(入门的Helloworld)
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)
- linux、内核源码、内核编译与配置、内核模块开发、内核启动流程
- Linux 驱动开发内核模块的添加
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- Linux 驱动开发-0、内核模块设计
- Linux 内核模块开发
- linux、内核源码、内核编译与配置、内核模块开发、内核启动流程
- Linux操作系统下 内核模块开发详细解析
- Linux驱动程序开发基础, -->内核模块编程,内核的调试方法
- (转载) 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- Linux操作系统下 内核模块开发详细解析
- 在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink
- linux内核及驱动开发中有关__init,__exit和__initdata的用法
- Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置
- linux、内核源码、内核编译与配置、内核模块开发、内核启动流程
- Linux驱动开发1--内核入门之hello模块
- Linux内核驱动开发之KGDB单步调试内核(kgdboc方式)