Comment les premiers microprocesseurs ont-ils été programmés?

44

Je viens de me rendre compte que si vous écrivez un système d'exploitation, comment l'écrivez-vous? Je pose la question alors que je lis un livre sur les principes fondamentaux des microprocesseurs de 1980 et que cette question m’a surgi:

Comment la première puce de microprocesseur a-t-elle été programmée?

La réponse est peut-être évidente mais sa me dérange.

doyen
la source
6
Si je suis autorisé à connecter mon propre travail, voir ma réponse à "Comment le noyau Linux peut-il se compiler?" débordement de pile . La réponse n’est pas évidente tant que vous n’avez pas compris le principe général. À ce stade, vous direz "Eh bien, bien sûr ..."
dmckee
@dmckee Mais cela ne répond toujours pas à la question: comment a-t-il su quoi faire :) qui a dit à l'ordinateur avec les commutateurs quoi faire? Je veux un peu plus de détails.
Dean
4
La question concerne donc la conception de la séquence de démarrage de la première puce? Eh bien, c’est certainement une question qui appartient à ce site, mais cela procède comme si vous conceviez une logique numérique construite à partir de composants ... faites-la démarrer dans un état connu, puis alimentez-la avec des entrées utiles. Je vais laisser à d' autres de fournir la réponse détaillée, parce que je suis fragile à ce sujet , mais vous ne sais que les premiers ordinateurs ont été mis en œuvre dans des tubes à vide, non? Ensuite, il y avait une génération de transistors individuels, tous avant la première puce. Les ingénieurs savaient déjà ce qu'ils faisaient.
dmckee
1
Sur les processeurs non-micro, bien sûr.
user253751

Réponses:

56

Je vais prendre votre question à la lettre et discuter principalement des microprocesseurs, pas des ordinateurs en général.

Tous les ordinateurs ont une sorte de code machine. Une instruction consiste en un opcode et un ou plusieurs opérandes. Par exemple, l'instruction ADD pour Intel 4004 (le tout premier microprocesseur) a été codée en tant que 1000RRRR, où 1000 est le code opération pour ADD et RRRR représente un numéro de registre.

Les tout premiers programmes informatiques ont été écrits à la main, codant à la main les 1 et les 0 pour créer un programme en langage machine. Ceci est ensuite programmé dans la puce. Les premiers microprocesseurs utilisaient une ROM (Read-Only Memory); elle a ensuite été remplacée par EPROM (mémoire effaçable programmable effaçable à la lumière ultraviolette); à présent, les programmes sont généralement programmés dans une EEPROM ( "Electrically ...- EPROM" , qui peut être effacée sur une puce), ou plus précisément dans une mémoire Flash.

