Синхронизация между процессом пользовательского пространства и контекстным кодом прерывания

Недавно я посетил пару интервью. Из всех вопросов ядра, которые были заданы, есть один конкретный вопрос, на который я не смог найти убедительного ответа.

Как вы будете использовать различные методы синхронизации при совместном использовании данных между процессом пользовательского пространства и контекстной функцией прерывания? Мой убедительный ответ был:

В коде прерывания:

1. do *spin_lock_irqsave*
2. access data buffer which is shared between user space app and kernel
3. do *spin_lock_irqrestore*

Тогда это был неубедительный ответ. Должен ли я сделать irqsave а также irqrestore во всех случаях доступа к данным?

1 ответ

Решение

Вы не можете напрямую передавать данные из контекста прерывания в контекст пространства пользователя. В процессе прерывания нет информации о процессе, поэтому вы не знаете, куда отправить данные. Вам необходимо использовать промежуточный контекст процесса из пространства ядра.

Теперь ответим на вопрос. В данных вашего устройства у вас будет буфер, в котором вы будете хранить данные из контекста прерывания. Вам нужно защитить свои данные, используя спин-блокировки, но без части irqsave / irqrestore. Потому что вы находитесь в контексте прерывания.

Затем ваше устройство предоставит пользователям возможность получить эти данные. Вы решаете, либо через символьное устройство, либо через сокет netlink, либо через вызов ioctl, либо любым другим методом. Когда пользовательское пространство требует эти данные, вы будете memcpy из буфера устройства в буфер пространства пользователя. Но вы защитите буфер устройства, используя spin_lock_irqsave / spin_lock_irqrestore пара, потому что вы не хотите, чтобы код прерывания блокировался.

Когда пользовательское пространство использует один из методов, представленных выше (char device read, сокет netlink, ioctl вызов,...) ядро ​​заботится о предоставлении механизма блокировки, но для интерфейса между пользовательским пространством и процессом.

Другие вопросы по тегам