Jak faktycznie wygląda kod maszynowy podczas uruchamiania?

21

Kiedy kod maszynowy jest faktycznie wykonywany przez sprzęt i procesor, jak to wygląda?

Czy wyglądałoby to na binarne, jak w instrukcjach reprezentowanych przez jedynki i zera, czy może byłoby to coś, co składa się z cyfr szesnastkowych, w których kody są bajtami przedstawionymi jako liczby szesnastkowe, które można rozbić na liczby binarne, jak kod bajtowy?

Tim prawie nie
źródło
24
To, co zobaczysz, to druty, bramy i rejestry migoczące na krzemie. Na przykład, visual6502.org/JSSim
Nayuki
4
@Nayuki Myślę, że ta wizualizacja jest niesamowita i zasługuje na odpowiedź!
nalzok
2
Dla mnie to nie wygląda niczym
Gajusz
3
Tak naprawdę nie istnieje nawet wtedy, kiedy jest naprawdę „wykonany”. Jest to „kompilowane JIT” przez urządzenie (sprzętowe!) Na procesorze do mikrokodu, który faktycznie instruuje procesor!
xuq01
2
Jednym szybkim sposobem na zrozumienie, w jaki sposób komputer tłumaczy, jest zbudowanie go z bramek logicznych. Naprawdę lubię oglądać ten wykonany przez Bena
Eatera

Odpowiedzi:

38

Najlepsza odpowiedź, jaką mogę udzielić, to, że tak naprawdę „nie wygląda” jak nic. Instrukcja wykonywana obecnie przez CPU jest reprezentowana przez szereg drutów, z których niektóre mają wysokie napięcie, a niektóre mają niskie napięcie.

Wysokie i niskie napięcia można interpretować jako zera i jedynki, ale równie dobrze można interpretować grupy wysokich i niskich napięć jako cyfry szesnastkowe lub jako instrukcję składania podobną ADD $0 $1(która jest najbliższa interpretacji CPU). Te liczby i mnemoniki same w sobie są udogodnieniami dla ludzi do czytania; wewnętrznie są to tylko napięcia na przewodach.

Z tych opcji, binarny jest „najbliżej metalu”, w tym znaczeniu, że zera i jedynki są mapowane bezpośrednio na wysokie i niskie napięcie na przewodach. Ale żadne z pozostałych nie jest niepoprawne i często są bardziej przydatne: istnieje powód, dla którego ludzie patrzą na zrzuty plików wykonywalnych w trybie szesnastkowym, ale prawie nigdy nie są to zrzuty binarne.

Draconis
źródło
Czy mógłbyś otworzyć program w edytorze szesnastkowym i czy te bajty reprezentowane w systemie szesnastkowym przekładają się na kod binarny kodu maszynowego, który może być uruchamiany przez napięcie przypisane do zera i napięcie przypisane do jednego?
Tim Hardly
4
@TimHardly Tak! Heks jest po prostu łatwiejszy do odczytania. Podobnie asemblacja jest jeszcze łatwiejsza do odczytania, ale można ją mechanicznie przetłumaczyć na zera i jedynki. Dlatego asemblery są łatwiejsze do pisania niż kompilatory.
Draconis
dzięki, całe to pytanie poszerzyło moją wiedzę i rozwiało moje zamieszanie.
Tim Hardly
1
@TimHardly Asembler po prostu odwzorowuje ciąg znaków takich jak „NOP” na serię bitów takich jak „10010000” w kółko, aby przekształcić plik zestawu w kod maszynowy. Kody są określane przez procesor, ponieważ jest to część, która faktycznie ich używa. Wszystkie komputery, na których można uruchamiać te same pliki wykonywalne , rzeczywiście mają ten sam zestaw kodów operacyjnych; Zestaw x86 jest najbardziej popularny i jest obecnie używany na prawie wszystkich komputerach. Innym popularnym jest MIPS, używany w wielu konsolach do gier.
Draconis
1
@TimHardly Jeśli twoje pytanie brzmi, czy asembler może zapytać CPU, jaki jest jego kod operacji dla instrukcji NOP, odpowiedź brzmi nie. Asembler musi już wiedzieć, jaki bajt wypisać dla instrukcji, zanim będzie mogła działać. W rzeczywistości asembler może wyprowadzić program dla jednego procesora, podczas gdy sam działa na innym typie procesora.
Pan Lister
11

„Wyglądać” oznacza metaforę. Jeśli weźmiemy „jak to będzie wyglądać” dosłownie, będzie to wyglądało jak fantazyjnie wytrawiony kawałek krzemu siedzący na płycie głównej. Wyraźnie celem była metafora. Aby zbudować metaforę, musimy spojrzeć na to, co naprawdę jest pierwsze. Następnie możemy zbudować metaforę, która będzie akceptowalna. To jest trochę długie, ale na szczęście kończy się dla ciebie metaforą wideo .