La plupart des microprocesseurs peuvent maintenant exécuter des programmes en dehors de la RAM (c'est à peu près standard pour tout sauf les microcontrôleurs), mais il doit y avoir un moyen de charger le programme dans la RAM en premier lieu. Comme Joby Taffey l'a souligné dans sa réponse, cela a été fait avec des commutateurs à bascule pour l'Altair 8080, qui était alimenté par un Intel 8080 (qui suivait les modèles 4004 et 8008). Dans votre PC, il existe un peu de ROM appelée BIOS qui est utilisée pour démarrer l’ordinateur et charger le système d’exploitation dans la RAM.

Le langage machine devient rapidement fastidieux, c'est pourquoi des programmes d'assembleur ont été développés, qui prennent un langage d'assembleur mnémonique et le traduisent, généralement une ligne de code d'assemblage par instruction, en code machine. Ainsi, au lieu de 10000001, on écrirait ADD R1.

Mais le tout premier assembleur a dû être écrit en code machine. Ensuite, il pourrait être réécrit dans son propre code assembleur et la version en langage machine l’assemblerait pour la première fois. Après cela, le programme pourrait se monter tout seul. Cela s'appelle amorçage et est également effectué avec les compilateurs - ils sont généralement d'abord écrits en assembleur (ou dans un autre langage évolué), puis réécrits dans leur propre langage et compilés avec le compilateur original jusqu'à ce que le compilateur puisse se compiler lui-même.

Depuis que le premier microprocesseur a été développé longtemps après que les ordinateurs centraux et les mini-ordinateurs étaient sur le marché, et que le 4004 n’était de toute façon pas vraiment adapté pour exécuter un assembleur, Intel a probablement écrit un assembleur croisé fonctionnant sur l’un de ses grands ordinateurs, et a traduit le code d’assemblage pour 4004 en une image binaire pouvant être programmée dans la ROM. Encore une fois, il s’agit d’une technique couramment utilisée pour porter les compilateurs sur une nouvelle plate-forme (appelée compilation croisée ).

tcrosley
la source
Super réponse, tcrosley! Correction d'une friandise sur EEPROM vs EPROM. +1
jeudi
1
Et si vous vouliez vraiment programmer un microcontrôleur sans autre ordinateur (en dehors de votre cerveau), vous pouvez le faire en construisant un circuit alimentant directement le programme. Si a été programmé sur jtag, vous pouvez actionner des commutateurs pour imiter les commandes jtag nécessaires à la programmation du périphérique. Si elle utilisait une mémoire vive externe, vous pourriez utiliser de nombreux démultiplexeurs et d'énormes matrices de résistances liées haut ou bas pour représenter les bits des instructions (et probablement utiliser une vitesse d'horloge basse car votre matériel sera lent).
nategoose
3
@tyblu: Je suis à peu près certain que les Fuse-PROM ont précédé les EPROM. La forme de ROM la plus simple est essentiellement un réseau de diodes sélectivement peuplé (au début, les diodes étaient littéralement soudées sur une grille pour représenter une polarité de bit; une diode manquante représentant l'autre polarité). Une PROM à fusible place un tableau de diodes sur une puce, mais comporte des transistors en ligne beaucoup plus costauds que les diodes aux intersections. On peut supprimer sélectivement les diodes en réglant les fils d’adresse, puis en tapant très fort sur les fils de données connectés aux diodes que l’on veut supprimer.
Supercat
@tyblu: notez que les PROM fuse ne sont électriquement rien comme les OTPROM modernes, qui sont simplement des puces EPROM dans des paquets non fenêtrés. Les dispositifs EPROM / OTP sont programmés en chargeant électriquement les grilles de certains transistors (qui ont une capacité suffisante et peu de fuites pour contenir une charge essentiellement indéfiniment). En revanche, les puces Fuse-PROM sont programmées en détruisant physiquement les connexions aux diodes indésirables.
Supercat
1
Découvrez cette 'ROM' du temps des transistors discrets: en.wikipedia.org/wiki/Core_rope_memory
JustJeff
23

À l’origine, les programmes étaient écrits sur papier, puis transposés selon la méthode de saisie disponible. Cela allait des boutons, commutateurs et câbles de démarrage des premiers ordinateurs aux cartes perforées aux claviers / cartes.

L'illustration ci-dessous montre ce que les vrais programmeurs actuels utilisent:

W5VO
la source
10
Dammit, emacs ..
mardi
6
Je programme des programmeurs. (Et ces programmeurs, je programme des programmeurs qui programment des programmeurs.)
Mateen Ulhaq
4
Je fais mes propres programmeurs.
W5VO
16

Eh bien, j’étais là lorsque les micros sont apparus, nous avons écrit des assembleurs croisés et des compilateurs sur des ordinateurs centraux et des mini-ordinateurs, puis nous les avons installés sur du matériel 8 bits. le rendre utile

Paul
la source
14

L'une des premières formes de mémoire en lecture seule consistait en une grille dans laquelle l'adresse sélectionnerait une ligne (la tirant vers le bas) et où les colonnes représentaient des données. Chaque colonne aurait un pull-up, et chaque intersection aurait une diode soudée pour représenter un "zéro", ou aucune diode pour représenter un "un" [niveaux de bits pourraient être inversés si désiré, dans les cas où cela réduirait la nombre de diodes requis]. Tout type de bits souhaité peut être "programmé" en soudant les diodes appropriées.

Cette conception a été introduite dans le monde des circuits intégrés sous la forme d'une PROM à fusible. Une PROM de fusible était essentiellement un circuit semblable au précédent, construit sur une puce, sauf que toutes les diodes étaient remplies et que chaque diode avait un fusible faible en série. À la livraison, une PROM indiquait "0" à tous les emplacements. On pourrait toutefois supprimer sélectivement les diodes en sélectionnant l'adresse appropriée et en pilotant les lignes de données appropriées "difficiles" [remarque: je pense que chaque bit peut avoir son propre transistor, plutôt qu'une diode, mais le principe est le même].

Les mémoires à semi-conducteurs succèdent aux PROM programmées par fusible, qui stockent des bits en implantant des charges sur des condensateurs internes. Non seulement ces mémoires sont plus compactes que les PROM à fusible, mais si elles sont logées dans des emballages transparents aux UV, elles peuvent être effacées et réutilisées. Notez que même les mémoires dites "programmables une fois" utilisent presque toujours cette même conception, mais sont simplement logées dans des emballages opaques aux UV.

deux hommes pointant vers une grande matrice de diodes Magasin de contrôle à matrice de diodes du Whirlwind Computer 1950 MIT

transistor-matrice avec de minuscules transistors SMD magasin de contrôle transistor-matrice de 2005, le processeur MT15

supercat
la source
J'espère que ça ne vous dérange pas le petit tweak que j'ai fait à votre post.
davidcary
7

Je ne suis pas sûr que quiconque ait répondu à la vraie question du PO, qui semble être "Comment l'ordinateur sait-il comment démarrer?" , alors je vais prendre une fissure à elle.

Commencez par une analogie. "Comment un transistor sait-il comment s'y prendre?" Bien sûr, ce n'est pas le cas, cela fonctionne simplement en conformité avec la physique, et l'ingénieur construit le circuit pour qu'il démarre dans un état connu.

Les ordinateurs savent se lancer car ce sont des circuits (très compliqués, bien sûr) et ils sont conçus pour démarrer dans un état particulier. Sur une machine moderne, il peut s'agir d'un état dans lequel le bus principal remappe une partie de l'espace d'adressage pour utiliser une mémoire ROM de la carte mère en tant que mémoire faible (la mémoire ROM ayant été gravée avec un BIOS). Sur une machine de première génération, l’état initial aurait pu être arrêté par le processeur, le compteur du programme à zéro et le sous-système bascule-mémoire actif.

dmckee
la source
6

Un système d'exploitation est un programme informatique qui s'exécute directement sur le processeur. Il peut être écrit dans n’importe quel langage qui peut être compilé ou assemblé selon les instructions de la machine. Assembly et C sont des choix communs.

Le code est chargé dans les processeurs une seule instruction à la fois depuis un magasin - une ROM ou une RAM.

Le Z3 , le premier processeur programmable, était construit à partir de relais électromécaniques et lisait les instructions à partir de films perforés.

L'Altair 8800, le premier ordinateur personnel, a été programmé par des commutateurs à bascule.

Pour savoir comment un processeur est construit à partir de la logique numérique, voir https://electronics.stackexchange.com/questions/5516/a-fun-book-to-learn-computer-architecture-for-not-exactly-beginners

Pour une histoire, voir http://en.wikipedia.org/wiki/History_of_computing_hardware

Toby Jaffey
la source
5

Voici un peu de très vieux ordinateurs:

Autant que je sache, à l'époque, vous disposiez d'un grand panneau avant d'ordinateur qui était utilisé pour les programmer. En gros, chaque cellule de mémoire de ces ordinateurs était connectée à des commutateurs. Vous souhaitez alimenter la mémoire, puis utiliser des commutateurs pour définir les données dans chaque cellule. De cette façon, vous introduisez le programme petit à petit dans la mémoire de l'ordinateur. Ensuite, vous définissez le point de départ du programme et démarrez son exécution.

Au fur et à mesure que la technologie progressait, des programmes dits de chargeur de démarrage ont été développés. Ce sont des programmes courts dont le but est de démarrer un autre programme à partir de la mémoire de l'ordinateur. Le problème pour entrer les programmes petit à petit (et plus tard, plus d'un bit utilisant des nombres octaux et hexadécimaux ultérieurs) était que cela était très lent et qu'il y avait de grandes chances que l'opérateur fasse une erreur lors du chargement du programme. Ainsi, des programmes courts seraient utilisés pour charger des programmes plus volumineux stockés dans la mémoire de l'ordinateur. Au fil du temps, la portion de code qui devait être saisie à la main a diminué et dans les ordinateurs modernes, les chargeurs de démarrage sont souvent écrits dans une sorte de ROM ou même dans une mémoire flash.

AndrejaKo
la source
4
Sur les machines du panneau avant, comme les systèmes S-100 antérieurs, les commutateurs vous permettent de contrôler le bus système. Un commutateur vous permettrait de suspendre le processeur. Pendant que le processeur était suspendu, vous pouviez alors mettre manuellement une adresse sur le bus d’adresses (via des commutateurs), placer des données sur le bus de données (plusieurs commutateurs), puis provoquer manuellement un cycle d’écriture sur le bus (un autre commutateur), ou un cycle de lecture pour extraire les données sur 8 DEL individuelles et lire le fichier binaire, etc. Ce faisant, vous pouvez stocker suffisamment de code machine dans la mémoire vive, annuler la suspension du processeur et commencer à partir de là.
JustJeff
4

Il y a quelques années, je suis tombé sur un programmateur à microcontrôleur doté d'un afficheur à sept chiffres à 4 chiffres et d'un clavier hexadécimal. Je suis sûr que cela n’avait pas de microcontrôleur à bord et vous permettait de saisir directement le code machine octet par octet.

Cela vous permettrait donc de compiler (douloureusement) une liste de codes d'opération manuellement un par un et de les entrer dans la puce.

Je ne sais pas si vous pouvez toujours les obtenir, mais je suppose que quelque chose de similaire a été utilisé à l'époque où les microcontrôleurs étaient relativement nouveaux.

BG100
la source
1
Cela ressemble peut-être au KIM-1 ou au Cosmac ELF, qui incluaient tous deux un microprocesseur (MOS 6502 et RCA [CD] 1802). KIM: oldcomputers.net/kim1.html ELF: cosmacelf.com
mctylr le
C'était probablement quelque chose comme ce que disait mctylr. Dans les machines de ce type, il y avait généralement un petit programme "moniteur" en ROM. Lorsque vous entrez des octets avec le clavier, c’est bien le 6502 (ou 8085 ou autre) qui lit les touches, modifie la mémoire, met à jour les voyants, etc.
JustJeff
1

Les premiers microprocesseurs auraient été programmés à l'aide d'ordinateurs existants non basés sur des microprocesseurs. Avant que le premier processeur ne soit produit sur une puce, il existait déjà des architectures informatiques avancées, construites à partir de composants discrets plutôt que de microprocesseurs. Regardez, oh, disons, IBM 360.

Kaz
la source