¿Cómo logramos la sincronización de datos entre el contexto del usuario y el contexto de interrupción? ¿Cómo se logra en caso de interrupciones anidadas?

No puede transferir datos directamente desde el contexto de interrupción al contexto de espacio de usuario. En el proceso de interrupción no hay información del proceso, por lo que no sabe a dónde enviar los datos. Debe usar el contexto de proceso intermedio desde el espacio del núcleo.

Ahora, para responder la pregunta. En los datos de su dispositivo, tendrá un búfer en el que almacenará datos del contexto de interrupción. Debe proteger sus datos utilizando spinlocks pero sin la parte irqsave / irqrestore. Porque estás en un contexto de interrupción.

Luego, su dispositivo ofrecerá una forma para que el espacio de usuario obtenga estos datos. Usted decide a través de un dispositivo char o un socket de enlace de red o una llamada ioctl o cualquier otro método. Cuando el espacio del usuario requiera estos datos, se memcpy desde el búfer del dispositivo al búfer del espacio del usuario. Pero protegerá el búfer del dispositivo utilizando el par spin_lock_irqsave / spin_lock_irqrestore porque no desea que un código de interrupción se interrumpa.

Cuando el espacio de usuario utiliza uno de los métodos presentados anteriormente ( read dispositivo char, socket de enlace de red, ioctl , …) el núcleo se encarga de proporcionar un mecanismo de bloqueo, pero para la interfaz entre el espacio de usuario y el proceso.