Zatrzymaj się i podpal (przetwarzanie)
W inżynierii komputerowej Halt and Catch Fire , znany przez mnemoniczny zespół HCF , jest idiomem odnoszącym się do instrukcji kodu maszynowego komputera, która powoduje, że jednostka centralna komputera (CPU) przestaje działać, zwykle wymagając ponownego uruchomienia komputera. Pierwotnie odnosiło się do fikcyjnej instrukcji w IBM System / 360 (wprowadzonej w 1964 r.), Żartując z jej licznych nieoczywistych mnemoników instrukcji.
Wraz z pojawieniem się MC6800 (wprowadzonego w 1974 r.) Programiści odkryli wadę konstrukcyjną. Ze względu na niekompletne dekodowanie kodu operacji, dwa niedozwolone kody operacji , 0x9D i 0xDD, spowodują, że licznik programu na procesorze, aby zwiększać się w nieskończoność, co blokuje procesor do momentu zresetowania. Kody te zostały nieoficjalnie nazwane HCF. Podczas procesu projektowania MC6802 inżynierowie pierwotnie planowali usunąć tę instrukcję, ale pozostawili ją bez zmian do celów testowych. W rezultacie HCF został oficjalnie uznany za prawdziwą instrukcję. Później HCF stało się humorystycznym terminem obejmującym instrukcje, które mogą zamrozić procesor, w tym celowe instrukcje do celów testowych i niezamierzone nielegalne instrukcje. Niektóre są uważane za defekty sprzętowe, a jeśli system jest udostępniony , złośliwy użytkownik może go uruchomić, aby uruchomić atak typu „odmowa usługi” .
W przypadku prawdziwych instrukcji implikacją tego wyrażenia jest to, że podczas gdy w większości przypadków, w których procesor wykonuje niezamierzoną instrukcję (błąd w kodzie), komputer może nadal być w stanie odzyskać, w przypadku instrukcji HCF z definicji nie ma możliwości odzyskania systemu bez ponownego uruchomienia.
Wyrażenie „zapalić się” jest żartobliwym wyolbrzymieniem szybkości, z jaką układ procesora przełączałby niektóre obwody magistrali, powodując ich przegrzanie i spalenie.
Pochodzenie
Komputery Z1 (1938) i Z3 (1941) zbudowane przez Konrada Zuse zawierały nielegalne sekwencje instrukcji, które przypadkowo uszkadzały sprzęt.
Opowieści apokryficzne łączą ten termin z nielegalnym kodem operacyjnym w IBM System/360 . Procesor po napotkaniu instrukcji zacząłby bardzo szybko przełączać linie magistrali , co potencjalnie prowadziłoby do przegrzania.
asemblerze komputerowym używane są mnemoniki, które są bezpośrednim odpowiednikiem instrukcji kodu maszynowego . Mnemoniki często składają się z trzech liter, na przykład ADD, CMP (porównanie dwóch liczb) i JMP (skok do innej lokalizacji w programie). Instrukcja HCF była pierwotnie fikcyjną instrukcją języka asemblera, o której mówi się, że jest opracowywana w IBM do użytku w ich komputerach System / 360 , wraz z wieloma innymi zabawnymi trzyliterowymi akronimami jak XPR (Execute Programmer) i CAI (Corrupt Accounting Information) oraz podobne do innych mnemoników żartów, takich jak „SDI” dla „Natychmiastowego samozniszczenia” i „CRN” dla „Konwertuj na cyfry rzymskie”. Lista takich mnemoników, w tym HCF, pojawia się jako „Overextended Mnemonics” w odwrotnej parodii wydania Creative Computing z kwietnia 1980 roku .
System IBM System/360 zawierał już wiele nieoczywistych mnemoników, takich jak ZAP (Zero i Add Packed), EDMK (EDit and MarK), TRT (Translate and Test) oraz Read Backward (polecenie kanału I/O), a programiści zaczęli tworząc podobnie tajemnicze, ale fikcyjne instrukcje w humorystycznym stylu.
W dyskusji USENET z 1990 roku twierdzono, że HCF pochodzi sprzed 1977 roku.
W powieści science fiction/fantasy Ricka Cooka , The Wizardry Compiled , o programistach przeniesionych do wszechświata, w którym można zaprogramować magię, jeden z nich odnosi się do polecenia jako HMCF, co oznacza „Halt, Melt and Catch Fire”.
W TIS-100 , grze logicznej z 2015 roku stworzonej przez Zachtronics , istnieje osiągnięcie o nazwie HALT_AND_CATCH_FIRE za awarię maszyny z ukrytym kodem operacyjnym.
W nowoczesnych procesorach
Projektanci procesorów czasami włączają jedną lub więcej nieudokumentowanych instrukcji kodu maszynowego do celów testowych, takich jak instrukcja IBM System/360 DIAGnose.
Motorolę 6800
Mikroprocesor Motorola 6800 był pierwszym, dla którego nieudokumentowany mnemoniczny zestaw HCF stał się powszechnie znany . Kody operacji ( opcodes - części instrukcji języka maszynowego, które określają operację do wykonania) są szesnastkowe 9D i DD i zostały zgłoszone i otrzymały nieoficjalny mnemoniczny HCF w artykule napisanym przez Gerry'ego Wheelera w numerze BYTE z grudnia 1977 roku czasopismo na nieudokumentowanych kodach operacyjnych. Wheeler zauważył, że Motorola zgłosiła 197 prawidłowych kodów operacji dla procesora M6800 i wywnioskowała, że przy 256 możliwych kombinacjach 8-bitowych musi być 59 „nieprawidłowych instrukcji”. Dalej opisuje HCF jako „wielką niespodziankę” i mówi o części pseudonimu Catch Fire „Cóż, prawie”:
Gdy ta instrukcja jest uruchomiona, jedynym sposobem sprawdzenia, co ona robi, jest użycie oscyloskopu . Z punktu widzenia użytkownika maszyna zatrzymuje się i wymyka się większości prób jej ponownego uruchomienia. Osoby z lampkami kontrolnymi na szynie adresowej zobaczą, że procesor zaczyna czytać całą pamięć, sekwencyjnie, bardzo szybko. W efekcie magistrala adresowa zamienia się w 16-bitowy licznik. Jednak procesor nie zwraca uwagi na to, co czyta… po prostu czyta.
Proces jest recenzowany przez Davida Agansa, w ten sposób:
W dawnych czasach mikroprocesora Motorola 6800 kod instrukcji DD powodował, że procesor przechodził w nieskończoną pętlę, czytając po kolei każdy adres pamięci. (Inni inżynierowie nazywali to instrukcją „Halt and Catch Fire” [HCF], ale zapamiętaliśmy kod, nazywając ją instrukcją „Drop Dead”). zakres ; wszystkie linie adresu i zegara były ładne, cykliczne fale kwadratowe.
Oznacza to, że albo opcode wprowadził procesor w tryb , w sposób ciągły wykonując cykle odczytu pamięci z kolejnych adresów bez pośrednich pobierań instrukcji. Tym samym magistrala adresowa stała się skutecznie licznikiem , pozwalając na szybką weryfikację działania wszystkich linii adresowych. Gdy procesor wszedł w ten tryb, nie reagował na przerwania , więc normalne działanie można było przywrócić tylko przez reset (stąd pseudonimy „Drop Dead” i „Halt and Catch Fire”). Odniesienia te dotyczyły zatem braku reakcji procesora w tym stanie, a nie jakiejkolwiek formy błędnego zachowania. [ potrzebne źródło ]
Inne instrukcje podobne do HCF znaleziono później w Motoroli 6800 podczas wykonywania nieudokumentowanych kodów operacji FD (cyklicznie dwa razy wolniej niż 9D/DD) lub CD/ED (cyklicznie z czytelną dla człowieka bardzo niską częstotliwością na ograniczonej liczbie linii o wysokim adresie) .
Uważa się, że mnemonik HCF jest pierwszą wbudowaną funkcją autotestu w mikroprocesorze Motorola.
Intel x86
Intel 8086 i kolejne procesory z serii x86 miały instrukcję HLT (halt), opcode F4, która zatrzymywała wykonywanie instrukcji i wprowadzała procesor w stan HALT. Włączone przerwanie, wyjątek debugowania, sygnał BINIT, sygnał INIT lub sygnał RESET wznowiły wykonywanie, co oznaczało, że procesor zawsze mógł zostać zrestartowany. Niektóre z wczesnych chipów Intel DX4 miały problem z instrukcją HLT i nie można było ich ponownie uruchomić po użyciu tej instrukcji, co spowodowało wyłączenie komputera i przekształcenie HLT w bardziej instrukcję HCF. Jądro Linuksa dodało opcję „no-hlt”, mówiącą Linuksowi, aby uruchamiał nieskończoną pętlę zamiast używać HLT, co pozwoliło użytkownikom tych uszkodzonych układów na korzystanie z Linuksa.
80286 ma nieudokumentowany kod operacji 0F 04, powodujący zawieszanie się procesora podczas wykonywania. Jedynym wyjściem jest reset procesora. [ potrzebne źródło ] W niektórych implementacjach kod operacyjny był emulowany przez BIOS jako sekwencja zatrzymująca .
Wiele komputerów z linii Intel Pentium mogło zostać zablokowanych przez wykonanie nieprawidłowej instrukcji (F00F C7C8), co spowodowało zablokowanie komputera. Stało się to znane jako błąd Pentium F00F . Żaden kompilator nie stworzyłby instrukcji, ale złośliwy programista mógłby wstawić ją do kodu, aby uniemożliwić działanie uszkodzonego komputera, dopóki maszyna nie zostanie ponownie włączona . Od czasu jego wykrycia opracowano obejścia, aby zapobiec blokowaniu komputera, a błąd został wyeliminowany w kolejnych procesorach Intela.
Podczas Black Hat USA 2017 Christopher Domas pokazał, że znalazł nową, nieznaną obecnie instrukcję „Halt and Catch Fire” na konkretnym modelu procesora x86, używając własnego fuzzera procesora x86 o nazwie sandsifter.
Inne procesory
Technologia MOS 6502 ma 12 niepoprawnych instrukcji, które spowodują zawieszenie procesora.
W Zilog Z80 wykonanie DI (wyłączenie przerwań), a następnie HALT (oczekiwanie na przerwanie) powoduje, że procesor pozostaje zamrożony na czas nieokreślony, czekając na przerwanie, które nie może się wydarzyć.
Z80 obsługuje również przerwania niemaskowalne. Sygnał /NMI znajduje się na styku 17 oryginalnego 40-stykowego pakietu DIP. Ponieważ przerwanie niemaskowalne odzyska kontrolę nad procesorem nawet po wykonaniu sekwencji instrukcji DI / HALT, ta para nie reprezentuje prawdziwego HCF. Spowoduje to stan HCF tylko wtedy, gdy pin /NMI zostanie podłączony bezpośrednio do szyny +5V, uniemożliwiając generowanie tego sygnału, lub jeśli procedura przerwania, którą obsługuje /NMI, zakończy się zwrotem, umieszczając go z powrotem w stan WSTRZYMANIA.
Rdzeń procesora SM83 w systemie Game Boy LR35902 na chipie ma podobny problem, wyzwalany przez dwa kolejne HALT z wyłączonymi przerwaniami. Sam rdzeń zawiera 11 opkodów, które całkowicie blokują procesor po wykonaniu.
Hitachi SC61860 używany głównie w komputerach kieszonkowych Sharp w latach 1980–1990 ma również nieudokumentowaną instrukcję HCF z kodem operacji 7B.