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.
microprocessor
Dziekan
źródło
źródło
Odpowiedzi:
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ą ).
źródło
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:
źródło
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
źródło
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.
magazyn sterowania diodowo-matrycowego 1950 MIT Whirlwind Computer
Tranzystorowy magazyn kontrolny macierzy 2005 MT15 CPU
źródło
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.
źródło
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
źródło
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.
źródło
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.
źródło
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.
źródło