Question

En mode réel sur x86, quelles instructions faut-il utiliser pour exécuter le code sur un processeur différent, dans un système multiprocesseur?

(J'écris un code de pré-démarrage dans l'assembleur qui doit définir certains registres de CPU, et ce, sur chaque CPU du système, avant que le système d'exploitation ne démarre.)

Était-ce utile?

La solution

Vous avez donc un programme autonome (vous avez dit le "pré-amorçage"), comme un chargeur de démarrage, fonctionnant en mode réel? Et ceci est sur un PeeCee avec le BIOS habituel?

Dans ce cas, un seul processeur est en cours d'exécution. Afin d’activer les autres unités centrales, un système d’exploitation exécutera ce que l’on appelle l’algorithme de démarrage universel , qui se présente comme suit:

BSP sends AP an INIT IPI
BSP DELAYs (10mSec)
If (APIC_VERSION is not an 82489DX) {
  BSP sends AP a STARTUP IPI
  BSP DELAYs (200μSEC)
  BSP sends AP a STARTUP IPI
  BSP DELAYs (200μSEC)
}
BSP verifies synchronization with executing AP

Le BSP est le processeur de démarrage. Un AP est un processeur d'application. Un IPI est une interruption entre processeurs. Pour effectuer une IPI, vous devez activer APIC, une extension du contrôleur d'interruption de l'architecture du PC qui n'est pas activée au démarrage. C'est pourquoi le code s'inquiète du type de version d'ICU utilisé. Tout cela est une magie de noyau assez profonde. Vous pouvez essayer de regarder Linux, NetBSD ou un autre code source * BSD pour un exemple, mais ce ne sera pas facile à lire. Si vous gagnez vraiment, vous pourriez trouver un petit programme de test SMP autonome ou autonome quelque part.

Pour plus d'informations, consultez la Spécification du multiprocesseur Intel .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top