To prawie krępujące pytanie ... Mam dyplom z informatyki (i drugi w toku). Pracuję jako pełnoetatowy programista .NET od prawie pięciu lat. Generalnie wydaje mi się kompetentny w tym, co robię.
Ale nie wiem, jak działają komputery!
Proszę, zostań ze mną na chwilę. Szybkie Google zatytułowane „Jak działa komputer” przyniesie wiele wyników, ale starałem się znaleźć taki, który naprawdę odpowiedziałby na to, czego szukam. Zdaję sobie sprawę, że jest to ogromne, ogromne pytanie, więc naprawdę, jeśli możesz podać mi jakieś słowa kluczowe lub jakiś kierunek.
Wiem, że są komponenty ... zasilacz, płyta główna, RAM, procesor itp. ... i rozumiem, co robią. Ale tak naprawdę nie rozumiem, jak wychodzisz z wiersza kodu, takiego jak Console.Readline()
.NET (lub Java lub C ++), i mam to do zrobienia .
Jasne, jestem niejasno świadomy MSIL (w przypadku .NET) i że pewna magia dzieje się z kompilatorem JIT i zamienia się on w natywny kod (tak myślę). Powiedziano mi, że Java jest podobna, a C ++ odcina środkowy krok.
Zrobiłem trochę montażu na komputerze mainframe, to było kilka lat temu. Pamiętam, że było kilka instrukcji i kilka rejestrów procesora, i napisałem kod ... a potem nastąpiła magia ... i mój program zadziałałby (lub zawiesił się). Z tego, co rozumiem, „emulator” symulowałby to, co dzieje się, gdy wywołasz instrukcję, i aktualizowałby rejestry procesora; ale co sprawia, że te instrukcje działają tak, jak działają?
Czy to zmienia się w pytanie o elektronikę, a nie pytanie o komputer? Zgaduję, że nie ma żadnego praktycznego powodu, aby to zrozumieć, ale czuję, że powinienem być w stanie.
(Tak, dzieje się tak, gdy spędzasz dzień z małym dzieckiem. Zajmuje im to około 10 minut i pięć powtórzeń pytania „Dlaczego?”, Abyś zdał sobie sprawę, ile nie wiesz)
Emulator
. Jest to garść prawdziwych obwodów półprzewodnikowych z setkami (tysiącami) przewodów wejściowych i wyjściowych oraz miliardami bramek logicznych. ZostałEmulator
on wykorzystany wyłącznie w celach instruktażowych.Odpowiedzi:
Zacznę od najniższego poziomu, który może być istotny (mogę zacząć od jeszcze niższego poziomu, ale prawdopodobnie są one zbyt mało istotne), począwszy od Atomu, przez elektryczność, do tranzystorów, bramek logicznych, do układów scalonych (chip / procesor) ) i kończy się na Zgromadzeniu (zakładam, że znasz wyższe poziomy).
Na początku
Atom
Atom jest strukturą złożoną z elektronów, protonów i neutronów (które same składają się z cząstek elementarnych ). Najciekawszą częścią atomu dla komputerów i elektroniki są elektrony, ponieważ elektron jest mobilny (tzn. Może poruszać się stosunkowo łatwo, w przeciwieństwie do protonów i neutronów, które są trudniejsze do poruszania się) i mogą one same unosić się swobodnie, nie będąc w środku atom.
Zwykle każdy atom ma taką samą liczbę protonów i elektronów, nazywamy to stanem „neutralnym”. Tak się składa, że atom może stracić lub zyskać dodatkowe elektrony. Mówi się, że atomy w tym niezrównoważonym stanie są odpowiednio atomem „naładowanym dodatnio” (więcej protonu niż elektrony) i atomem „naładowanym ujemnie” (więcej elektronu niż protonu).
Elektrony są nie do zbudowania i niezniszczalne (nie w mechanice kwantowej, ale nie ma to znaczenia dla naszych celów); więc jeśli atom traci elektron, jakiś inny atom w pobliżu musiał otrzymać dodatkowe elektrony lub elektron musiał uwolnić się w swobodnym swobodnym elektronie, i odwrotnie, ponieważ elektron jest niemożliwy do zbudowania, aby uzyskać dodatkowy elektron, atom musiał wyssać go z pobliskich atomów lub z swobodnego swobodnego elektronu. Mechanika elektronów jest taka, że jeśli w pobliżu dodatnio naładowanego atomu znajduje się ujemnie naładowany atom, wówczas niektóre elektrony będą migrować, aż oba atomy będą miały taki sam ładunek.
Elektryczność
Elektryczność to po prostu przepływ elektronów z obszaru o bardzo dużej liczbie ujemnie naładowanych atomów do obszaru o bardzo dużej liczbie dodatnio naładowanych atomów. Pewne reakcje chemiczne mogą stworzyć sytuację, w której mamy jeden węzeł z dużą ilością ujemnie naładowanych atomów (zwany „anodą”), a drugi węzeł z dużą ilością dodatnio naładowanych atomów (zwany „katodą”). Jeśli połączymy drutem dwa przeciwnie naładowane węzły, masy elektronów przepłyną od anody do katody, a przepływ ten nazywamy „prądem elektrycznym”.
Nie wszystkie druty mogą przenosić elektrony równie łatwo, elektrony płyną znacznie łatwiej w materiałach „przewodzących” niż w materiałach „odpornych”. Materiał „przewodzący” ma niski opór elektryczny (np. Druty miedziane w kablach), a materiał „odporny” ma wysoką rezystancję elektryczną (np. Gumowa izolacja kabla). Niektóre interesujące materiały nazywane są półprzewodnikami (np. Silikony), ponieważ mogą one łatwo zmieniać swoją rezystancję, w pewnych warunkach półprzewodnik może działać jako przewodnik, aw innych warunkach może przekształcić się w rezystor.
Elektryczność zawsze woli przepływać przez materiał o najmniejszym oporze, więc jeśli katoda i anoda są połączone dwoma drutami, jeden o bardzo wysokiej rezystancji, a drugi o bardzo niskiej rezystancji, większość elektronów przepłynie przez kabel o niskiej rezystancji i prawie żaden nie przepływa przez materiał o wysokiej odporności.
Wiek średni
Przełączniki i tranzystory
Przełączniki / przerzutniki są jak zwykłe włączniki światła, między dwoma kawałkami drutu można umieścić przełącznik, aby odciąć i / lub przywrócić przepływ prądu. Tranzystory działają dokładnie tak samo, jak włącznik światła, z tym wyjątkiem, że zamiast fizycznie podłączać i odłączać przewody, tranzystor łączy / odłącza przepływ prądu, zmieniając jego rezystancję w zależności od tego, czy w węźle bazowym jest prąd, i, jak można się już domyślić / Wiem, tranzystory są wykonane z półprzewodników, ponieważ możemy zmienić półprzewodnik, aby stał się rezystorem lub przewodnikiem do łączenia lub odłączania prądów elektrycznych.
Jeden wspólny typ tranzystora, NPN Bipolar Junction Transistor (BJT), ma trzy węzły: „podstawowy”, „kolektor” i „emiter”. W NPN BJT energia elektryczna może przepływać z węzła „emitera” do węzła „kolektora” tylko wtedy, gdy węzeł „bazy” jest naładowany. Gdy węzeł podstawowy nie jest naładowany, praktycznie żaden elektron nie może przepływać, a gdy węzeł podstawowy jest naładowany, wówczas elektrony mogą przepływać między emiterem a kolektorem.
Zachowanie tranzystora
(Gorąco sugeruję przeczytanie tego przed kontynuowaniem, ponieważ może to wyjaśnić lepiej niż ja dzięki interaktywnej grafice)
Załóżmy, że mamy tranzystor podłączony do źródła elektrycznego u podstawy i kolektora, a następnie podłączamy kabel wyjściowy w pobliżu jego kolektora (patrz rysunek 3 w http://www.spsu.edu/cs/faculty/bbrown/web_lectures / tranzystory / ).
Kiedy przykładamy energię elektryczną do bazy lub kolektora, wówczas nie może ona w ogóle przepłynąć, ponieważ nie ma elektryczności, o której można by mówić:
Kiedy przykładamy elektryczność do kolektora, ale nie do podstawy, elektryczność nie może przepłynąć do emitera, ponieważ podstawa staje się materiałem o wysokiej rezystancji, więc elektryczność ucieka do drutu wyjściowego:
Kiedy przykładamy energię elektryczną do podstawy, ale nie do kolektora, również energia elektryczna nie może przepływać, ponieważ nie ma różnicy w ładunku między kolektorem a emiterem:
Kiedy przykładamy elektryczność zarówno do podstawy, jak i do kolektora, dostajemy elektryczność przepływającą przez tranzystor, ale ponieważ tranzystor ma teraz niższy opór niż drut wyjściowy, prawie żaden prąd nie przepływa przez drut wyjściowy:
Bramki logiczne
Kiedy podłączamy emiter jednego tranzystora (E1) do kolektora innego tranzystora (C2), a następnie podłączamy wyjście w pobliżu podstawy pierwszego tranzystora (O) (patrz rysunek 4 w http://www.spsu.edu / cs / faculty / bbrown / web_lectures / tranistors / ), wtedy dzieje się coś ciekawego. Powiedzmy również, że zawsze przykładamy prąd do kolektora pierwszego tranzystora (C1), więc bawimy się tylko podstawowymi węzłami tranzystorów (B1, B2):
Podsumujmy tabelę, aby zobaczyć tylko B1, B2 i O:
I oto , jeśli znasz Boolean Logic i / lub Logic Gates, powinieneś zauważyć, że jest to dokładnie brama NAND. A jeśli znasz Boolean Logic i / lub Logic Gates, możesz również wiedzieć, że NAND (jak również NOR) jest funkcjonalnie kompletny , tj. Używając tylko NAND, możesz skonstruować wszystkie pozostałe bramki logiczne i resztę prawdy stoły Innymi słowy, możesz zaprojektować cały układ komputerowy przy użyciu samych bramek NAND.
W rzeczywistości większość procesorów jest (czy była kiedyś?) Projektowana przy użyciu tylko NAND, ponieważ jest tańsza w produkcji niż przy użyciu kombinacji NAND, NOR, AND, OR itp.
Pozyskiwanie innych operatorów logicznych z NAND
Nie opisałbym, jak zrobić wszystkie operatory logiczne, tylko bramkę NOT i AND, resztę można znaleźć gdzie indziej.
Biorąc pod uwagę operator NAND, możemy zbudować bramę NOT:
Biorąc pod uwagę operator NAND i NOT, możemy zbudować bramkę AND:
W podobny sposób możemy zbudować inne bramki logiczne. Ponieważ bramka NAND jest funkcjonalnie ukończona , możliwe jest również zbudowanie bramek logicznych z więcej niż 2 wejściami i więcej niż 1 wyjściem, dlatego nie zamierzam tutaj omawiać, jak zbudować takie bramki logiczne.
Wiek oświecenia
Budowanie maszyny Turinga z Boolean Gates
Procesor to po prostu bardziej skomplikowana wersja maszyny Turinga. Rejestry procesora to stan wewnętrzny maszyny Turinga, a pamięć RAM to taśma maszyny Turinga.
Maszyna Turinga (CPU) potrafi trzy rzeczy:
W naszym celu budujemy 2-stanową 3-symbolową maszynę Turinga Wolframa z wykorzystaniem logiki kombinatorycznej (nowoczesne procesory wykorzystywałyby mikrokod, ale są one bardziej złożone niż jest to konieczne do naszych celów).
Tabela stanu maszyny Turinga Wolframa (2,3) jest następująca:
Chcemy ponownie zakodować powyższą tabelę stanów jako tabelę prawdy:
Tak naprawdę nie zamierzam budować takiej bramki logicznej (nie jestem pewien, jak narysować ją w SE i prawdopodobnie będzie dość duża), ale ponieważ wiemy, że brama NAND jest funkcjonalnie ukończona , więc mamy sposób znaleźć serię bramek NAND, które wdrożą tę tabelę prawdy.
Ważną właściwością maszyny Turinga jest to, że można emulować komputer z programem przechowywanym za pomocą maszyny Turinga, która ma tylko stałą tabelę stanów. Dlatego dowolna uniwersalna maszyna Turinga może odczytać swój program z taśmy (RAM) zamiast konieczności zapisywania instrukcji w wewnętrznej tabeli stanów. Innymi słowy, nasza (2,3) maszyna Turinga może odczytać instrukcje z pinów I1, I2 (jako oprogramowanie) zamiast być zakodowana na stałe w implementacji bramki logicznej (jako sprzęt).
Mikrokody
Z powodu rosnącej złożoności współczesnych procesorów, zbyt trudne staje się używanie samej logiki kombinatorycznej do projektowania całego procesora. Współczesny procesor jest zwykle zaprojektowany jako interpreter instrukcji mikrokodów; mikrokod to mały program osadzony w CPU, który jest wykorzystywany przez CPU do interpretacji rzeczywistego kodu maszynowego. Ten interpreter mikrokodu jest na ogół zaprojektowany przy użyciu logiki kombinatorycznej.
Zarejestruj się, pamięć podręczna i pamięć RAM
Zapomnieliśmy czegoś powyżej. Jak coś pamiętamy? Jak wdrażamy taśmę i pamięć RAM? Odpowiedź znajduje się w elemencie elektronicznym o nazwie Kondensator. Kondensator jest jak akumulator, który po naładowaniu zachowa dodatkowe elektrony i może również zwrócić elektrony do obwodu.
Aby zapisać na kondensatorze, wypełniamy kondensator elektronem (zapis 1) lub drenujemy wszystkie elektrony w kondensatorze, aż będzie pusty (zapis 0). Aby odczytać wartość kondensatora, staramy się go rozładować. Jeśli, gdy próbujemy rozładować, nie przepływa prąd, wówczas kondensator jest pusty (odczyt 0), ale jeśli wykryjemy prąd, wówczas kondensator musi zostać naładowany (odczyt 1). Można zauważyć, że odczyt kondensatora wyczerpuje jego magazyn elektronów, nowoczesne pamięci RAM mają układ okresowego ładowania kondensatora, aby mogli zachować pamięć tak długo, jak długo jest prąd.
Istnieje wiele rodzajów kondensatorów używanych w procesorze, rejestry procesora i pamięci podręczne procesora wyższego poziomu są tworzone przy użyciu bardzo szybkich „kondensatorów”, które faktycznie są zbudowane z tranzystorów (dlatego prawie nie ma „opóźnienia” do odczytu / zapisu z im), nazywane są statyczną pamięcią RAM (SRAM); podczas gdy główna pamięć RAM jest wykonana przy użyciu mniejszej mocy, ale wolniejszych i znacznie tańszych kondensatorów, są one nazywane dynamiczną pamięcią RAM (DRAM).
Zegar
Bardzo ważnym elementem procesora jest zegar. Zegar to składnik, który „tyka” regularnie w celu synchronizacji przetwarzania. Zegar zazwyczaj zawiera kwarc lub inne materiały o dobrze znanym i stosunkowo stałym okresie oscylacji, a zespół zegarowy utrzymuje i mierzy tę oscylację, aby zachować swoje poczucie czasu.
Operacje procesora są wykonywane między taktami zegara, a tykania odczytywania / zapisywania są wykonywane w taktach, aby zapewnić, że wszystkie komponenty poruszają się synchronicznie i nie depczą do siebie w stanie pośrednim. W naszej (2,3) maszynie Turinga między tyknięciami zegara prąd przepływa przez bramki logiczne, aby obliczyć moc wyjściową (I1, I2, R (t)); a w tyknięciach zegara zapisujący taśmę zapisze O1, O2 na taśmie, silnik będzie poruszał się w zależności od wartości M, a rejestr wewnętrzny jest zapisywany z wartości R (t + 1), a następnie czytnik taśm odczyta bieżącą taśmę i włoży ładunek do I1, I2, a rejestr wewnętrzny zostanie ponownie odczytany z powrotem do R (t).
Rozmowa z urządzeniami peryferyjnymi
Zwróć uwagę, w jaki sposób (2,3) maszyna Turinga współpracuje z silnikiem. Jest to bardzo uproszczony widok tego, w jaki sposób procesor może współpracować z dowolnym sprzętem. Arbitralny sprzęt może nasłuchiwać lub zapisywać na określonym przewodzie dla wejść / wyjść. W przypadku maszyny Turinga (2,3) jej interfejs z silnikiem jest tylko pojedynczym drutem, który instruuje silnik, aby obrócił się w prawo lub w lewo.
W tej maszynie nie zostało powiedziane, że silnik musiał mieć inny „zegar”, który działa synchronicznie z wewnętrznym „zegarem” maszyny, aby wiedzieć, kiedy rozpocząć i zatrzymać pracę, więc jest to przykład synchronicznej transmisji danych . Druga powszechnie stosowana alternatywna transmisja asynchroniczna wykorzystuje inny przewód, zwany linią przerwania, do komunikacji punktów synchronizacji między CPU a urządzeniem asynchronicznym.
Era cyfrowa
Kod maszynowy i montaż
Język asemblera to czytelny dla człowieka mnemonik kodów maszynowych. W najprostszym przypadku istnieje odwzorowanie jeden na jeden między zestawem a kodem maszynowym; chociaż w nowoczesnych językach asemblerowych niektóre instrukcje mogą być mapowane na wiele kodów operacyjnych.
Język programowania
Wszyscy wiemy, czyż nie?
Uff, w końcu skończyłem, napisałem to wszystko w zaledwie 4 godziny, więc jestem pewien, że gdzieś jest błąd (jestem przede wszystkim programistą, a nie inżynierem elektrykiem ani fizykiem, więc może być kilka rzeczy, które są rażąco złe). Jeśli znajdziesz błąd, nie wahaj się dać @yell lub naprawić go samodzielnie, jeśli masz przedstawiciela lub udzielisz uzupełniającej odpowiedzi.
źródło
Od Nand do Tetris w 12 krokach
Myślę, że będzie to dla ciebie absolutnie idealne:
Od Nands do Tetris w 12 krokach
źródło
Jeśli wykonałeś montaż, to tak naprawdę są tylko dwie lub trzy warstwy do zrozumienia:
Ten ostatni (Microcode) sprawił, że „kliknął”, ponieważ wypełnił lukę między elektroniką a kodem.
źródło
Przykład sylabusa kursu licencjackiego CS, który dokładnie wyjaśnia, o co prosiłeś, można znaleźć tutaj (kurs IDC.AC.IL CS101) . Opiera się na książce prasowej MIT: „ Elementy systemów obliczeniowych: budowanie nowoczesnego komputera od pierwszych zasad ”.
źródło
Aby w pełni odpowiedzieć na to pytanie, potrzebna jest cała książka. Na szczęście ktoś już napisał tę książkę. Charles Petzold nazywa to Code: The Hidden Language of Computer Hardware and Software . Jest to bardzo pouczająca i bardzo zabawna lektura.
źródło
Bardzo polecam Code Charlesa Petzolda. Książka jest zarówno lekcją historii, jak i przeglądem technicznym budowy komputera. Zaczynając od wyjaśnienia prostych przełączników telegraficznych, książka pokazuje, jak działają tranzystory, a następnie logiczne bramki, programowalny komputer, do bardziej skomplikowanych rzeczy. Jest również bardzo dobrze napisany i prawdopodobnie mógłby go pochwycić każdy, kto ma dość ciekawości.
źródło
To będzie zbyt trudne (i długie!), Aby wymienić wszystko, co możesz wiedzieć, aby uzyskać wystarczające zrozumienie tego, co musisz wiedzieć. Słynna książka, która faktycznie odpowiada na wszystkie te pytania, pochodzi od Andrew Tanenbaum: Structured Computer Organisation .
Ta książka zabiera cię od fizycznego komputera na biurku do bramek logicznych i algebry logicznej, a następnie pokazuje przykładową architekturę, która poprowadzi cię przez to, jak wszystko dzieje się w takim systemie.
(Jedna uwaga: jest bardzo droga, ponieważ zawiera około 800 stron. Prawdopodobnie dobrze jest kupić wersję z drugiej ręki lub starszą wersję. Pojęcia się nie zmieniły).
źródło
Cóż, potrzeba dużo piłek, żeby to powiedzieć i chyba tak.
Kod jest coraz bardziej redukowany do bardziej skomplikowanego kodu niższego poziomu. W dół do kodu poziomu zestawu z rejestrami push i move ... itd ...
Następnie sprzęt pobiera ten kod i działa na niego. W większości przypadków sprzęt będzie miał własne instrukcje, jak to zrobić. Może więc istnieć prosta instrukcja, na przykład PUSH, w której rejestr (lokalizacja pamięci) otrzymuje wartość 1 lub 2 lub cokolwiek innego.
To zdecydowanie pytanie komputerowe. A także programujący. Niektórzy programiści programują sprzęt, który zabierze Twój kod i sprawi, że zrobi coś, choć na bardzo niskim poziomie. To także pytanie o elektronikę.
źródło
Istnieją urządzenia.
Następnie są sterowniki urządzeń, które współdziałają z tymi urządzeniami. Część napisana w C, zazwyczaj część w asemblerze.
System operacyjny współpracuje z oprogramowaniem aplikacji z jednej strony i sterownikami urządzeń z drugiej strony, aby komunikować się z rzeczywistym sprzętem.
Jeśli jesteś naprawdę zainteresowany, dlaczego nie zhakować jądra Linuksa, aby dowiedzieć się więcej?
źródło
Zasadniczo jest to pytanie dotyczące elektroniki, chociaż jego podstawy powinny być omówione na kursie ankietowym dla dowolnego stopnia CS. Cały sprzęt działa w oparciu o bramki, które są w nim zaprogramowane na poziomie komponentu. Są to najbardziej podstawowe operacje logiczne: NOT, AND, OR, XOR, NAND, NOR. Każda brama ma określoną funkcję:
NIE brama ma jedną wartość wejściową i wytwarza jedną wartość wyjściową, to dostaje 0 lub 1 i wyprowadza przeciwnego.
I brama zajmuje dwie wartości wejściowe i wytwarza jedną wartość wyjściową, robi żadnej kombinacji 0 i 1 oraz wyjścia 0 dla dowolnej kombinacji z wyjątkiem dwóch z nich, dla których wyjściach to 1.
LUB brama działa podobnie jak I bramy, ale będzie produkować 1 dla każdej kombinacji 0 i 1 to dostaje z wyjątkiem dwóch zer, na które wyjścia to 0.
XOR brama jest znowu podobnie zarówno AND i do bram, ale spowoduje to wartość 0 gdy oba składniki są takie same, i 1, gdy oba składniki są różne.
NAND brama jest logiczną naprzeciwko elementu I i NOR brama jest logiczną naprzeciwko albo bramy.
Innymi słowy, na poziomie sprzętowym wszystko sprowadza się do najbardziej podstawowych binarnych wyrażeń logicznych. Cała reszta to tylko przejście z wyższego poziomu programowania na niższy, aż do osiągnięcia ostatniej warstwy.
źródło
Jeśli chodzi o część dotyczącą przekształcania programu w język wysokiego poziomu w instrukcjach maszyn, każda książka kompilatora powinna wypełnić rachunek. Na przykład książka smoka .
W części dotyczącej „w jaki sposób wykonywane są instrukcje?” Organizacja i projekt komputera: Interfejs sprzętowy / programowy powinien wypełnić rachunek.
źródło
Chociaż wydaje mi się oszałamiające, że ktoś może ukończyć kurs CS bez znajomości sprzętu, przypuszczam, że jest całkiem możliwe, że kurs może koncentrować się tylko na teorii jako gałęzi matematyki, a nie na szczegółach inżynierii i implementacji. Czcigodne wykłady SICP (wygłoszone w latach 80.) wyglądały tak.
Na moim kursie CS, dwie dekady temu, w pierwszym roku wymagana była wcześniejsza edycja Computers: od logiki do architektury .
Coś takiego powinno wypełnić luki.
Alternatywnie, Open Courseware MIT powinien mieć coś, co pomoże.
źródło