Jak zaprogramowano pierwsze mikroprocesory?

44

Właśnie mnie to uświadomiło, że jeśli piszesz system operacyjny, to na czym piszesz? Zadaję to, czytając książkę o podstawach mikroprocesora z 1980 r., I przyszło mi do głowy następujące pytanie:

Jak zaprogramowano pierwszy układ mikroprocesorowy?

Odpowiedź może być oczywista, ale mnie wkurza.

Dziekan
źródło
6
Jeśli mogę zezwolić na podłączenie własnej pracy, zobacz moją odpowiedź na „Jak jądro Linux może się skompilować?” na przepełnienie stosu . Odpowiedź nie jest oczywista, dopóki nie zrozumiesz ogólnej zasady, w której to powiesz: „No cóż, oczywiście ...”
dmckee
@dmckee Ale wciąż nie odpowiada na pytanie, skąd wiedział, co robić :) kto powiedział komputerowi z przełącznikami, co robić? Chcę trochę więcej szczegółów.
Dean
4
Pytanie dotyczy zaprojektowania sekwencji rozruchowej pierwszego układu? Cóż, z pewnością jest to pytanie, które należy do tej witryny, ale przebiega to tak, jak zaprojektowanie cyfrowej logiki zbudowanej z komponentów ... spraw, aby zaczęła się w znanym stanie, a następnie nakarmić dane wejściowe, które zrobią użyteczne rzeczy. Zostawię go na inny, aby zapewnić szczegółową odpowiedź, ponieważ jestem chwiejny na tym, ale nie wiedzą, że pierwsze komputery były realizowane w lampach próżniowych, prawda? Potem pojawiła się generacja w poszczególnych tranzystorach, wszystko przed pierwszym mikroukładem. Inżynierowie już wiedzieli, co robią.
dmckee,
1
Oczywiście na procesorach innych niż mikro.
user253751

Odpowiedzi:

56

Przyjmę twoje pytanie dosłownie i omówię głównie mikroprocesory, a nie ogólnie komputery.

Wszystkie komputery mają jakiś kod maszynowy. Instrukcja składa się z kodu operacji i jednego lub większej liczby operandów. Na przykład instrukcja ADD dla Intel 4004 (pierwszego mikroprocesora) została zakodowana jako 1000RRRR, gdzie 1000 to kod operacji dla ADD, a RRRR reprezentuje numer rejestru.

Pierwsze programy komputerowe zostały napisane ręcznie, ręcznie kodując jedynki i zera, aby stworzyć program w języku maszynowym. Jest to następnie programowane w chipie. Pierwsze mikroprocesory używały pamięci ROM (pamięć tylko do odczytu); zostało to później zastąpione przez EPROM (Erasable Programmable ROM, który został wymazany światłem UV); teraz programy są zwykle programowane w EEPROM ( „Electrically… - EPROM” , które można usunąć na chipie), a konkretnie w pamięci Flash.

Większość mikroprocesorów może teraz uruchamiać programy poza pamięcią RAM (jest to prawie standard dla wszystkiego oprócz mikrokontrolerów), ale przede wszystkim musi istnieć sposób na załadowanie programu do pamięci RAM. Jak zauważył Joby Taffey w swojej odpowiedzi, dokonano tego za pomocą przełączników Altair 8080, który był napędzany przez Intel 8080 (który następował po 4004 i 8008). W twoim komputerze jest trochę pamięci ROM zwanej BIOS, która służy do uruchamiania komputera i ładowania systemu operacyjnego do pamięci RAM.

Język maszynowy staje się naprawdę nudny, dlatego opracowano programy asemblera, które przyjmują mnemoniczny język asemblera i tłumaczą go, zwykle jedną linię kodu asemblera na instrukcję, na kod maszynowy. Więc zamiast 10000001 napisałby ADD R1.

