Directorio de artículos
1. Interrumpir y proteger los pensamientos
El enmascaramiento de interrupciones, como sugiere su nombre, protege la CPU
función de respuesta a interrupciones para resolver el problema de condición de carrera causado por la concurrencia.
¿Cuáles son las ventajas y desventajas de proteger las interrupciones antes de ingresar a la sección crítica?
Los beneficios son :
- Garantizado para no ser interrumpido por interrupciones al ejecutar código de sección crítica
- Al mismo tiempo, la programación de procesos del sistema está estrechamente relacionada con las interrupciones, lo que también limita la concurrencia de procesos del sistema y resuelve el problema de condición de carrera causado por la concurrencia de procesos del sistema.
Las desventajas son :
Linux
En el núcleo, además de la programación de procesos del sistema que depende de las interrupciones, también hay muchasI/O
operaciones asincrónicas que dependen de las interrupciones. Por lo tanto, proteger las interrupciones durante mucho tiempo es muy peligroso y afectará gravemente al sistema. Por lo tanto, el código de la sección crítica es También se requiere que sea corto.- Desactivar las interrupciones puede resolver la programación de procesos y las condiciones de carrera causadas por las interrupciones, pero todas son internas
CPU
y, paraSMP
los multiprocesadores simétricos, aún es inevitable recibir otrasCPU
interrupciones. Por lo tanto, no resuelve la condición de carrera causada porSMP
múltiplesCPU
Por lo tanto, el enmascaramiento de interrupciones por sí solo no suele ser una forma recomendada de evitar las condiciones de carrera.
2. Implementación del blindaje de interrupción del kernel de Linux
2.1 Interfaz API proporcionada por el kernel de Linux
Con respecto al enmascaramiento de interrupciones,
Linux
las interfaces proporcionadas por el kernel son las siguientes:
local_irq_enable() // 使能本CPU的中断
local_irq_disable() // 禁止本CPU的中断
local_irq_save(flags) // 禁止本CPU的中断,并保存CPU中断位的信息
local_irq_restore(flags) // 使能本CPU的中断,并恢复CPU中断位的信息
local_bh_disable(void) // 禁止本CPU底半部中断
local_bh_enable(void) // 使能本CPU底半部中断
2.2 Análisis de implementación de la interfaz API
Debido a que el enmascaramiento de interrupciones está relacionado con la arquitectura del chip subyacente, las diferentes arquitecturas tienen diferentes métodos de procesamiento, tomémoslo como
ARM
ejemplo.
2.2.1 local_irq_activar
#define local_irq_enable() do {
raw_local_irq_enable(); } while (0)
#define raw_local_irq_enable() arch_local_irq_enable()
#define arch_local_irq_enable arch_local_irq_enable
static inline void arch_local_irq_enable(void)
{
asm volatile(
" cpsie i @ arch_local_irq_enable"
:
:
: "memory", "cc");
}
Introducción a la función : local_irq_enable
la función se utiliza para establecer CPSR
el bit de activación de interrupción en el registro en 1, de modo que CPU
se pueda responder a la interrupción.
Implementaciones relacionadas :
asm
: declara una expresión de ensamblaje en línea
cpsie i
: Instrucción ensambladora, establece el bit CPSR
del registro I
para permitir esta CPU
interrupción de respuesta.
memory
: Explique a la asamblea que la memoria ha cambiado aquí, similar al papel de una barrera de memoria
cc
: bandera que indica que el código de condición puede ser modificado
Sintaxis del código ensamblador: https://www.jianshu.com/p/57fef17149ae
2.2.2 arch_local_irq_disable
#define arch_local_irq_disable arch_local_irq_disable
static inline void arch_local_irq_disable(void)
{
asm volatile(
" cpsid i @ arch_local_irq_disable"
:
:
: "memory", "cc");
}
Introducción a la función : arch_local_irq_disable
la función se utiliza para establecer CPSR
el bit de activación de interrupción en el registro en 0, prohibiendo así CPU
la respuesta a la interrupción.
Implementación relacionada : ídem
cpsid
: ¡Es una instrucción de ensamblaje, que se usa para borrarCPSR
el indicador de interrupción del registro para deshabilitar la interrupción!
2.2.3 arch_local_irq_save
#define arch_local_irq_save arch_local_irq_save
static inline unsigned long arch_local_irq_save(void)
{
unsigned long flags;
asm volatile(
" mrs %0, " IRQMASK_REG_NAME_R " @ arch_local_irq_save\n"
" cpsid i"
: "=r" (flags) : : "memory", "cc");
return flags;
}
Introducción a la función : arch_local_irq_save
Función, utilizada para guardar el estado de interrupción actual y deshabilitar las interrupciones.
Implementaciones relacionadas :
mrs %0 IRQMASK_REG_NAME_R
: mrs
La instrucción mueve el valor del registro IRQMASK_REG_NAME_R
especificado por la macro a una variable.IRQMASK
flags
Explicación detallada de los comandos MRS
Resumen de los comandos de ensamblaje
2.2.4 arch_local_irq_restore
/*
* restore saved IRQ & FIQ state
*/
#define arch_local_irq_restore arch_local_irq_restore
static inline void arch_local_irq_restore(unsigned long flags)
{
asm volatile(
" msr " IRQMASK_REG_NAME_W ", %0 @ local_irq_restore"
:
: "r" (flags)
: "memory", "cc");
}
Introducción a la función : arch_local_irq_restore
función, utilizada para restaurar el estado de interrupción actual y abrir la interrupción.
Implementación relacionada : ídem
Con respecto
local_bh_disable
a laslocal_bh_enable
dos interfaces, involucra la mitad inferior del mecanismo de interrupción, el contenido es más complicado y se desmontará por separado más adelante.
3. Resumen
Este artículo comprende principalmente los siguientes puntos:
- Interrumpir los pensamientos protectores
- Ventajas y desventajas del enmascaramiento de interrupción
Linux
La interfaz de máscara de interrupción proporcionada por el kernel- Implementación de ensamblaje básico de máscara de interrupción
Me gusta + seguir, nunca te pierdas