Kod maszynowy jest faktycznie przechowywany w pamięci jako bity. Chipy pamięci są zazwyczaj DRAM , który przechowuje te bity jako napięcia na kondensatorze i elektronach. Oba są ze sobą połączone - trudno mówić o napięciach bez elektronów. Czasami wygodnie jest rozmawiać o jednym lub drugim, ale rozumiem, że gdziekolwiek idzie, drugi podąża za nim.

Podróż kodu maszynowego rozpoczyna się od „pobrania”. Szczególny wzór napięć jest przykładany do drutów układu pamięci RAM, wskazując, że ten konkretny zestaw bitów powinien zostać przesłany do procesora. Dlaczego? Nie wiem, nie obchodzi mnie to. Zazwyczaj ten sygnał jest wysyłany, ponieważ procesor zakończył ostatnią instrukcję i prosi o nową jako instynktowną odpowiedź, jak pies proszący o drugą ucztę po tym, jak dałeś jej pierwszą. Proces ten rozpoczyna się od pewnego pierwotnego kopnięcia w spodnie, spowodowanego naturalną niestabilnością procesora. Kiedy zasilacz przykłada stałe napięcie do układu, wzrost napięcia ostatecznie prowadzi do tego, że procesor umieszcza prawidłowe napięcie na układach pamięci RAM, aby uzyskać pierwsze instrukcje (trochę zmieniam warstwę BIOS-u, ponieważ nie jest to ważne do historii. Spójrz na to).

Współczesna pamięć przesyła dane równolegle. Oznacza to, że bity, które składają się na kod maszynowy, są dzielone na „tory” (32 lub 64 są wspólne), co jest logicznym sposobem na przekazanie przewodów 32/64 z pamięci RAM do procesora. Napięcie na tych liniach jest podnoszone i obniżane w razie potrzeby, aby przesłać je do procesora.

Gdy znajdzie się w procesorze, może wykonać swoją pracę. Jest to dziedzina mikroarchitektury i może się skomplikować, ponieważ jest to dosłownie przemysł wart miliard dolarów. Napięcia te wpływają na tranzystory, które wpływają na inne napięcia, w sposób, który możemy opisać jako „dodawanie bitów” lub „mnożenie”. W rzeczywistości wszystkie są tylko napięciami reprezentującymi te bity, w taki sam sposób, w jaki możemy napisać 5-znakowy ciąg „2 + 2 = 4” na kartce papieru i powiedzieć, że zrobiliśmy matematykę. Ołówkowy grafit nie jest numerem dwa. To tylko fizyczna reprezentacja, której używamy dla tego numeru.

Tak właśnie działa prawdziwy system na niezwykle wysokim poziomie. Pominąłem dobrze ... właściwie wszystko ... ale jest wystarczająco przyzwoite, aby móc wrócić do twojego rzeczywistego pytania. Jak by to wyglądało [metaforycznie]?

Tak się składa, że ​​myślę, że Martin Molin mógł zbudować najlepszą metaforę za pomocą swojej marmurowej maszyny . Kod maszynowy jest kodowany (ręcznie) na niektórych paskach Lego Technics w środku jako kołki, a nie napięcia na kondensatorze. To bardziej przypomina EPROM niż DRAM, ale oba przechowują dane. Kulki są jak elektrony, które poruszają się pod wpływem napięć (lub grawitacji, w przypadku kul). A gdy elektrony się poruszają, przykładają siłę do bram, które wykonują różne czynności.

Jego maszyna jest prosta w porównaniu z nowoczesnym procesorem, ale nie jest aż tak źle, jeśli chodzi o metafory. I to jest chwytliwe!

Cort Ammon - Przywróć Monikę
źródło
1
Maszyna do marmuru jest na to zbyt prosta w tym filmie. Procesor potrzebuje stanu.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen True. Podejrzewam, że gdyby marmurowa maszyna miała kilka bram, które pozwalały jej automatycznie wyrzucać dźwignie zamiast Marin musiała je przekręcić, byłoby bliżej.
Cort Ammon - Przywróć Monikę
Dzięki! Podobnie jak pytanie, które zadałem w odpowiedzi powyżej, czy zmontowany kod zestawu będzie uważany za kod maszynowy, który jest tłumaczony na napięcia i inne rzeczy?
Tim Hardly
@TimHardly Używając jedynego znaczenia dla „zmontowany”, „Złożenie” i „Kod maszynowy”, produkt złożonego złożenia jest zdefiniowany jako kod maszynowy (więc tak, można to uznać za =)). Pomocne może być to, że zarówno zestaw, jak i kod maszynowy są uważane za pojęcia „logiczne”, bliższe matematycznej koncepcji „2 + 2 = 4” i dalej od grafitu na papierze, na którym zapisano to równanie. Asembler / kod maszynowy to kod montażowy / maszynowy, niezależnie od tego, czy jest przechowywany na dysku magnetycznym, zapisany na kartce papieru, czy przechowywany w kondensatorach w pamięci DRAM.
Cort Ammon - Przywróć Monikę
1
Jeśli mogę woskować filozofię, kod maszynowy jest kodem maszynowym, ponieważ traktujemy go jak kod maszynowy. Myślimy o tym jak o kodzie maszynowym. Mogę skierować procesor na bajty opisujące dźwięk w formacie .wav i rzeczywiście wykona je jako kod maszynowy. Wynikowe wykonanie prawdopodobnie nie zrobi nic użytecznego (ponieważ dźwięk nie został skonstruowany jako kod maszynowy) i może zostać zatrzymany, ale można go wykonać.
Cort Ammon - Przywróć Monikę
10

