全部~!
在linux系统中,有一个共享数据应该是互斥的。而且,这些数据通过 mmap 在内核空间和用户空间之间共享。所以我编程如下。
////////////用户空间
void access_shared_data_user(void)
{
//snip..
ioctl(test_fd, IOCTL_DOWN_SEM);
shared_data++;
//some access to shared_data
ioctl(test_fd, IOCTL_UP_SEM);
}<
////////////内核空间
static DEFINE_SEMAPHORE(test_sem);
static long test_ioctl(struct file *file, unsigned int cmd, unsigned long arg)<br>
{
//snip..
switch(cmd)
{
case IOCTL_DOWN_SEM:
down(&test_sem);
break;
case IOCTL_UP_SEM:
up(&test_sem);
break;
//snip..
}
void access_shared_data_kernel(void)
{
//snip..
down(&test_sem);
shared_data++;
//some access to shared_data
up(&test_sem);
}
上面的程序运行良好,正如我预期的那样,共享数据受到许多线程的保护。
顺便说一句,上面的程序有问题。如果在原子上下文(例如 IRQ 处理程序)中调用 access_shared_data_kernel,则该程序有可能发生死锁,因为信号量使用睡眠等待方法。
所以我尝试使用 spinlock(spin_lock_irqsave) 但似乎没有办法在用户空间中使用 spinlock。
问题:有什么解决方案可以在原子上下文中在用户和内核之间共享数据?