Внутреннее устройство ядра 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); }

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

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

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

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




- Начало -  - Назад -  - Вперед -