Cada procesador tiene su propia unidad de gestión de memoria con una memoria tampón de traducción. Esto es necesario porque cada núcleo podría estar ejecutando un proceso diferente que tiene un espacio de direcciones diferente.
Los múltiples núcleos pueden manejar independientemente interrupciones/excepciones al mismo tiempo. Por lo tanto, puede haber múltiples contextos de interrupción simultáneos ejecutándose en un kernel al mismo tiempo.
Una excepción como un error de página o una división por cero siempre se manejará en el mismo procesador en el que se produjo, ya que se trata de lo que está haciendo ese procesador.
Las interrupciones externas normalmente pasan por algún tipo de cambio de estructura que les permite mapearse de alguna manera, estática o dinámicamente. P.ej. el "APIC" en hardware de PC.
Si la tela es lo suficientemente sofisticada, las interrupciones pueden reprogramarse para un objetivo diferente sobre la marcha.
Depende de la arquitectura. Una arquitectura simplista podría, por ejemplo, vincular todas las interrupciones externas a un núcleo. Sin embargo, eso no sería muy simétrico; no permitiría el equilibrio de carga IRQ.
(También tenga en cuenta que es útil que ocurran ciertas interrupciones externas en todos los procesadores. Si cada núcleo tiene su propio temporizador de interrupción, entonces el manejo del tiempo en el programador es simétrico: hay no hay manejo de casos especial para un núcleo principal frente a los demás. Se activa una interrupción, el núcleo ejecuta el código del planificador y si el tiempo de la tarea actual está activo, elige otra tarea para ejecutar en ese núcleo).
De nuevo, por favor, eche un vistazo a Barrelfish como ejemplo para múltiples kernels. Un enfoque de kernel monolítico no escala mucho más allá de cientos de núcleos. – mensi
@mensi - Por supuesto, pero sentí que el OP se refería más a sistemas operativos mainstreams, particularmente a Linux, ya que incluía esa etiqueta. Y AFAIK cientos de núcleos aún no son un problema de escalabilidad ... – rodrigo