[Comprensión profunda del bloqueo del kernel de Linux] 2. Protección contra interrupciones

imagen
Mi círculo: un lugar de reunión para ingenieros senior
Soy Dong Ge, un ingeniero sénior de desarrollo de software integrado, me dedico al desarrollo de sistemas y controladores integrados de Linux, ¡y trabajé para una empresa Fortune 500!
Concepto de creación: ¡Concéntrese en compartir artículos incrustados de alta calidad, para que todos puedan leer algo!
imagen

inserte la descripción de la imagen aquí

1. Interrumpir y proteger los pensamientos

El enmascaramiento de interrupciones, como sugiere su nombre, protege la CPUfunció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 :

  • LinuxEn el núcleo, además de la programación de procesos del sistema que depende de las interrupciones, también hay muchas I/Ooperaciones 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 CPUy, para SMPlos multiprocesadores simétricos, aún es inevitable recibir otras CPUinterrupciones. Por lo tanto, no resuelve la condición de carrera causada por SMPmú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, Linuxlas 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 ARMejemplo.

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_enablela función se utiliza para establecer CPSRel bit de activación de interrupción en el registro en 1, de modo que CPUse 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 CPSRdel registro Ipara permitir esta CPUinterrupció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_disablela función se utiliza para establecer CPSRel bit de activación de interrupción en el registro en 0, prohibiendo así CPUla respuesta a la interrupción.

Implementación relacionada : ídem

  • cpsid: ¡Es una instrucción de ensamblaje, que se usa para borrar CPSRel 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_saveFunción, utilizada para guardar el estado de interrupción actual y deshabilitar las interrupciones.

Implementaciones relacionadas :

mrs %0 IRQMASK_REG_NAME_R: mrsLa instrucción mueve el valor del registro IRQMASK_REG_NAME_Respecificado por la macro a una variable.IRQMASKflags

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_restorefunción, utilizada para restaurar el estado de interrupción actual y abrir la interrupción.

Implementación relacionada : ídem

 

Con respecto local_bh_disablea las local_bh_enabledos 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:

  1. Interrumpir los pensamientos protectores
  2. Ventajas y desventajas del enmascaramiento de interrupción
  3. LinuxLa interfaz de máscara de interrupción proporcionada por el kernel
  4. Implementación de ensamblaje básico de máscara de interrupción

Me gusta + seguir, nunca te pierdas

imagen
¡Bienvenido a prestar atención a Cuenta oficial y Planeta [Arte integrado], original de Dong Ge!

Supongo que te gusta

Origin blog.csdn.net/dong__ge/article/details/131120463
Recomendado
Clasificación