C 定义旋转锁(…)旋转锁参数错误

C 定义旋转锁(…)旋转锁参数错误,c,linux,linux-kernel,kernel,system-calls,C,Linux,Linux Kernel,Kernel,System Calls,我目前正在为类开发一个项目,其中包括一个基于内核的信号量实现。而不是使用DEFINE_SPINLOCKsem_lock;作为/kernel/sys.c中的一个全局变量,我创建了一个方案,其中信号量结构在用户空间中保存一个伪装为void*的spinlock\t变量,以便允许不同的信号量独立地向下/向上转换,这将转换为更高效的代码,而不需要太多的等待。我进行一个系统调用来初始化一个信号量,传递一个指向结构的指针。但是,在初始化信号量的自旋锁时,我有一行出错 我已经联系了我的教授,他说为了本作业的目的

我目前正在为类开发一个项目,其中包括一个基于内核的信号量实现。而不是使用DEFINE_SPINLOCKsem_lock;作为/kernel/sys.c中的一个全局变量,我创建了一个方案,其中信号量结构在用户空间中保存一个伪装为void*的spinlock\t变量,以便允许不同的信号量独立地向下/向上转换,这将转换为更高效的代码,而不需要太多的等待。我进行一个系统调用来初始化一个信号量,传递一个指向结构的指针。但是,在初始化信号量的自旋锁时,我有一行出错

我已经联系了我的教授,他说为了本作业的目的,只需使用一个带有全局自旋锁定义的粗略实现。然而,很难让这一切过去。虽然我显然不介意走这条路,但我仍然想理解为什么我的实现不起作用。有人能帮我吗

以下是错误:

    CC      kernel/sys.o
kernel/sys.c: In function 'sys_cs1550_sem_init':
kernel/sys.c:2491: error: expected '=', ',', ';', 'asm' or '__attribute__' before '->' token
kernel/sys.c:2491: error: expected expression before '->' token
make[1]: *** [kernel/sys.o] Error 1
make: *** [kernel] Error 2
我尝试了以下方法:

DEFINE_SPINLOCK(sem->sem_lock);  
DEFINE_SPINLOCK(&(sem->sem_lock));  
DEFINE_SPINLOCK((&(sem->sem_lock)));  
DEFINE_SPINLOCK(*(sem->sem_lock));  
spinlock_t *lock = &(sem->sem_lock);  
DEFINE_SPINLOCK(lock);
/kernel/sys.c中信号量结构的代码:

/*
* Initialize a semaphore with the creation of it's spinlock.
* The idea is to avoid having spinlocks in user space, by making
* the process as opaque as possible. Our lock is defined in the kernel as a spinlock_t,
* but as a void* in userspace. This allows us to have more than one semaphore as needed.
*/
struct cs1550_sem{
    spinlock_t *sem_lock;                   //The lock for our semaphore.
    int available_resources;                //Total # of available resources.
    struct cs1550_pnode *process_list;      //Pointer to the first node of our linked list.
};
asmlinkage long sys_cs1550_sem_init(struct cs1550_sem *sem, int resource_cap){
    DEFINE_SPINLOCK(sem->sem_lock);         //Define our lock.
    sem->process_list = NULL;               //Ensure we have a 'stopping point' when dequeueing.
    sem->available_resources = resource_cap;
    return 0;
}
EXPORT_SYMBOL_GPL(sys_cs1550_sem_init);
我在/kernel/sys.c中的信号量初始化syscall代码:

/*
* Initialize a semaphore with the creation of it's spinlock.
* The idea is to avoid having spinlocks in user space, by making
* the process as opaque as possible. Our lock is defined in the kernel as a spinlock_t,
* but as a void* in userspace. This allows us to have more than one semaphore as needed.
*/
struct cs1550_sem{
    spinlock_t *sem_lock;                   //The lock for our semaphore.
    int available_resources;                //Total # of available resources.
    struct cs1550_pnode *process_list;      //Pointer to the first node of our linked list.
};
asmlinkage long sys_cs1550_sem_init(struct cs1550_sem *sem, int resource_cap){
    DEFINE_SPINLOCK(sem->sem_lock);         //Define our lock.
    sem->process_list = NULL;               //Ensure we have a 'stopping point' when dequeueing.
    sem->available_resources = resource_cap;
    return 0;
}
EXPORT_SYMBOL_GPL(sys_cs1550_sem_init);

谢谢您的时间。

您不能以这种方式使用此宏

// spinlock_types.h
#define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
您的结构可能如下所示:

struct cs1550_sem{
    spinlock_t sem_lock;                   //The lock for our semaphore.
    int available_resources;                //Total # of available resources.
    struct cs1550_pnode *process_list;      //Pointer to the first node of our linked list.
};
和初始化:

asmlinkage long sys_cs1550_sem_init(struct cs1550_sem *sem, int resource_cap){
    spin_lock_init(&sem->sem_lock);         //Define our lock.
    sem->process_list = NULL;               //Ensure we have a 'stopping point' when dequeueing.
    sem->available_resources = resource_cap;
    return 0;
}

请看第3单元的第295行,您不能以这种方式使用此宏

// spinlock_types.h
#define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
您的结构可能如下所示:

struct cs1550_sem{
    spinlock_t sem_lock;                   //The lock for our semaphore.
    int available_resources;                //Total # of available resources.
    struct cs1550_pnode *process_list;      //Pointer to the first node of our linked list.
};
和初始化:

asmlinkage long sys_cs1550_sem_init(struct cs1550_sem *sem, int resource_cap){
    spin_lock_init(&sem->sem_lock);         //Define our lock.
    sem->process_list = NULL;               //Ensure we have a 'stopping point' when dequeueing.
    sem->available_resources = resource_cap;
    return 0;
}

请看第3课和第295行

,因此在信号量结构中本地而不是全局初始化自旋锁的解决方案是取出宏并使用代码:sem->sem\u lock=\uu自旋锁\u解锁em->sem\u lock?嗯,错过了。非常感谢您的帮助,我将尝试使用适当的解引用实现,看看它是如何工作的。不管怎样,我现在知道为什么我以前的尝试不起作用了。我真诚地感谢你的帮助!谢谢你的编辑,帮了我大忙。希望我的系统调用实现是可靠的,从现在开始应该是一帆风顺的。因此,在信号量结构中本地初始化自旋锁而不是全局初始化自旋锁的解决方案是去掉宏,只使用代码:sem->sem\u lock=\uuu自旋锁\u UNLOCKEDsem->sem\u lock?嗯,错过了。非常感谢您的帮助,我将尝试使用适当的解引用实现,看看它是如何工作的。不管怎样,我现在知道为什么我以前的尝试不起作用了。我真诚地感谢你的帮助!谢谢你的编辑,帮了我大忙。希望我的系统调用实现是可靠的,从现在开始应该是一帆风顺的。