Ale pierwszy asembler musiał zostać napisany w kodzie maszynowym. Następnie można go przepisać we własnym kodzie asemblera, a wersja w języku maszynowym zostanie użyta do złożenia go po raz pierwszy. Następnie program może się sam złożyć. Nazywa się to ładowaniem początkowym i odbywa się to również za pomocą kompilatorów - zwykle są one najpierw pisane w asemblerze (lub innym języku wysokiego poziomu), a następnie przepisywane w swoim własnym języku i kompilowane przy użyciu oryginalnego kompilatora, dopóki kompilator nie będzie mógł się skompilować.

Ponieważ pierwszy mikroprocesor został opracowany na długo po pojawieniu się komputerów mainframe i minikomputerów, a 4004 i tak nie nadawał się do uruchomienia asemblera, Intel prawdopodobnie napisał cross-asembler, który działał na jednym z jego dużych komputerów, i przetłumaczył kod asemblera dla 4004 w obraz binarny, który można zaprogramować w pamięci ROM. Ponownie jest to powszechna technika używana do przenoszenia kompilatorów na nową platformę (zwaną kompilacją krzyżową ).

tcrosley
źródło
Świetna odpowiedź tcrosley! Poprawiono ciekawostkę o EEPROM vs EPROM. +1
tyblu
1
A jeśli naprawdę chcesz zaprogramować mikrokontroler bez innego komputera (oprócz mózgu), możesz to zrobić, budując układ, który bezpośrednio zasila program. Jeśli został zaprogramowany przez jtag, możesz przełączyć przełączniki, aby naśladować polecenia jtag potrzebne do zaprogramowania urządzenia. Gdyby używał zewnętrznego RAM-u, wówczas można by użyć wielu demultiplekserów i ogromnych zestawów rezystorów powiązanych wysoko lub nisko, aby reprezentować bity instrukcji (i prawdopodobnie użyć niskiej częstotliwości taktowania, ponieważ sprzęt będzie wolny).
nategoose
3
@tyblu: Jestem całkiem pewien, że fuse-PROM były wcześniejsze niż EPROMy. Najprostszą formą ROM jest zasadniczo selektywnie zaludniony układ diod (we wczesnych dniach diody dosłownie byłyby wlutowane w siatkę, reprezentując jedną biegunowość bitu; brakująca dioda reprezentowała drugą biegunowość). Bezpiecznik-PROM umieszcza układ diod na chipie, ale ma tranzystory rzędowe, które są znacznie mocniejsze niż diody na skrzyżowaniach. Można selektywnie usunąć diody, ustawiając przewody adresowe, a następnie naprawdę mocno uderzając w przewody danych podłączone do diod, które chcemy usunąć.
supercat
@tyblu: Zauważ, że fuse-PROM nie są elektrycznie niczym nowoczesne OTPROM-y, które są po prostu układami EPROM w niepakowanych pakietach. Urządzenia EPROM / OTP są programowane przez elektryczne ładowanie bramek niektórych tranzystorów (które mają wystarczającą pojemność i wystarczająco mały upływ, aby utrzymać ładunek zasadniczo przez czas nieokreślony). Natomiast układy bezpiecznikowe PROM są programowane poprzez fizyczne zniszczenie połączeń z niechcianymi diodami.
supercat
1
sprawdź tę „ROM” z dni dyskretnych tranzystorów: en.wikipedia.org/wiki/Core_rope_memory
JustJeff
23

Początkowo programy pisano na papierze, a następnie transponowano na dowolną metodę wprowadzania danych dostępną w komputerze. Dotyczyło to gałek, przełączników i zworek na pierwszych komputerach, dziurkowania kart, klawiatur / tablic.

Poniższa ilustracja pokazuje, czego używają prawdziwi programiści:

W5VO
źródło
10
Cholera, emacs ..
tyblu
6
Programuję programistów. (A ci programiści programuję programistów, którzy programują programistów.)
Mateen Ulhaq
4
Tworzę własnych programistów.
W5VO
16

Cóż, byłem w pobliżu, kiedy pojawiły się mikroskopy, pisaliśmy cross asemblery i kompilatory na komputerach mainframe i minis, a następnie ładowaliśmy je na 8-bitowym sprzęcie, ludzie tak naprawdę nie przejmowali się budowaniem kompilatorów / asemblerów na micros, dopóki nie mieli wystarczającej ilości lokalnej pamięci do spraw, by było to przydatne

