QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1080|回复: 6

要疯了~编译模块????

[复制链接]
发表于 2006-4-24 17:14:47 | 显示全部楼层 |阅读模式
一个模块编程的例子,还是网上找的,怎么也搞不定
如下:
[code:1]
#include <linux/init.h>
#include <linux/kernel.h> /* 我们正在干一些关于内核的事情 */
#include <linux/module.h> /* 具体来说,是在写一个模块 */

#if CONFIG_MODVERSIONS==1 /* 如果需要指明模块的版本的话 */
#define MODVERSIONS
#include <linux/modversions.h> /* 那就将linux/modversions.h文件包含*/
#endif

int init_module() /* 模块初始化函数 */
{
        printk("Hello, this is the kernel speaking!\n");
        /* 如果我们将返回值置为非零,这说明初始化模块失败 */
        return 0;
}

void cleanup_module() /* 模块卸载函数 */
{
        printk("This kernel module has been removed.\n");
}
[/code:1]

Makefile:
[code:1]
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include
hello.o: hello.c
        $(CC) $(MODCFLAGS) -c hello.c
[/code:1]

编译错误:

[code:1]
[yanc@yan module]$ make
gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -c hello.c
In file included from /usr/src/linux/include/linux/rwsem.h:27,
                 from /usr/src/linux/include/asm/semaphore.h:42,
                 from /usr/src/linux/include/linux/sched.h:20,
                 from /usr/src/linux/include/linux/module.h:10,
                 from hello.c:2:
/usr/src/linux/include/asm/rwsem.h: 在函数 ‘__down_read’ 中:
/usr/src/linux/include/asm/rwsem.h:105: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/rwsem.h: 在函数 ‘__down_write’ 中:
/usr/src/linux/include/asm/rwsem.h:157: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/rwsem.h: 在函数 ‘__up_read’ 中:
/usr/src/linux/include/asm/rwsem.h:194: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/rwsem.h:188: 警告:未使用的变量 ‘tmp’
/usr/src/linux/include/asm/rwsem.h: 在函数 ‘__up_write’ 中:
/usr/src/linux/include/asm/rwsem.h:220: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/rwsem.h: 在函数 ‘__downgrade_write’ 中:
/usr/src/linux/include/asm/rwsem.h:245: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
In file included from /usr/src/linux/include/linux/sched.h:20,
                 from /usr/src/linux/include/linux/module.h:10,
                 from hello.c:2:
/usr/src/linux/include/asm/semaphore.h: 在函数 ‘down’ 中:
/usr/src/linux/include/asm/semaphore.h:105: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/semaphore.h: 在函数 ‘down_interruptible’ 中:
/usr/src/linux/include/asm/semaphore.h:130: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/semaphore.h: 在函数 ‘down_trylock’ 中:
/usr/src/linux/include/asm/semaphore.h:155: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
/usr/src/linux/include/asm/semaphore.h: 在函数 ‘up’ 中:
/usr/src/linux/include/asm/semaphore.h:179: 错误:expected ‘:’ or ‘)’ before ‘KBUILD_BASENAME’
在包含自 hello.c:7 的文件中:
/usr/include/linux/modversions.h:1:2: 错误:#error Modules should never use kernel-headers system headers,
/usr/include/linux/modversions.h:2:2: 错误:#error but rather headers from the appropriate kernel package.
/usr/include/linux/modversions.h:3:2: 错误:#error Change -I/usr/src/linux/include (or similar) to
/usr/include/linux/modversions.h:4:2: 错误:#error -I/lib/modules/$(uname -r)/build/include
/usr/include/linux/modversions.h:5:2: 错误:#error to build against the currently-running kernel.
make: *** [hello.o] 错误 1
[yanc@yan module]$  
[/code:1]

大哥们帮忙,指导小弟一下吧~
 楼主| 发表于 2006-4-24 17:22:13 | 显示全部楼层
与上面基本相同,已删除~
回复

使用道具 举报

发表于 2006-4-24 19:39:39 | 显示全部楼层
内核是2.4还是2.6
回复

使用道具 举报

 楼主| 发表于 2006-4-24 23:02:30 | 显示全部楼层
2.6.16
系统内核也是~
回复

使用道具 举报

发表于 2006-4-25 10:34:50 | 显示全部楼层
2.6编译方法跟2.4不一样,上面是2.4的编译方法,你到google搜一下2.6模块编译
回复

使用道具 举报

 楼主| 发表于 2006-4-25 16:28:25 | 显示全部楼层

会了,一个例子。。。

hello-module.c
[code:1]        #include <linux/module.h>        /* Needed by all modules */
        #include <linux/kernel.h>        /* Needed for KERN_ALERT */
  
        int init_module(void)
        {
                printk("KERN_ALERT Hello world.\n");
                // A non 0 return means init_module failed; module can't be loaded.
                return 0;
        }
   
        void cleanup_module(void)
        {
                printk("KERN_ALERT Goodbye world.\n");
        }
[/code:1]

Makefile:
[code:1]
obj-m += hello-module.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean</blockquote>
[/code:1]

执行make:
[code:1]
[yanc@yan module]$ make
make -C /lib/modules/2.6.16/build M=/home/yanc/OS/source/module modules
make[1]: Entering directory `/usr/src/redhat/SOURCES/linux-2.6.16'
  CC [M]  /home/yanc/OS/source/module/hello-module.o
  Building modules, stage 2.
  MODPOST
  CC      /home/yanc/OS/source/module/hello-module.mod.o
  LD [M]  /home/yanc/OS/source/module/hello-module.ko
make[1]: Leaving directory `/usr/src/redhat/SOURCES/linux-2.6.16'
[yanc@yan module]$ ls
compare         hello-module.ko     hello-module.mod.o  Makefile       test_module
hello-module.c  hello-module.mod.c  hello-module.o      simple_module
[/code:1]

在console下加载模块:(CTRL+ALT+F2 进入,一定要在console下用root用户登录,不然看不到输出信息)
执行:
[code:1]
insmod ./hello-module.ko 就可以看到输出信息
cat /proc/modules |grep *hello* 可以看到已经加载的模块
rmmod hello-module 卸载模块,可以看到信息
[/code:1]
回复

使用道具 举报

 楼主| 发表于 2006-4-25 16:30:33 | 显示全部楼层
用的是2.6.16内核
我的是FC5系统(2.6.15),重新编译了2.6.16内核使用的~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 18:37 , Processed in 0.046292 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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