Sprawdź ten film , w szczególności od 1:00 do 1:17. Dokładnie tak to wygląda, gdy program działa na komputerze. Dwa rzędy lampek pokazują aktualną zawartość rejestru adresów i rejestru danych. PDP-11 nie ma rejestru instrukcji, ale gdyby taki był, a z przodu znajdowały się lampki pokazujące jego zawartość, wyglądałby prawie tak samo. 16 świateł - niektóre z nich włączone, niektóre wyłączone.

Jeśli naprawdę podobały Ci się migające światła, możesz mieć więcej świateł, aby pokazać bieżącą zawartość sześciu rejestrów, wskaźnik stosu, licznik programu ... dla kolejnych 32768 świateł możesz mieć światło dla każdego bitu pamięci podręcznej. Możesz nawet mieć światło na każdy kawałek pamięci ... ale to naprawdę byłoby dużo świateł.

Jest to PDP11-70, który działa z częstotliwością 15,2 MHz, a wykonanie każdej instrukcji zajmuje około 1,5 mikrosekundy. Ludzkie oko może wykryć zmiany do 1/10 sekundy iw tym czasie PDP-11 może wykonać 60 000 instrukcji. Zasadniczo wszystko jest rozmyciem.

JavaLatte
źródło
Wow, to fajny przykład, widziałem innych podobnych, coś wzdłuż tych linii, gdzie można zobaczyć światła i inne rzeczy. youtube.com/watch?v=yOyaJXpAYZQ
Tim Hardly
6

Projektanci sprzętu wdrażający i testujący (oraz testujący i testujący) procesor faktycznie używają modeli wizualnych, aby zobaczyć, co robią ich projekty. Większość (jeśli nie wszystkie) narzędzia do symulacji HDL generują widoki fal wszystkich rejestrów i przewodów, aby umożliwić łatwe debugowanie. Poniższy zrzut ekranu (pobrany tutaj ) pokazuje te fale z symulatora VCS dla procesora RISC-V z kilkoma instrukcjami.

Fale DVE dla RISC-V

Jest to dość prosty przykład, który pokazuje niewielki podzbiór logiki zaangażowanej w projektowanie pełnego procesora. Możesz otworzyć te widoki dla całego procesora i obserwować, jak dane rozprzestrzeniają się za pomocą logiki. Jeśli chcesz, aby kod maszynowy działał, jak wspomniałeś, możesz spojrzeć na fale rejestru instrukcji lub magistrali, której procesor używa do odczytu instrukcji z pamięci. Większość przeglądarek fal ma elastyczne opcje wyświetlania dla magistrali i rejestrów, które pozwalają wyświetlać ich wartości jako etykiety binarne, szesnastkowe, ósemkowe, a nawet jako enum. W niektórych można nawet zdefiniować własne funkcje do odwzorowywania wzorów bitów w celu wyświetlenia wartości.

Warto zauważyć, że jest to tylko reprezentacja symulacji procesora. Nie ma sposobu na uzyskanie takich widoków dla już wyprodukowanego układu procesora.

jtst
źródło
2

Wyobraź sobie ślepca potykającego się w trakcie budowy zaułka. Wszędzie są dziury i szczeliny, więc naturalnie powinien upaść. Nie ten ślepiec, bo ma papierowy zwój z instrukcjami, kiedy czekać, kiedy się poruszać, gdzie się poruszać i jak manipulować otoczeniem, by dotrzeć do końca drogi. Oto, czym jest zgromadzenie, ślepo przestrzegane listy instrukcji - mają sens tylko dla tej alei i dla tego ślepca. Teoretycznie można nawet zrekonstruować model 3d na podstawie samych instrukcji (Dekompilacja).

Każda zmiana platformy wymaga ponownego skompilowania instrukcji dla niewidomego. Musisz znać sprzęt (układ placu budowy), instrukcje intencji napisane przez człowieka (kod wysokiego poziomu), takie jak: „Chcę, abyś przeskakiwał przez wszystkie ogrodzenia, które napotkasz z rzędu, dopóki nie będziesz mieć 12 ogrodzeń za sobą” i zdolności niewidomych (CPU). Czy ma pamięć krótkotrwałą, umiejętność robienia kilku rzeczy naraz?

Zbieranie wszystkich tych informacji i tworzenie spójnego zwoju instrukcji jest zadaniem kompilatora.

Czy mogę opisać, jak wygląda program? Nie. Ale czy możemy opisać, jak to byłoby wykonać? Tak, to byłoby jak skakanie i bieganie, jak zwierciadło, nie widząc niczego, postępując zgodnie z dokładną listą instrukcji, gdziekolwiek to może cię zabrać.

Cycero
źródło