【发布时间】:2016-09-25 19:47:36
【问题描述】:
我正在尝试使用 linux softirq。 A 有一个简单的程序,它使用linux/interrupt.h 中定义的 linux 系统调用:
//
// Created by kivi on 24.09.16.
//
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/stat.h>
#define SHARED_IRQ 17
static int irq = SHARED_IRQ, my_dev_id, irq_counter = 0;
module_param( irq, int, S_IRUGO );
/* The interrupt handler */
static irqreturn_t xxx_interrupt( int irq, void *dev_id ) {
printk( KERN_INFO "In the top-half: counter = %d\n", irq_counter );
raise_softirq( XXX_SOFT_IRQ );
return IRQ_HANDLED;
}
/* The bottom half */
void xxx_analyze(struct softirq_action *str) {
irq_counter++;
printk( KERN_INFO "In the bottom-half: counter = %d\n", irq_counter );
}
static int __init my_init( void ) {
request_irq( irq, xxx_interrupt, 0, "xxx", NULL );
open_softirq( XXX_SOFT_IRQ, xxx_analyze);
printk( KERN_INFO "Successfully set softirq handler on IRQ %d\n", irq );
return 0;
}
static void __exit my_exit( void ) {
synchronize_irq( irq );
free_irq( irq, &my_dev_id );
printk( KERN_INFO "Successfully unloading, irq_counter = %d\n", irq_counter );
}
module_init( my_init );
module_exit( my_exit );
MODULE_LICENSE( "GPL v2" );
当我尝试编译这个模块时,我得到链接器错误,函数 open_softirq() 和 raise_softirq() 没有定义:
kivi@kivi-pc:~/sp_labs/irq_exc/softirq$ make
make -C /lib/modules/4.7.5-custom/build M=/home/kivi/sp_labs/irq_exc/softirq modules
make[1]: Entering directory '/home/kivi/Downloads/linux-4.7.5'
Building modules, stage 2.
MODPOST 1 modules
WARNING: "open_softirq" [/home/kivi/sp_labs/irq_exc/softirq/softirq.ko] undefined!
WARNING: "raise_softirq" [/home/kivi/sp_labs/irq_exc/softirq/softirq.ko] undefined!
make[1]: Leaving directory '/home/kivi/Downloads/linux-4.7.5'
有趣的是函数request_irq() e.t.c.在interrupt.h文件中也有定义,但它们不会引起任何问题。
这是我的 Makefile:
obj-m += softirq.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
那么任何人都可以帮我解决我的问题。
附:我用谷歌搜索了我的问题并找到了一些建议,我应该在编译时添加KBUILD_EXTRA_SYMBOLS=*module path*/Module.symvers,但这没有帮助。
【问题讨论】:
-
我不是 LKM 大师,但上次我写内核模块时遇到了类似的问题,我必须设置一些特殊的
#define才能链接标有EXPORT_SYMBOL_GPL()的符号 -
能否请您提供更详细的说明如何做到这一点
标签: c linux linux-kernel