我一直在尝试遵循 Love 的 Linux 内核开发中的一些语法,但在以下简化的信号量初始化中遇到了一些困难。在内核编译期间,我不断收到“错误:预期声明说明符或“&”标记之前的“...”。这听起来像是将我的 sema_init() 调用视为函数原型,而实际上它只是一个静态内联函数调用。
#include <linux/sched.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/syscalls.h>
#include <linux/pstrace.h>
#include <linux/semaphore.h>
struct semaphore sem1;
int count1 = 3;
sema_init(&sem1,count1);
SYSCALL_DEFINE0(helloworld){
extern struct semaphore sem1;
printk("hello, world\n");
return 0;
}
关于如何做到这一点还有什么想法吗? (我知道我实际上并没有在调用中使用信号量。)
谢谢。
答案1
您不能以这种方式调用函数外部的函数。要初始化信号量,请使用一个__init
函数:
static int __init helloworld_init(void) {
sema_init(&sem1, 3);
return 0;
}
module_init(helloworld_init);
你也需要这样做#include <linux/module.h>
。
(是的,这看起来像是自相矛盾的建议,因为module_init()
似乎是在函数外部调用的,但sema_init()
它是一个函数,并且module_init()
是一个宏。)