|
这是在一个在《linux设备驱动程序》第二版中的一个小例子
#define MODULE
#include<linux/module.h>
int init_module(void){
printk("<1>Hello.world\n");
return 0;
}
void cleanup_module(void) {
printk("<1>Goodbye\n");
}
gcc -c hello.c 后出现一队错误
n file included from /usr/include/asm/system.h:5,
from /usr/include/asm/processor.h:18,
from /usr/include/asm/thread_info.h:13,
from /usr/include/linux/thread_info.h:21,
from /usr/include/linux/spinlock.h:19,
from /usr/include/linux/capability.h:45,
from /usr/include/linux/sched.h:7,
from /usr/include/linux/module.h:10,
from hello1.c:9:
/usr/include/linux/kernel.h:72: error: parse error before "size_t"
/usr/include/linux/kernel.h:74: error: parse error before "size_t"
。。。。
。。。。
后来知道是kernel版本的原因,我在2.6下,在网上看到这篇文章
作者 Ray
来源www.rtems.net,作者ray@rtems
Linux 2.6 和 2.4 的比较我不想废话,总体来说 2.6 功能更强,但是资源消耗更多。
由于 2.6 内核在驱动框架,底层调用上和 2.4 内核有很多差别,所以本文主要是为程序员提供 2.4 到 2.6 迁移的指导。
2.6 和 2.4 主要的不同在于
• 内核的 API 变化,增加了不少新功能(例如 mem pool )
• 提供 sysfs 用于描述设备树
• 驱动模块从 .o 变为 .ko
移植 hello word
下面是一个最简单的 2.4 驱动:
#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void)
{
printk(KERN_INFO "Hello, world\n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye cruel world\n");
}
2.6的hello world版本!
#include < linux/module.h>
#include < linux/config.h>
#include < linux/init.h>
MODULE_LICENSE("GPL");// 新,否则有 waring, 去掉了 #define MODULE, 自动定义
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);// 必须!!
module_exit(hello_exit); // 必须!!
注意,在 2.4 中 module_init 不是必须的,只要驱动的初始化函数以及析沟函数命名使用了缺省的 init_module 和 cleanup_module
编译生成:
2.4
gcc -D__KERNEL__ -DMODULE -I/usr/src/linux- 2.4.27 /include -O2 -c testmod.c
2.6
makefile 中要有 obj-m:= hello.o
然后:
make -C /usr/src/linux- 2.6.11 SUBDIRS=$PWD modules (当然简单的 make 也可以)
我按照他的方法试成功 了
在我的 当前目录下生成了 着几个 文件
hello.o
hello.ko
hello.mod.o
hello.mod.c
我用命令
insmod ./hello.ko
rmmod hello
终端没有任何反映
没有打印出Hello, world\n
不只是什么原因?
小弟初学,请个位指教一下 |
|