Paweł
źródło
14

Jedną z wczesnych postaci pamięci tylko do odczytu była siatka, w której adres wybiera wiersz (pociągając go nisko), a kolumny reprezentują dane. Każda kolumna miałaby podciągnięcie, a każde skrzyżowanie miałoby wlutowaną diodę reprezentującą „zero” lub brak diody reprezentującej „jeden” [poziomy bitów można w razie potrzeby odwrócić, w przypadkach, w których zmniejszyłoby to wymagana liczba diod]. Każdy pożądany wzór bitów można „zaprogramować” poprzez wlutowanie do odpowiednich diod.

Ten projekt został wprowadzony do świata układów scalonych w postaci bezpiecznika-PROM. Zasadniczo bezpiecznik PROM był układem podobnym do powyższego, wbudowanym w układ, z wyjątkiem tego, że wszystkie diody były zapełnione, a każda dioda miała ze sobą słaby bezpiecznik szeregowy. W chwili wysłania PROM odczytuje „0” we wszystkich lokalizacjach. Można jednak selektywnie usunąć diody, wybierając odpowiedni adres i doprowadzając odpowiednie linie danych do „twardego” wysokiego poziomu [uwaga: Myślę, że każdy bit mógł mieć swój własny tranzystor, a nie diodę, ale zasada jest taka sama].

Programowanym bezpiecznikiem PROM zastąpiły pamięci półprzewodnikowe, które przechowują bity poprzez wszczepianie ładunków na wewnętrznych kondensatorach. Takie pamięci są nie tylko bardziej kompaktowe niż bezpieczniki PROM, ale jeśli są umieszczone w przezroczystych opakowaniach UV, można je usunąć i ponownie wykorzystać. Należy pamiętać, że nawet tak zwane „jednorazowe programowalne” wspomnienia prawie zawsze używają tego samego projektu, ale są po prostu umieszczone w nieprzezroczystych opakowaniach UV.

dwóch mężczyzn wskazujących na dużą matrycę diodową magazyn sterowania diodowo-matrycowego 1950 MIT Whirlwind Computer

macierz tranzystorowa z małymi tranzystorami SMD Tranzystorowy magazyn kontrolny macierzy 2005 MT15 CPU

supercat
źródło
mam nadzieję, że nie przeszkadza ci drobna poprawka do twojego postu.
davidcary
7

Nie jestem pewien, czy ktokolwiek zajął się prawdziwym pytaniem OP: „Skąd komputer wie, jak zacząć?” , więc zaryzykuję.

Zacznij od analogii. „Skąd tranzystor wie, jak zacząć?” Oczywiście, że tak nie jest, po prostu działa zgodnie z fizyką, a inżynier buduje obwód tak, że zaczyna się w znanym stanie.

Komputery wiedzą, jak zacząć, ponieważ są obwodami (oczywiście bardzo skomplikowanymi) i zostały zbudowane tak, aby uruchamiały się w określonym stanie. W nowoczesnej maszynie stanem tym może być taki, w którym główna magistrala ponownie mapuje część przestrzeni adresowej, aby użytkownik ROM na płycie głównej miał mało pamięci (pamięć ROM została wypalona z BIOS-em). W maszynie pierwszej generacji stan początkowy mógł zostać zatrzymany przez procesor, licznik programu wyzerowany, a podsystem przełączania pamięci aktywny.

dmckee
źródło
6

System operacyjny to program komputerowy, który działa bezpośrednio na procesorze. Można go napisać w dowolnym języku, który można skompilować lub skompletować do instrukcji maszynowych. Asembler i C są powszechnymi wyborami.

Kod jest ładowany do procesorów pojedynczych instrukcji ze sklepu - ROM lub RAM.

Z3 , pierwszy programowalny procesor został zbudowany z przekaźników elektromechanicznych i czytać instrukcje z perforowanej folii.

Altair 8800, pierwszy komputer osobisty, został zaprogramowany za pomocą przełączników.

Aby dowiedzieć się, jak zbudowany jest procesor z logiki cyfrowej, zobacz https://electronics.stackexchange.com/questions/5516/a-fun-book-to-learn-computer-architecture-for-not-exactly-beginners

