Ich habe vor kurzem begonnen, Charles Petzolds Buch mit dem Titel Code zu lesen, das bisher genau die Dinge behandelt, von denen ich annehme, dass Sie neugierig sind. Aber ich habe nicht den ganzen Weg durchgemacht, also blättern Sie zuerst durch das Buch, bevor Sie kaufen/leihen.
Dies ist meine relativ kurze Antwort, nicht Petzolds ... und hoffentlich im Einklang mit dem, worüber Sie neugierig waren.
Sie haben von dem Transistor gehört, den ich vermute. Die ursprüngliche Art, einen Transistor zu verwenden, war für Dinge wie ein Transistorradio. es ist im Grunde genommen ein Verstärker, der das winzige Funksignal in der Luft schwebt und es in den Eingang des Transistors einspeist, der den Stromfluss auf einer Schaltung neben ihm öffnet oder schließt. Und Sie verdrahten diese Schaltung mit höherer Leistung, so können Sie ein sehr kleines Signal nehmen, es verstärken und es zum Beispiel einem Lautsprecher zuführen und der Radiostation zuhören (es gibt mehr dazu, die Frequenz zu isolieren und den Transistor im Gleichgewicht zu halten, aber Sie bekommen die Idee, ich hoffe).
Jetzt, wo der Transistor existiert, war eine Möglichkeit, einen Transistor als Schalter zu verwenden, wie ein Lichtschalter. Das Radio ist wie ein Dimmer-Lichtschalter, den Sie von überall bis weit in die gewünschte Position drehen können. Ein nicht gedimmter Lichtschalter ist entweder alle an oder alle aus, es gibt einen magischen Ort in der Mitte des Schalters, wo er umschaltet. Wir verwenden Transistoren auf die gleiche Weise in der digitalen Elektronik. Nehmen Sie den Ausgang eines Transistors und führen Sie ihn in einen anderen Transistoreingang. Der Ausgang des ersten ist sicherlich kein kleines Signal wie die Radiowelle, er zwingt den zweiten Transistor ganz auf oder ganz weg. das führt zum Konzept der TTL- oder Transistor-Transistor-Logik. Im Grunde genommen hast du einen Transistor, der eine hohe Spannung treibt oder wir nennen ihn eine 1, und darauf sinkt eine Nullspannung, wir nennen das eine 0. Und du ordnest die Eingänge mit einer anderen Elektronik an, damit du AND-Gatter erzeugen kannst (wenn beide Eingänge sind eine 1, dann ist der Ausgang eine 1) ODER-Gatter (wenn entweder der eine oder der andere Eingang eine 1 ist, dann ist der Ausgang eine Eins). Inverter, NAND, Gatter, NOR-Gatter (ein oder mit einem Inverter) usw. Früher gab es ein TTL-Handbuch und man konnte 8 oder so Pin-Chips kaufen, die ein oder zwei oder vier einer Art Gate hatten (NAND, NOR, UND, usw.) Funktionen innerhalb, zwei Eingänge und ein Ausgang für jeden. Jetzt brauchen wir nicht, dass es billiger ist, programmierbare Logik oder dedizierte Chips mit vielen Millionen von Transistoren zu erstellen. Aber wir denken immer noch in AND, OR und NOT Gates für Hardware-Design. (in der Regel mehr wie Nand und Nor).
Ich weiß nicht, was sie jetzt lehren, aber das Konzept ist das gleiche, für Speicher kann ein Flip-Flop als zwei dieser TTL-Paare (NANDS) zusammen mit dem Ausgang von einem zum Eingang des anderen gehen . Lass es dabei sein. Das ist im Grunde ein einzelnes Bit in dem, was wir SRAM oder statischen RAM nennen. sram benötigt grundsätzlich 4 Transistoren. Dram oder Dynamic Ram die Speicher-Sticks, die Sie in Ihren Computer stecken, nehmen Sie einen Transistor pro Bit, so für den Anfang können Sie sehen, warum dram ist das, was Sie Gigabytes wert kaufen. Sram-Bits erinnern sich an das, worauf Sie sie setzen, solange die Energie nicht ausgeht. Dram beginnt zu vergessen, was du ihm gesagt hast, sobald du es erzählst, im Grunde benutzt dram den Transistor in einer dritten anderen Art und Weise, es gibt etwas Kapazität (wie im Kondensator, werde hier nicht eingehen), die wie eine kleine wiederaufladbare Batterie ist. Sobald Sie es aufladen und das Ladegerät abziehen, beginnt es zu entwässern. Denken Sie an eine Reihe von Gläsern auf einem Regal mit kleinen Löchern in jedem Glas, das sind Ihre dram Bits, Sie wollen, dass einige von ihnen eins sind, also haben Sie einen Assistenten, der die Gläser füllt, die Sie sein wollen. Dieser Assistent muss den Krug ständig füllen und die Reihe hinuntergehen und die "eine" Bit-Brille voll genug mit Wasser halten und die "Null" Bit-Brille leer lassen. Damit Sie zu jeder Zeit sehen können, was Ihre Daten sind, können Sie die Einsen und Nullen durch Suchen nach Wasserständen, die definitiv über der Mitte liegen und eine Ebene unter der Mitte sind, als Null betrachten Wenn der Assistent bei eingeschaltetem Gerät nicht in der Lage ist, die Gläser voll genug zu halten, um eine Eins von Null zu unterscheiden, werden sie schließlich alle wie Nullen aussehen und auslaufen. Es ist der Kompromiss für mehr Bits pro Chip. Eine kurze Geschichte hier ist, dass wir außerhalb des Prozessors Dram für unseren Massenspeicher verwenden, und es gibt eine Hilfslogik, die dafür sorgt, dass die Einsen eins bleiben und Null ist. Aber im Inneren des Chips halten das AX-Register und DS-Register zum Beispiel Ihre Daten mit Flip-Flops oder Sram. Und für jedes Bit, das Sie kennen, wie die Bits im AX-Register, gibt es wahrscheinlich Hunderte oder Tausende oder mehr, die verwendet werden, um die Bits in das AX-Register hinein und aus diesem heraus zu bekommen.
Sie wissen, dass Prozessoren mit einer gewissen Taktrate laufen, in diesen Tagen etwa 2 Gigahertz oder zwei Milliarden Uhren pro Sekunde. Denken Sie an die Uhr, die von einem Kristall erzeugt wird, ein anderes Thema, aber die Logik sieht diese Uhr als eine Spannung, die hoch und Null hoch und Null bei dieser Taktrate 2ghz oder was auch immer geht (Gameboy Fortschritte sind 17 MHz, alte iPods um 75 MHz, Original IBM PC 4,77 MHz).
Die Transistoren, die als Schalter verwendet werden, ermöglichen es uns, Spannung zu nehmen und sie in die Einsen und Nullen zu verwandeln, die wir sowohl als Hardware-Ingenieure als auch als Softwareingenieure kennen und die uns UND-, ODER- und NICHT-Logikfunktionen geben . Und wir haben diese magischen Kristalle, die uns eine genaue Oszillation der Spannung ermöglichen.
So können wir jetzt Dinge wie sagen, wenn die Uhr eine Eins ist, und meine Statusvariable sagt, ich bin in der Fetch-Anweisung Staat, dann muss ich einige Tore umschalten, so dass die Adresse der Anweisung ich will was im Programmzähler ist, geht auf den Speicherbus hinaus, so dass die Speicherlogik mir meinen Befehl für MOV AL, 61h geben kann. Sie können dies in einem x86-Handbuch nachschlagen und feststellen, dass einige dieser Opcode-Bits sagen, dass dies eine mov-Operation ist und das Ziel die unteren 8 Bits des EAX-Registers ist und die Quelle des mov ein unmittelbarer Wert ist, was es bedeutet ist in der Speicherstelle nach dieser Anweisung. Also müssen wir diesen Befehl/Opcode irgendwo speichern und den nächsten Speicherplatz im nächsten Taktzyklus holen. Also haben wir jetzt die Bewegung gespeichert, sofort und wir haben den Wert 61h aus dem Speicher gelesen und können eine Transistorlogik schalten, so daß das Bit 0 dieses 61h im Bit 0 Flipflop von al und Bit 1 bis Bit 1 gespeichert wird .
Wie passiert alles, was Sie fragen? Denken Sie an eine Python-Funktion, die eine mathematische Formel ausführt. Sie beginnen am Anfang des Programms mit einigen Eingaben in die Formel, die als Variablen eingehen, Sie haben einzelne Schritte durch das Programm, die hier eine Konstante hinzufügen können, oder rufen Sie die Quadratwurzelfunktion aus einer Bibliothek usw. auf. Und ganz unten Sie gib die Antwort zurück. Hardware-Logik wird auf die gleiche Weise gemacht, und heute werden Programmiersprachen verwendet, von denen eine viel wie C aussieht. Der Hauptunterschied besteht darin, dass Ihre Hardware-Funktionen Hunderte oder Tausende von Eingängen haben und der Ausgang ein einzelnes Bit ist. Bei jedem Taktzyklus wird das Bit 0 des AL-Registers mit einem großen Algorithmus berechnet, abhängig davon, wie weit Sie ausschauen möchten. Denken Sie an die Quadratwurzelfunktion, die Sie für Ihre mathematische Operation aufgerufen haben. Diese Funktion selbst ist eine dieser Eingaben, die eine Ausgabe erzeugen, und sie kann andere Funktionen aufrufen, vielleicht eine Multiplikation oder Division. Sie haben also wahrscheinlich irgendwo ein Stück, das Sie sich als letzten Schritt vor dem Bit 0 des AL-Registers vorstellen können, und seine Funktion ist: wenn Takt eins ist, dann AL [0] = AL_next [0]; sonst AL [0] = AL [0]; Aber es gibt eine höhere Funktion, die das nächste al-Bit enthält, das von anderen Eingaben berechnet wird, und eine höhere Funktion und eine höhere Funktion, und viele davon werden vom Compiler auf dieselbe Weise erzeugt wie Ihre drei Zeilen von python in hunderte oder tausende von Assemblerlinien. Ein paar Zeilen HDL können Hunderte oder Tausende oder mehr Transistoren werden. Hardware-Leute schauen normalerweise nicht auf die niedrigste Formel für ein bestimmtes Bit, um alle möglichen Eingaben und alle möglichen ANDs und ORs und NOTs zu finden, die es braucht, um mehr zu berechnen, als Sie wahrscheinlich den Assembler überprüfen, der von Ihren Programmen erzeugt wird. aber du könntest, wenn du willst.
Ein Hinweis auf Microcoding, verwenden die meisten Prozessoren keine Mikrocodierung. Sie kommen mit dem x86 zum Beispiel, weil es eine gute Anleitung für seinen Tag war, aber auf der Oberfläche kämpft, um mit der modernen Zeit Schritt zu halten. andere Befehlssätze benötigen keine Mikrocodierung und verwenden die Logik direkt wie oben beschrieben. Sie können sich das Mikrocodieren als einen anderen Prozessor vorstellen, der eine andere Befehlssatz-/Assemblersprache verwendet, die den Befehlssatz emuliert, den Sie auf der Oberfläche sehen. Nicht so kompliziert wie beim Versuch, Windows auf einem Mac oder Linux unter Windows zu emulieren. Die Mikrocodierschicht ist speziell für diesen Job entwickelt worden. Sie können sich vorstellen, dass dort nur die vier Register AX, BX, CX, DX vorhanden sind sind viel mehr drin. Und natürlich kann dieses eine Assemblerprogramm irgendwie auf mehreren Ausführungspfaden in einem Kern oder mehreren Kernen ausgeführt werden.Genau wie der Prozessor in Ihrem Wecker oder Ihrer Waschmaschine ist das Mikrocode-Programm einfach und klein und debuggt und brannte in die Hardware ein, die hoffentlich nie ein Firmware-Update benötigt. Zumindest ideal. aber wie dein ipod oder dein telefon zum beispiel willst du manchmal einen bug fix oder was auch immer und es gibt eine möglichkeit deinen prozessor zu aktualisieren (das bios oder andere software lädt beim booten einen patch). Sagen wir, Sie öffnen das Batteriefach zu Ihrer TV-Fernbedienung oder Ihrem Taschenrechner, vielleicht sehen Sie ein Loch, wo Sie einige Bare-Metal-Kontakte in einer Reihe sehen können, vielleicht drei oder fünf oder viele. Für einige Fernbedienungen und Taschenrechner, wenn Sie es wirklich programmieren wollten, aktualisieren Sie die Firmware. Normalerweise nicht, im Idealfall ist diese Fernbedienung perfekt oder perfekt genug, um das Fernsehgerät zu überleben. Microcoding bietet die Möglichkeit, das sehr komplizierte Produkt (Millionen, Hunderte von Millionen von Transistoren) auf den Markt zu bringen und die großen und reparierbaren Fehler im Feld auf der Straße zu beheben. Stellen Sie sich ein 200-Millionen-Zeilen-Python-Programm vor, das Ihr Team in etwa 18 Monaten geschrieben hat und das es liefern muss oder das Unternehmen wird das Wettbewerbsprodukt nicht schaffen. Gleiches gilt nur für einen kleinen Teil des Codes, den Sie im Feld aktualisieren können. Der Rest muss in Stein gemeißelt bleiben. für den Wecker oder Toaster, wenn es einen Fehler gibt oder das Ding Hilfe braucht, werfen Sie es einfach aus und holen Sie sich einen anderen.
Wenn Sie durch Wikipedia oder nur Google stöbern, können Sie sich die Befehlssätze und die Maschinensprache für Dinge wie 6502, z80, 8080 und andere Prozessoren ansehen. Es kann 8 Register und 250 Instruktionen geben und Sie können ein Gefühl von der Anzahl von Transistoren bekommen, dass diese 250 Assembly-Instruktionen immer noch eine Sprache mit sehr hohem Level sind, verglichen mit der Sequenz von logischen Gattern, die jedes Bit in einem Flip-Flop pro Takt berechnet Zyklus. Sie haben diese Annahme richtig. Mit Ausnahme der mikrocodierten Prozessoren ist diese Low-Level-Logik in keiner Weise neu programmierbar. Sie müssen die Hardware-Fehler mit Software beheben (für Hardware, die geliefert wird und nicht verschrottet wird).
Schauen Sie sich dieses Petzold-Buch an, er leistet ausgezeichnete Arbeit, Dinge zu erklären, die allem, was ich jemals schreiben könnte, weit überlegen sind.
Btw, das ist eine fantastische Frage. Überraschenderweise sind sich nur wenige Entwickler bewusst, wie ein Transistor in ihre Welt eindringt oder nachforschen lässt. Du bist auf dem Weg, sich deiner eigenen Unwissenheit bewusst zu werden, was dich in eine sehr gute Gesellschaft versetzt. –
Was mit deinem Kopf wirklich durcheinander kommt, ist * wie * die Schaltungsherstellung nicht weit entfernt von den 100 Jahre alten Fotografietechniken ist. –
Betreff: letzter Absatz: Wenn Sie wirklich wissen wollen, wie xor-Zeroing auf verschiedenen modernen Intel- und AMD-Mikroarchitekturen (neben der reinen Codegröße) funktioniert, lesen Sie [diese Antwort] (http://stackoverflow.com/a/33668295/224132). –