Синхронизация ресурсов в драйвере при системных вызовах?
Допустим есть драйвер, который реализует read и write. Функция read блокирует выполнение пока не произойдет прерывание от устройства и не скопируются принятые данные в очередь. В момент, когда функция read блокирована (по факту системный вызов (syscall) не вернул результат в пользовательское пространство), то при вызове другого системного вызова того же драйвера, например, write, необходимо ли в самом драйвере синхронизировать общие данные, которые используются и в read и в write? Или выполнение системных вызовов как-то гарантировано регламентировано и прерывания отключены (к примеру, если прерывание случилось, данные скопированы и системный вызов read готов разблокироваться, а в этот момент выполняется системный вызов write, то write может прерваться)?
В момент, когда функция read блокирована (по факту системный вызов (syscall) не вернул результат в пользовательское пространство), то при вызове другого системного вызова того же драйвера, например, write, необходимо ли в самом драйвере синхронизировать общие данные, которые используются и в read и в write?
Да.
Или выполнение системных вызовов как-то гарантировано регламентировано и прерывания отключены
Тогда в догонку ещё вопрос. Системный вызов - это по сути программное прерывание. Так вот, оно может быть вложенным или быть прерванным кем-то в процессе выполнения?
Системный вызов - это по сути программное прерывание.
Неа. Системный вызов -- это вход в ядро с целью получить определённый сервис. То, что где-то он выполняется программным перыванием, это просто деталь реализации, делающая процедуру входа удобной/эффективной. После завершения входа в ядро для выполнения системного вызова прерывания разрешаются.
оно может быть вложенным или быть прерванным кем-то в процессе выполнения?
Смотря в каком смысле и с какой точки зрения. С точки зрения одного пользовательского потока -- нет, вложенным системный вызов быть не может. Системный вызов всегда заканчивается возвратом в вызывающий поток (не обязательно в точку где системный вызов был сделан, но в подавляющем большинстве случаев -- туда). Даже если потоку находящемуся в системном вызове приходит сигнал, он либо не принимается, либо завершает текущий системный вызов перед возвратом в юзерспейс.
Но с точки зрения всей ОС, поток зашедший в системный вызов может быть прерван, снят с выполнения на текущем процессоре и заменён каким-то другим потоком.