Внутреннее устройство ядра Linux 2.4



Блокировки (Spinlocks), Read-write блокировки и Big-Reader блокировки; - часть 3


В общем случае, доступ к данным, разделяемым между контекстом пользовательского процесса и обработчиком прерываний, может быть оформлен так:

spinlock_t my_lock = SPIN_LOCK_UNLOCKED;

my_ioctl() { spin_lock_irq(&my_lock); /* критическая секция */ spin_unlock_irq(&my_lock); }

my_irq_handler() { spin_lock(&lock); /* критическая секция */ spin_unlock(&lock); }

Следует обратить внимание на:

  • Контекст процесса, представленный типичным методом (функцией) драйвера - ioctl() (входные параметры и возвращаемое значение опущены для простоты), должен использовать spin_lock_irq(), поскольку заранее известно, что при исполнении метода ioctl()

    прерывания всегда разрешены.

  • Контекст прерываний, представленный my_irq_handler() может использовать простую форму spin_lock(), поскольку внутри обработчика прерывания всегда запрещены.



  • Содержание  Назад  Вперед