在编译时静态初始化信号量?

在编译时静态初始化信号量?

我一直在尝试遵循 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()是一个宏。)

相关内容