Aby uzyskać historię, zobacz http://en.wikipedia.org/wiki/History_of_computing_hardware

Toby Jaffey
źródło
5

Oto trochę o naprawdę starych komputerach:

O ile mi wiadomo, w tamtych czasach miałeś duży przedni panel komputera, który służył do ich programowania. Zasadniczo każda komórka pamięci w tych komputerach była podłączona do przełączników. Zasilasz pamięć, a następnie używasz przełączników, aby ustawić dane w każdej komórce. W ten sposób program krok po kroku wprowadzałbyś do pamięci komputera. Następnie ustaw punkt początkowy programu i rozpocznij wykonywanie.

W miarę postępu technologii opracowano tak zwane programy ładujące. Są to krótkie programy, których celem jest uruchomienie innego programu z pamięci komputera. Problem z wprowadzaniem programów krok po kroku (a później więcej niż jeden bit przy użyciu liczb ósemkowych i późniejszych liczb szesnastkowych) polegał na tym, że był on bardzo wolny i istniała duża szansa, że ​​operator popełni błąd podczas ładowania programu. Do załadowania większych programów przechowywanych w pamięci komputera zostaną wykorzystane krótkie programy. W miarę upływu czasu część kodu, która musiała być wprowadzana ręcznie, zmniejszała się, a we współczesnych komputerach często mamy bootloadery zapisane w jakiejś pamięci ROM, a nawet w pamięci flash.

AndrejaKo
źródło
4
W maszynach z „przednim panelem”, podobnie jak we wcześniejszych systemach S-100, przełączniki pozwalają przejąć kontrolę nad magistralą systemową. Jeden przełącznik pozwala zawiesić procesor. Gdy procesor został zawieszony, można ręcznie ustawić adres na magistrali adresowej (za pomocą przełączników), umieścić dane na magistrali danych (więcej przełączników), a następnie ręcznie wywołać cykl zapisu na magistrali (inny przełącznik) lub cykl odczytu, aby pobrać dane z powrotem do 8 pojedynczych diod LED i odczytać dane binarne itp. W ten sposób można zapisać wystarczającą ilość kodu maszynowego w pamięci RAM, cofnąć zawieszenie procesora i przejść od tego momentu.
JustJeff
4

Kilka lat temu natknąłem się na programator mikrokontrolera, który miał czterocyfrowy siedmiosegmentowy wyświetlacz i sześciokątną klawiaturę. Jestem pewien, że nie miał on na pokładzie mikrokontrolera i pozwalał na wpisywanie kodu maszynowego bezpośrednio po bajcie.

Pozwoliłoby to (boleśnie) ręcznie skompilować listę kodów operacyjnych jeden po drugim i wprowadzić je do układu.

Nie mam pojęcia, czy nadal można je zdobyć, ale zgaduję, że coś podobnego zastosowano w czasach, gdy mikrokontrolery były stosunkowo nowe.

BG100
źródło
1
Brzmi prawdopodobnie jak KIM-1 lub Cosmac ELF, z których oba zawierały mikroprocesor (MOS 6502 i RCA [CD] 1802). KIM: oldcomputers.net/kim1.html ELF: cosmacelf.com
mctylr 16.01.11
Prawdopodobnie było to coś, co powiedział mctylr. W maszynach tego typu zwykle w ROM-ie znajdował się mały program „monitorujący”. Kiedy wprowadzałeś bajty za pomocą klawiatury, tak naprawdę 6502 (lub 8085 lub cokolwiek innego) czytał klawisze, modyfikował pamięć, aktualizował diody LED itp.
JustJeff
1

Pierwsze mikroprocesory zostałyby zaprogramowane przy pomocy istniejących komputerów, które nie były oparte na mikroprocesorach. Zanim pierwszy procesor został wyprodukowany na jednym układzie, istniały już zaawansowane architektury komputerów, które zostały zbudowane z dyskretnych komponentów, a nie mikroprocesorów. Spójrz, powiedzmy, IBM 360.

Kaz
źródło