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.
microprocessor
doyen
la source
la source
Réponses:
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 ).
la source
À 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:
la source
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
la source
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.
Magasin de contrôle à matrice de diodes du Whirlwind Computer 1950 MIT
magasin de contrôle transistor-matrice de 2005, le processeur MT15
la source
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.
la source
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
la source
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.
la source
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.
la source
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.
la source