61 votes

Pourquoi la première instruction du BIOS est-elle située à 0xFFFFFFF0 ("haut" de la RAM) ?

Je sais que le BIOS charge sa première instruction à partir de 0xFFFFFFF0, mais pourquoi cette adresse spécifique ? J'ai un tas de questions et j'espère que vous pourrez m'aider avec certaines d'entre elles, au moins.

Mes questions :

  • Pourquoi la première instruction du BIOS est-elle située au "sommet" d'une RAM de 4 Go ?
  • Que se passe-t-il si mon ordinateur ne dispose que de 1 Go de RAM ?
  • Qu'en est-il des systèmes dotés de plus de 4 Go de RAM (par exemple, 8 Go, 16 Go, etc.) ?
  • Pourquoi la pile est-elle initialisée avec une certaine valeur (dans ce cas, une valeur située à 0xFFFFFFF0) ?

J'ai lu ce sujet cet après-midi, et je ne comprends toujours pas.

3voto

Lors du RESET, un processeur compatible 8088/8086 exécute les instructions à 0FFFF0, soit 16 octets en dessous de la limite de 1 mégaoctet. Normalement, la ROM à cet endroit (dans les implémentations PC) serait le BIOS, donc à la fin de la ROM du BIOS, il y a un saut au début de la ROM du BIOS.

montré ici : vecteur de départ et signature 'date' derrière, IBM 5150 PC 8KB eprom dump bios date : 10/19/1981

00001FEE  FF                db 0xff
00001FEF  FF                db 0xff
00001FF0  EA5BE000F0        jmp word 0xf000:0xe05b
00001FF5  3130              xor [bx+si],si
00001FF7  2F                das
00001FF8  3139              xor [bx+di],di

Notez que l'adressage est celui d'une rom 8KB $2000, qui place l'adresse de départ (le JMP le plus éloigné en valeur absolue, vers n'importe quel autre emplacement, dans ce cas au sein de la rom 8KB elle-même, bien que ce ne soit pas l'adresse la plus basse possible au sein de cette rom) à $FFFF:$0 segmenté ou $FFFF0 linéaire.

en ce qui concerne la compatibilité : si un processeur actuel ou futur "s'attend" à ce qu'il y ait beaucoup plus de F devant l'adresse, cela n'a pas d'importance. pour la compatibilité des nouveaux processeurs dans les anciens systèmes, les lignes d'adresse supplémentaires ne sont pas connectées et les données sur le bus de données sont exactement les mêmes. tant que les bits les moins significatifs restent FFFF0.

(dans un système avec seulement 1 Mo de RAM et la ROM positionnée à la fin de cette RAM, et rien d'autre, il sera heureux de "penser" qu'il parle à l'adresse la plus élevée tout en obtenant exactement les mêmes données, parce que ces implémentations n'ont jamais entendu parler de lignes d'adresses supérieures à A19).

prenez note que le monde ne se résume pas aux "pc"... le pc ibm était un "accident", ces processeurs n'ont jamais été conçus spécifiquement pour les "pc" et sont utilisés dans beaucoup d'autres choses que les pc (comme les satellites, les systèmes d'armes, etc.). Les modes protégés 32 et 64 bits ne sont généralement pas souhaités. (le mode 8086 virtuel est beaucoup plus intéressant comme raison de choisir une version plus récente (386+) par exemple). par conséquent, la rétrocompatibilité est beaucoup plus importante que le simple fait de savoir si le système fonctionnera avec dos.

1voto

viktorkh Points 11

La carte mère s'assure que l'instruction au vecteur de réinitialisation est un saut vers l'emplacement mémoire mappé au point d'entrée du BIOS. Ce saut efface implicitement l'adresse de base cachée présente à la mise sous tension. Tous ces emplacements mémoire ont le bon contenu nécessaire au CPU grâce à la carte mémoire conservée par le chipset. Ils sont tous mappés à la mémoire flash contenant le BIOS puisqu'à ce stade, les modules de mémoire vive contiennent de la merde aléatoire.

1voto

La famille iAPx86 est un jeu de puces générique qui a été utilisé dans un grand nombre de choses autres que le PC d'IBM (qui a décidé par hasard d'acheter simplement le jeu de puces d'Intel (bien qu'il ne s'agisse pas de l'ensemble complet tel qu'Intel voulait l'utiliser) et de construire un PC à partir de celui-ci).

avoir l'adresse de départ en haut (l'adresse de départ devrait toujours être rom) supprime le besoin de décoder les lignes d'adresses supplémentaires (vous pouvez simplement prendre un 8088, une logique de démultiplexage de bus, et une rom de 512 octets (oui, ce sont des octets, pas des kilo ou des méga ;), la brancher de $0000-$0200 et l'adresse de départ sera toujours $001F0 (les bits du haut sont tous à '1', les bits du bas sont tous des zéros). en laissant simplement le reste du bus d'adresse non connecté.

la grande majorité des familles de processeurs ont des vecteurs de réinitialisation ou une adresse de départ aux emplacements d'adresse les plus élevés. dans les systèmes qui n'ont pas seulement une rom mais aussi une ram, vous placez normalement la ram en bas et la rom en haut (si le système est censé être extensible dans l'un ou l'autre aspect, laissant un vide au milieu ;)

i/o a sa propre broche de sélection et ses propres instructions (IN/OUT) et ne fait donc pas partie de l'espace d'adressage normal dans la plupart des implémentations intel iAPx86.

mais bref, une histoire courte : 11111111111110000 est toujours 'quelques 1 suivis de 4 zéros'. donc l'adresse 16 la plus élevée que vous avez dans votre rom. si le cpu veut '1111111111110000' et que vous avez seulement des lignes '111110000' connectées, c'est toujours la même chose pour le cpu. pas besoin de décoder le reste des broches du bus.

-1voto

Harry Helm Points 1

Parce que lorsque l'espace d'adressage augmente dans le matériel, le programme bios n'a pas besoin d'être mis à jour. Même si la mémoire du bios lui-même est augmentée, pas besoin de mettre à jour le code du bios. C'est une exploitation du fait que le bus d'adresse est tiré à la masse et sera des 1 si le décodeur d'adresse ne les tire pas vers le haut à VCC. Logiquement les 1 sont électriquement 0 et logiquement les 0 sont électriquement 1 sur le bus d'adresse.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X