domingo, 29 de enero de 2017

inv 1 Manejo de interrupciones (IRQ)

que son las IRQ

un IRQ es una señal de un dispositivo de hardware (por ej. el teclado o tarjeta de sonido) indicando que el dispositivo necesita que la CPU haga algo. La señal del pedido de interrupción va a través de las líneas IRQ a un controlador que asigna prioridades a los pedidos IRQ y se los entrega a la CPU. Ya que el controlador de IRQ espera señales de solo un dispositivo por línea IRQ, si tienen más que un dispositivo por línea terminan con un conflicto de IRQ que puede congelar su máquina. Esto es por qué asignar IRQs a dispositivos nuevos al instalarlos es tan importante - y por qué puede ser tan frustrante cuando no se hace bien.

 Interrupciones y ajuste de IRQ

Una solicitud de interrupción de cola (IRQ) es una solicitud de un servicio, enviado en el nivel de hardware. Las interrupciones pueden ser enviadas por una línea de hardware dedicado o a través de un bus de hardware como un paquete de información (una Interrupción de mensajes señalada o MSI).
Cuando las interrupciones están habilitadas, la recepción de una IRQ le pide al interruptor, detener el contexto. El código de envío de interrupciones de Kernel, recupera el número de IRQ y su lista asociada de Rutinas de servicio de interrupciones registradas (ISR), y a su vez, llama a cada ISR. La ISR reconoce las interrupciones e ignora las interrupciones redundantes de la misma IRQ, luego pone en cola un indicador diferido para terminar de procesar la interrupción e impedir que la ISR ignore las interrupciones futuras.
El archivo /proc/interrupts lista el número de interrupciones por CPU por dispositivo de E/S. Muestra el número de IRQ, el número de dicha interrupción manejada por cada núcleo de CPU, el tipo de interrupción y la lista delimitada por comas de controladores registrados para recibir esa interrupción. (Para obtener mayor información, consulte la página de manual: man 5 proc)
Las IRQ tienen la propiedad de "afinidad", smp_affinity, que define los núcleos de CPU permitidos para ejecutar la ISR de dicha IRQ. Esta propiedad puede servir para mejorar el rendimiento de aplicaciones al asignar tanto afinidad de interrupciones como afinidad de hilos de aplicaciones a uno o más núcleos de CPU específicos. Así permite compartir la línea de cache entre aplicaciones de interrupciones e hilos.
El valor de afinidad de interrupciones para un número IRQ específico, es almacenado en el archivo /proc/irq/NÚMERO_IRQ/smp_affinity asociado, el cual se puede ver y modificar mediante el usuario de root. El valor almacenado en estee archivo es una máscara de bits hexadecimal que representa todos los núcleos de CPU en el sistema.
A manera de ejemplo, para establecer la afinidad de interrupciones para el controlador de Ethernet en un servidor con cuatro núcleos de CPU, primero determine el número IRQ asociado con el controlador de Ethernet:
# grep eth0 /proc/interrupts
32:   0     140      45       850264      PCI-MSI-edge      eth0
Use el número de IRQ para localizar el archivo apropiado de smp_affinity:
# cat /proc/irq/32/smp_affinity 
f
El valor predeterminado para smp_affinity es f, lo que significa que la IRQ puede servirse de las CPU en el sistema. Si configura este valor a 1, como se muestra a continuación, significa que solamente la CPU 0 puede servir esta interrupción:
# echo 1 >/proc/irq/32/smp_affinity
# cat /proc/irq/32/smp_affinity
1
Las comas pueden servir para delimitar los valores de smp_affinity para grupos de 32 bits. Esto se requiere en sistemas con más de 32 núcleos. Por ejemplo, el siguiente ejemplo muestra que la IRQ 40 se sirve en todos los núcleos de un sistema de núcleos de 64:
# cat /proc/irq/40/smp_affinity
ffffffff,ffffffff
Para servicio IRQ 40 solamente en los núcleos superiores a 32 de un sistema de núcleos de 64, debe hacer lo siguiente:
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity
# cat /proc/irq/40/smp_affinity
ffffffff,00000000
Nombre

 Int (hex)

XT: Descripción
AT: Descripción
NMI
---
        Paridad*
