QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 948|回复: 0

问个有关构建运行模块的问题

[复制链接]
发表于 2005-4-9 19:23:39 | 显示全部楼层 |阅读模式
这是在一个在《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
不只是什么原因?
小弟初学,请个位指教一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 12:05 , Processed in 0.066762 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表