すべて〜!
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);
}
上記のプログラムは期待どおりに機能し、共有データは多くのスレッドから保護されていました。
ところで、上記のプログラムには問題があります。access_shared_data_kernel が IRQ ハンドラーなどのアトミック コンテキストで呼び出されると、セマフォがスリープ待機メソッドを使用するため、このプログラムでデッドロックが発生する可能性があります。
そこで、spinlock(spin_lock_irqsave) を使用しようとしましたが、ユーザー空間でスピンロックを使用する方法はないようです。
質問: アトミック コンテキストでユーザーとカーネルの間でデータを共有するソリューションはありますか?