Paridad*
0
08
        Temporizador*
Temporizador*
1
09
        Teclado*
Teclado*
IRQ2
0A
         Reservado
 Interrupciones 8 a 15 (PIC#2)
IRQ3
0B
Puertos serie COM2/COM4
 Puerto serie COM2/COM4
IRQ4
0C
Puertos serie COM1/COM3
 Puertos serie COM1/COM3
IRQ5
0D
          Disco duro
 Impresora secundaria LPT2
IRQ6
0E
           Disquete
 Disquete
IRQ7
0F
  Impresora primaria LPT1
 Impresora primaria LPT1
8
70
           No aplicable
 Reloj de tiempo real*
9
71
           No aplicable
 Redirigido a IRQ2*
IRQ10
72
           No aplicable
 no asignado
IRQ11
73
           No aplicable
 no asignado
IRQ12
74
           No aplicable
 Ratón PS2
13
75
           No aplicable
 Coprocesador 80287*
IRQ14
76
           No aplicable
 Contr. disco IDE primario
IRQ15
77
           No aplicable
 Contr. disco IDE secundario


tipos de interrupciones

IRQ 0: cronómetro del sistema. Este interruptor está reservado para el timer del sistema y jamás está disponible para otros dispositivos. 
IRQ 1: controlador del teclado. 
IRQ 2: Interrupciones en cascada para las interrupciones IRQ del 8 al 15. 
IRQ 3: Segundo Puerto Serie (COM2). A menudo es también para el cuarto puerto serie (COM4). 
IRQ 4: Primer Puerto Serie (COM1). También es utilizado por defecto para el COM3. 
IRQ 5: Tarjeta de sonido. 
IRQ 6: Controlador de disquetera. 
IRQ 7: Puerto Paralelo LPT1 para impresoras o cualquier otro dispositivo que utiliza puerto paralelo. 
IRQ 8: Reloj del Sistema. 
IRQ 9, 10, 11: Interrupción disponible para periféricos extras. 
IRQ 12: Mouse PS/2 o Placa de Red o similares. 
IRQ 13: Coprocesador/Unidad de punto flotante 
IRQ 14: Canal IDE Primario. En sistemas que no se utiliza dispositivos IDE, este canal se utiliza para otros periféricos 
IRQ 15: Canal IDE Secundario 

sistemas de prioridad
* Interrupciones simultáneas: No tienen por qué ocurrir de manera simultánea sino que se refiere a que en un momento dado puede haber varias interrupciones activas.

* Interrupciones anidadas: Mientras se está procesando una determinada rutina de servicio de interrupción sucede otra señal de interrupción.

* Inhibición de interrupciones: Se deshabilitan las interrupciones mientras se está tratando una.


fuentes que genera la interrupcion
La primera alternativa que se consideró fue asignar una línea (un bit) para cada interrupción pero esto suponía un gran costo en cuanto a la relación nº de dispositivos y nº de bits usados y a menudo fijaba el límite de dispositivos que se podían conectar. Por tanto se pensó con posterioridad que en cada patilla de interrupción deberían poder conectarse más de un dispositivo pero entonces tendríamos que imponer una metodología que nos permitiese identificar de forma unívoca de qué dispositivo se trata. Para ello se han dado varias directrices que a continuación vamos a analizar de manera más detallada:
  • "Polling": Se trata de que la CPU comprueba de manera sistemática todos los dispositivos de manera que "busca" cuál de ellos fue el que solicitó la interrupción. Esto tiene una ventaja y es que es barato a nivel de coste hardware ya que el "polling" se implementa en software, no obstante tiene otras desventajas que no podemos olvidar y es que suele ser lento porque tiene que comprobar en serie todos los dispositivos y establece una prioridad en los dispositivos (el orden de sondeo) y por tanto puede provocar inanición.
  • Interrupciones vectorizadas: Este concepto fue ya tratado en el apartado anterior y como ventajas podemos destacar que suele ser rápido pero implica un alto coste en el hardware.
  • Hardware paralelo: Se utiliza un registro de interrupción cuyos bits se controlan de forma independiente por las señales de petición de interrupción PIi de cada periférico. Según la posición de cada bit en el registro, se establece la prioridad.

No hay comentarios:

Publicar un comentario