Pregunta

En el manual Intel desarrolladores de software que dice que los vectores de interrupción 32-255 suelen ser definido por el usuario para los dispositivos IO externos. En mi clase de programación de sistemas debo desarrollar un controlador de dispositivo simple. Mi pregunta es ¿cómo puedo definir un vector de interrupción específico que se utilizará para un dispositivo específico? Se hace esto con el BIOS?

Nota: estamos desarrollando un sistema operativo sencillo por lo que mi situación es bastante específico, sin embargo, al final lo que entender cómo todo esto sucede en un sistema x86. Actualmente nuestro sistema está configurado para que unos pocos vectores de interrupción por encima de 32 se asignan a dispositivos como un puerto serie y el teclado. Al leer la hoja de datos del controlador IO ICH5 Intel 82801EB, específicamente la sección relativa a los PICs 8259, se dice que IRQ15 es el canal IDE secundario. ¿Cómo que con el tiempo pueden poner en la pila como un vector de interrupción?

Puede que acaba de ser tan confusa que esta pregunta no tiene sentido, por lo que me disculpo de antemano.

EDIT: Entonces nuestra clase de programación de sistemas tiene un sistema operativo muy simple, que tiene rutinas del núcleo para la instalación de ISR para manejar las interrupciones específicas, dado el número de vectores. En nuestra clase último trimestre el profesor nos dio un archivo de cabecera que define el teclado como 0x2c número de vectores o algo similar. Estoy tratando de averiguar cómo asignar el canal IDE primario y / o secundario interrumpe para diversos ISR utilizando nuestras rutinas del núcleo. Por ahora, todos los vectores de interrupción no utilizados tienen un controlador predeterminado que imprimir mensajes si se ha producido una interrupción, por lo que las interrupciones IDE no son ni siquiera en este momento, sin embargo, que es otra cuestión.

¿Fue útil?

Solución 5

Bueno, parece que he encontrado la respuesta en nuestro código de apoyo, específicamente la rutina de inicialización PIC. Con las siguientes líneas de código de IRQ se asignan a las 20h offset y 28h en el IDT para los maestros y esclavos PICs, respectivamente.

/* ICW2: master offset of 20 in the IDT, slave offset of 28 */

__outb( PIC_MASTER_IMR_PORT, 0x20 );
__outb( PIC_SLAVE_IMR_PORT, 0x28 );

Esto significa que el teclado se asigna a número vector 2c y los canales primarios y secundarios se asignará a 2e y 2f, respectivamente. Algunos de ustedes probablemente podría me han dado mejores respuestas tenían hice la pregunta mejor, pero aprecio la ayuda de todos modos!

La Tabla 45 de la ficha técnica 82801EB ICH5 los datos del 8259 líneas IRQ, y en mi sistema operativo del maestro es simplemente cargado a las 20h offset y el esclavo es 28h.

Gracias!

Otros consejos

Puede programar (controlador de interrupciones programable) del PIC para asignar cierto dispositivo de IRQ.

En x86, hay dos PIC de los cuales están conectados en cadena dando IRQ0-IRQ17. IRQ0-7 es administrado por el 8259 y IRQ8-15 por un segundo 8259. Las primeras señales de la CPU y es el principal, con el segundo (el esclavo) de señalización de la primera.

El IDT (tabla de descriptores de interrupción) mapea las interrupciones a las direcciones de ISR (rutinas de servicio de interrupción). Las interrupciones pueden ser planteadas directamente con la instrucción INT (trampas de software).

Por ejemplo, para elevar interrupción 0x80, ejecutar INT 0x80.

Para manejar 0x80, mov [0x80*4], int_80_handler. Suponiendo una arquitectura de 32 bits, la dirección de la función int_80_handler se almacena ahora en la ubicación 0x80'th en el IDT.

Los encontrará útil:
http://en.wikipedia.org/wiki/Intel_8259
http://en.wikipedia.org/wiki/Interrupt_Handler
http://en.wikipedia.org/wiki/Interrupt
http://en.wikipedia.org/wiki/Interrupt_descriptor_table

Ha sido un tiempo desde que he tratado con este material por lo que este puede ser apagado: Recuerdo que el controlador de interrupciones PC tiene 15 líneas IRQ. Estos mapa para x86 adyacentes específicos vectores de interrupción. Así que cuando un periférico desencadena una línea IRQ, el PIC interrumpe la CPU y le dice qué vector para saltar a, como si se ejecuta la instrucción INT correspondiente. Algunos IRQ están codificados a ciertos periféricos, pero creo que los dispositivos PCI negocian con el sistema operativo para IRQ y algunos otros recursos (al igual que el legado dispositivos ISA PnP).

No entiendo qué quiere decir con "¿Cómo que con el tiempo pueden poner en la pila como un vector de interrupción?

Hay dos maneras posibles de un dispositivo para conseguir una interrupción:

  1. Utilice la función Plug and Play o mecanismo de PCI. Si lo hace el BIOS llamará a su equipo periférico y pregunte por las necesidades de recursos. Posteriormente el conductor puede enumerar los dispositivos plug-and-play, buscar el dispositivo compatible y obtener la interrupción de hardware del dispositivo.

  2. ¿Cómo se ha hecho en los primeros días: Sólo tiene que utilizar una interrupción. Añadir un dip-switch al dispositivo que permite al usuario seleccionar entre diferentes interrupciones. La asignación de recursos está en manos de los usuarios ahora. El usuario también pasará el número de interrupción al controlador en tiempo de carga de alguna manera.

Ahora cómo conectar la interrupción:. Eso depende del sistema operativo y el modo de la X 86 está funcionando en caso de un sistema de hueso desnudo, desnudo puede consultar el IDT (Interrupt Descriptor Table) a través de una instrucción especial. Una vez que tenga que IDT se puede obtener la dirección y meter la dirección del manejador de IRQ en la ranura correcta. Para el modo real, no sé cómo se hace más.

Si usted tiene por lo menos un poco de tiempo real del sistema operativo OS o algo similar en funcionamiento, lo más probable es que ya hay una función kernel que hace el trabajo duro para usted.

Por lo que recuerdo hay una tabla de vectores en el comienzo del espacio de memoria que apunta a la rutina para llamar cuando se produce una interrupción específica. Puede que estará llegando a un nivel demasiado bajo aquí (antiguo programador Asamblea x 86) pero a nivel de base que obtenga su vector instalado en esa tabla a continuación, su rutina se llama. Yo no tengo nada de mi material de referencia de edad conmigo por lo que no le puede dar las llamadas reales, pero me sorprendería si el método oficial funciona fuera de la BIOS.

En estos días de interfaces gráficas de usuario Estoy seguro de que hay otros métodos más apropiados, que permiten compartir interrupciones y todas esas cosas buenas.

EDIT: No haga caso de la mayor parte de eso, acabo de ver que usted está buscando en la interrupción 16 y por encima de los cuales están fuera de las interrupciones de hardware. Me alejé de ese nivel de la programación antes de que hubiera cosas interesantes de hardware en ese espacio por lo que sólo ha tratado con los primeros 15 IRQ (el 16 siendo la cascada entre los controladores). Lo dejo por si acaso que es de interés para cualquier persona:)

INT 21h / AH = 25h - conjunto de vectores de interrupción; entrada: AL = número de interrupción. DS:. DX -> lo nuevo controlador de interrupción

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top