Od lamera do hakera/Procesor

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Mikroprocesor jest skomplikowanym automatem, który może wykonywać kilkaset dosyć prostych czynności - tzn. rozkazów maszynowych. Każdy rozkaz ma własny kod, liczbę zapisaną w jednym lub kilku bajtach. Procesor pobiera z pamięci kolejne bajty traktując je jako rozkazy lub dane i wykonuje zaprogramowane operacje. Wszystkie mikroprocesory zawierają podobne elementy:

  • układ sterowania i synchronizacji, który kontroluje pracę procesora i wytwarza sygnały potrzebne do sterowania niektórymi elementami komputera
  • arytmometr, czyli układ, który wykonuje operacje arytmetyczne i logiczne (niektóre procesory mają kilka arytmometrów)
  • rejestry, tj. układy pamięci
  • wewnętrzne szyny łączące elementy procesora

Podstawowymi rejestrami, które znajdują się w każdym mikroprocesorze, są:

  • licznik rozkazów - zawiera on adres następnego rozkazu do wykonania
  • rejestr rozkazów - zawiera kod aktualnie wykonywanego rozkazu
  • akumulator, jest używany w czasie wykonywania rozkazów arytmetycznych, logicznych, I/O i in.; niektóre procesory mają kilka takich rejestrów
  • rejestr znaczników - zawiera dodatkowe informacje o wyniku operacji arytmetyczno-logicznych, np. "wynik równy zeru"

Oprócz tego procesor ma kilka (kilkanaście) rejestrów używanych w czasie wykonywania niektórych rozkazów, np. wskaźnik stosu służący do adresowania pamięci.

Do budowy systemu komputerowego oprócz procesora, pamięci i układów I/O potrzeba kilkunastu innych układów scalonych pośredniczących między poszczególnymi elementami systemu, np. buforów i wzmacniaczy szyn, zegarów, układów zarządzania pamięcią itd. Niekiedy te dodatkowe układy umieszcza się razem z mikroprocesorem w jednym układzie scalonym.

Procesor pobiera z pamięci kod rozkazu wskazywanego przez licznik rozkazów i umieszcza go w rejestrze rozkazów. Układ sterowania dekoduje go i na jego podstawie steruje pracą rejestrów, układu arytmetyczno-logicznego oraz wewnętrznych szyn. Wykonanie instrukcji jest podzielone na kilka faz. Pierwszą fazą jest pobranie z pamięci kodu. Następnie, jeśli dany rozkaz tego wymaga pobiera się z pamięci lub rejestrów dane, tzw. argumenty - sposób uzyskiwania argumentów nazywa się trybem adresowania. Jeśli argument można uzyskiwać na wiele sposobów, czyli procesor ma dużo trybów adresowania, to programowanie jest łatwiejsze i bardziej efektywne. Wreszcie wykonuje się operacje (np. dodawania) i wynik umieszcza w jednym z rejestrów procesora lub w pamięci. Zawartość licznika rozkazów jest zwiększona, mikroprocesor pobiera z pamięci następny rozkaz programu.

Opisana procedura ulega zmianie, gdy nastąpi tzw. przerwanie (ang. interrupt). Powoduje je sygnał podany z urządzenia zewnętrznego do procesora. Przerywa on wtedy wykonywanie programu. zapamiętana zostaje zawartość licznika rozkazów i rozpoczyna się wykonywanie programu obsługi przerwań. Adres tego programu jest niekiedy ustalony, w innych przypadkach jest przesyłany przez specjalny układ przerwań. Takie przerwania są wykorzystywane do współpracy z urządzeniami I/O. Przerwanie może być także spowodowane wykonaniem specjalnego rozkazu maszynowego (przerwanie programowe). Adres programu obsługi przerwania jest w takim przypadku ustalony. Przerwania programowe służą zwykle do wywoływania programów systemu operacyjnego. Po zakończeniu obsługi przerwania wznawiane jest wykonywanie przerwanego programu.

Wszystkie operacje wykonywane przez procesor synchronizowane są impulsami przychodzącymi z zegara. Jedna instrukcja jest wykonywana w czasie kilku taktów zegara. Dlatego, gdy jego częstotliwość jest większa, procesor pracuje szybciej. Rozkazy wykonywane przez mikroprocesory można podzielić na następujące grupy:

  • przesłania bajtu lub kilku bajtów z pamięci do rejestrów, z rejestrów do pamięci lub między rejestrami
  • przesłania bajtu lub ciągu bajtów między rejestrami i układami I/O
  • arytmetyczne (dodawanie, odejmowanie, niekiedy mnożenie i dzielenie - dotyczy tylko liczb całkowitych o ograniczonej długości, np. 16 bitów)
  • logiczne (porównywanie, iloczyn logiczny itd.)
  • przetwarzanie ciągu bajtów (tylko proste operacje, np. przepisywanie lub porównywanie)
  • sterujące (tzn. zmieniające zawartość licznika rozkazów, np. skoki, wywołanie podprogramów, przerwania programowe)
  • sterujące pracą systemu komputerowego, np. zatrzymanie procesora.

Zakres działania niektórych rozkazów jest ograniczony. W szczególności argumentem rozkazów arytmetyczno-logicznych może być zawartość rejestrów procesora. Dotyczy to szczególnie starszych procesorów. Obecnie dąży się do tego, by procesor mógł wykonywać wszystkie operacje na danych wszystkich typów (tzn. na adresach, bajtach, dwubajtowych słowach itd.), odczytywanych z pamięci lub rejestrów przy zastosowaniu dowolnego trybu adresowania.

Mikroprocesory różnią się między sobą zbiorem (listą) rozkazów oraz organizacją rejestrów. Dlatego programy napisane w języku procesora jednego typu nie mogą być wykonywane przez inny mikroprocesor.

Operacje przesłania realizowane w mikroprocesorze.[edytuj]

Podstawowy rozkaz przesłania ma format przedstawiony na rysunku niżej. Jak widać, składa się on z trzech części, tzw. pól. Dwa ostatnie pola mają jednakową budowę i dzielą się na dwie części. Bit rejestr/pamięć decyduje o tym, czy informacja pochodzi z rejestru roboczego, czy też z pamięci adresowanej przez rejestr. Pole numeru rejestru określa ten rejestr.

Kod operacji (KOP)

Bit 0/1

Nr rejestru

Bit 0/1

Nr rejestru

Widać tu jeszcze raz podwójne funkcje pełnione przez rejestry procesora - służą one zarówno do przechowywania danych, jak i do adresowania pamięci danych. Przy opracowaniu programu dla mikrokomputera prawie zawsze zapisujemy rozkazy w postaci symbolicznej, podając (w omawianym przypadku rozkazu) nazwę rozkazu oraz źródło i przeznaczenie informacji. nazwa rozkazu jest w podanych dalej przykładach słowem w języku angielskim, oznaczającym czynność, która ma być wykonana po otrzymaniu rozkazu. Obok nazwy rozkazów będą przy ich wprowadzaniu podawane polskie odpowiedniki, ale należy pamiętać, że używane są nazwy angielskie lub ich skróty. Obok nazwy podawane są adresy w kodach przyjętych dla danego mikrokomputera. Rozkazy symboliczne są tłumaczone na postać binarną i wprowadzane do pamięci mikrokomputera.

Operacje arytmetyczne i logiczne.[edytuj]

Rozkazy realizujące operacje arytmetyczne i logiczne mają postać przedstawioną na rysunku niżej.

Kod grupy rozkazów

Kod operacji

Bit 0/1

Nr rejestru

Powodują one wykonanie operacji na zawartości wyróżnionego rejestru roboczego (np. RN) zwanego akumulatorem A i operandzie określonym przez pole operandu.

        A:=A operacja OP 
        gdzie OP - operand 

Pole operandu ma taki sam format jak w rozkazie MOVE, a więc operandem może być:

  • operand bezpośredni Y,
  • zawartość rejestru roboczego,
  • zawartość komórki pamięci zaadresowanej przez rejestr roboczy.

Rozkaz MOVE był przykładem rozkazu dwuadresowego: w rozkazie było określenie skąd należy pobrać operand i dokąd go przesłać. Rozkazy arytmetyczne i logiczne, mimo iż są one dwuargumentowe, są rozkazami jednoadresowymi, tj. w rozkazie jest określone skąd pobrać jeden z operandów. Drugim operandem jest zawsze zawartość akumulatora, wynik operacji jest również umieszczany w akumulatorze. Taka struktura rozkazu wynika głównie z braku miejsca na umieszczenie dwuadresów i kodu operacji w słowie. Typowe operacje arytmetyczne i logiczne zestawiono w tabeli poniżej.

Symbol

Nazwa

Treść operacji

ADD
SUB
AND
OR
XOR
INCR
DECR

dodaj
odejmij
mnóż logicznie
dodaj logicznie
suma logiczna modulo 2
zwiększ
zmniejsz

A := A + OP
A := A - OP
A := A ^ OP
A := A v OP
A := A ++ OP
OP := OP + 1
OP := OP - 1

Dwa ostatnie rozkazy w tabeli różnią się nieco od pięciu pierwszych - są to mianowicie rozkazy jednoargumentowe, wykonywane na zawartości jednego z rejestrów roboczych lub zawartości komórki pamięci, adresowanej przez rejestr (wskaźnik danych).

Operacje arytmetyczne realizowane są przez rozkazy ADD, SUB, INCR i DECR, operacje logiczne przez rozkazy ADD, OR i XOR. W przypadku operacji arytmetycznych operand jest traktowany jak liczba. Rozkazy logiczne powodują wykonanie operacji logicznych na bitach zawartości akumulatora i operandu, np. rozkaz XOR Y oznacza: gdzie A,Y - n-te bity akumulatora i operandu bezpośredniego Y. Wyniki poszczególnych operacji arytmetycznych i logicznych ustawiają tzw. wskaźniki stanu, dołączone do wyjść jednostki arytmetyczno-logicznej, tak jak to przedstawiono na rysunku niżej. Mikroprocesor zawiera trzy podstawowe wskaźniki (przerzutniki):

  • Zero (Z) - przerzutnik ustawiony w stan 1, gdy wynik operacji jest równy 0, a zerowany, jeżeli wynik operacji jest równy 1.
  • Znak (S) - przerzutnik, do którego wpisywany jest najstarszy bit wyniku.
  • Przeniesienie (C) - przerzutnik, do którego wpisywane jest przeniesienie z najstarszego bitu ALU.

Wskaźnik umożliwia dokonywanie rozgałęzień w programie w zależności od wyniku poprzednio wykonanej operacji.

Wymieniony zestaw elementarnych operacji arytmetycznych i logicznych nie wystarcza do zrealizowania dowolnie złożonej operacji przetwarzania informacji. Trzeba go uzupełnić przede wszystkim operacją przesuwania zawartości akumulatora - w prawo i w lewo. Do tego celu służą dwa rozkazy: RAL i RAR. Rozkazy te traktują akumulator i przerzutnik przeniesienia C jako jedną całość. Rozkaz RAL przesuwa zawartość akumulatora w stronę starszych bitów (w lewo), umieszczając najstarszy bit w przerzutniku przeniesienia C i jednocześnie wpisując poprzednią zawartość C do najmłodszego bitu akumulatora. Łatwo zobaczyć, że operacja ta odpowiada pomnożeniu zawartości akumulatora przez 2.

Operacje sterujące - skoki.[edytuj]

Symbol

Treść operacji

JUMP a
JP a
JM a
JZ a
JNZ a
JC a
JNC a
CALL a
RETURN

LR:=a
gdy S >= 0 to LR:=a
gdy S < 0 to LR:=a
gdy S = 0 to LR:=a
gdy S <> 0 to LR:=a
gdy C = 1 to LR:=a
gdy C = 0 to LR:=a
LR -> stos, LR:=a
stos -> LR

Program napisany przy użyciu dotychczas omówionych rozkazów wykonywany byłby w taki sposób, że po wykonaniu każdego rozkazu pobierany byłby z pamięci rozkaz następny, umieszczony bezpośrednio za nim. Zmianę naturalnej kolejności wykonywania sekwencji rozkazu umożliwiają rozkazy skoku. Są to rozkazy sterujące wykonywaniem programu.

Powyższe rozkazy umożliwiają skok do adresu, który został z góry określony przez programistę. Instrukcja MOVE LR, Ri, powodująca przesłanie zawartości pewnego rejestru roboczego Ri do licznika rozkazów, umożliwia ponadto skok do adresu, który został wyliczony przez program. Rozkaz skoku do podprogramu różni się tym od zwykłego rozkazu, że przy jego wykonaniu poprzednia zawartość LR jest zapamiętywana, co umożliwia powrót do miejsca, z którego nastąpił skok. Operacje skoku do podprogramu umożliwiają włączanie przez programistę do własnego programu całych sekwencji (ciągów) rozkazów bez ich przepisywania. Takie sekwencje rozkazów, realizujące określone zadanie (np. wyliczenie wartości funkcji trygonometrycznej, rozwiązanie równania kwadratowego itp.), umieszczane są w pamięci i mogą być wykorzystywane przez każdego użytkownika.

Do zapamiętania adresu powrotnego służy na ogół struktura danych zwana stosem. Stos jest to pamięć (pewien obszar pamięci zapisywalnej RAM) z dostępem jednostronnym - podobnie jak do stosu talerzy ułożonych jeden na drugim, w którym możemy tylko zdjąć ze stosu górny talerz lub dołożyć talerz na wierzch stosu.

Stos adresowany jest zawartością wyróżnionego wskaźnika danych (rejestru roboczego procesora) zwanego wskaźnikiem stosu WS. Po wpisaniu do wskaźnika stosu zawartości początkowej (adresu dna stosu) zawartość ta jest zmniejszana o 1 po każdym zapisie do pamięci i zwiększana o 1 po każdym odczycie z pamięci (rys. niżej). Wskaźnik stosu wskazuje ostatnią zajętą komórkę stosu.

WS

3

2

1

WS

4

3

2

1

Jednostka arytmetyczno-logiczna (ALU).[edytuj]

Zamiast stosować różne bloki funkcjonalne, z których każdy wykonuje pewne mikrooperacje, a ponadto przechowuje informację, można zbudować uniwersalny blok kombinacyjny, mogący wykonywać pełny zestaw mikrooperacji. Taki uniwersalny blok nisi nazwę jednostki arytmetyczno-logicznej (ang. Arythmetic-Logic Unit - ALU). Jednostka taka zwykle współpracuje z zespołem rejestrów, służących wyłącznie do przechowywania operacji. Jako przykład opisana zostanie jednostka ALU 74181.

Jednostka arytmetyczno-logiczna 74181 służy do wykonywania operacji arytmetycznych i logicznych na 4-bitowych liczbach A i B. Ma ona następujące wejścia i wyjścia:

·        A0..A3 i B0..B3 - wejścia argumentów, 
·        S0..S3 - wyjścia wyniku, 
·        C0,C4 - Wejście i wyjście przeniesienia, 
·        X,Y - Wyjścia przeniesień jednoczesnych, 
·        M - wejście trybu pracy, 
·        F0..F3 - wejścia sterujące, określające realizowaną funkcję, 
·        A = B - wyjścia porównujące. 

Jak widać, wejście i wyjście przeniesienia C są zanegowane. W tablicy poniżej opisano funkcje realizowane przez ALU.

Użyto w niej następujących oznaczeń:

        AB - iloczyn logiczny bitów, 
        A v B - suma logiczna bitów, 
        A ++ B - suma modulo 2, 
        A + B - suma arytmetyczna, 
        A - B - różnica arytmetyczna, 
        2 * A - iloczyn arytmetyczny. 

Wszystkie te działania uwzględniają przeniesienie z poprzedniego stopnia, a więc mogą być wykonywane na liczbach wielobitowych. Pozostałe 11 funkcji arytmetycznych stanowi "efekt uboczny" i jest mało użyteczne.

Funkcja

F3

F2

F1

F0

M = 1
Operacje logiczne

M = 0
Operacje arytmetyczne

0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

S=a
S=avb
S=aB
S=0
S=ab
S=b
S=A++B
S=Ab
S=avB
S=a++b
S=B
S=AB
S=1
S=Avb
S=AvB
S=A

S=A+C0
S=(AvB)+C0
S=(Avb)+C0
S=C0-1
S=A+Ab+C0
S=(AvB)+(Ab)+C0
S=A-B-(1-C0)
S=Ab-(1-C0)
S=A+AB+C0
S=A+B+C0
S=(Avb)+(AB)+C0
S=AB-(1-C0)
S=2*A+C0
S=(AvB)+A+C0
S=(Avb)+A+C0
S=A-(1-C0)

Małe litery a i b oznaczają negację bitów A i B.

Na wyjściu "A=B" pojawia sił sygnał 1, gdy na wyjściach wyniku są same jedynki. Wyjście to służy do porównywania liczb. Bloki ALU mogą być łączone kaskadowo, czas propagacji przeniesienia w takim układzie jest równy sumie czasów propagacji przez poszczególne bloki, a więc w przypadku większej liczby bitów czas wykonywania operacji będzie długi. Aby skrócić czas propagacji przeniesień, należy generować przeniesienia równoległe we wszystkich modułach. Są do tego potrzebne osobne bloki generatora przeniesień jednoczesnych (ang. Look-Ahead Carry Generator). Układy takie są produkowane jako bloki funkcjonalne MSI.

Informacja Autor ww. tekstu: Łuki 1166

Budowa[edytuj]

W funkcjonalnej strukturze procesora można wyróżnić takie elementy, jak:

  • zespół rejestrów do przechowywania danych i wyników, rejestry mogą być ogólnego przeznaczenia lub mają specjalne przeznaczenie,
  • jednostkę arytmetyczną (arytmometr) do wykonywania operacji obliczeniowych na danych,
  • układ sterujący przebiegiem wykonywania programu,
  • inne układy, w które producent wyposaża procesor w celu usprawnienia jego pracy.

Innym istotnym elementem jest tranzystor - umożliwia blokowanie lub przepływ prądu. Podstawowo dzielimy je na:

Bipolarny[edytuj]

Zbudowany jest z trzech warstw półprzewodnika o różnym typie przewodnictwa. Charakteryzuje się tym, że niewielki prąd płynący pomiędzy dwiema jego elektrodami (nazywanymi bazą i emiterem) steruje większym prądem płynącym między emiterem, a trzecią elektrodą (nazywaną kolektorem).


W normalnych warunkach pracy złącze kolektora jest spolaryzowane zaporowo. Napięcie przyłożone do złącza baza-emiter w kierunku przewodzenia powoduje przepływ prądu przez to złącze - nośniki z emitera (elektrony w tranzystorach npn lub dziury w tranzystorach pnp) przechodzą do obszaru bazy (stąd nazwa elektrody: emiter, bo emituje nośniki). Nośników przechodzących w przeciwną stronę, od bazy do emitera jest niewiele, ze względu na słabe domieszkowanie bazy. Nośniki wprowadzone z emitera do obszaru bazy dyfundują w stronę mniejszej ich koncentracji - do kolektora. Dzięki niewielkiej grubości obszaru bazy trafiają do obszaru drugiego złącza, a tu na skutek pola elektrycznego w obszarze zubożonym są przyciągane do kolektora.


W rezultacie, po przyłożeniu do złącza emiterowego napięcia w kierunku przewodzenia, popłynie niewielki prąd między bazą a emiterem, umożliwiający przepływ dużego prądu między kolektorem a emiterem. Stosunek prądu kolektora do prądu bazy nazywany jest wzmocnieniem prądowym tranzystora i oznacza się grecką literą ?.


Za sygnał sterujący prądem kolektora można uważać zarówno prąd bazy, jak i napięcie baza-emiter. Zależność między tymi dwiema wielkościami opisuje charakterystyka wejściowa tranzystora, będąca w zasadzie eksponencjalną charakterystyką złącza pn spolaryzowanego w kierunku przewodzenia.


Prąd bazy składa się z dwóch głównych składników: prądu rekombinacji i prądu wstrzykiwania. Prąd rekombinacji to prąd powstały z rekombinacji w bazie nośników wstrzykniętych z emitera do bazy z nośnikami komplementarnymi. Jest tym mniejszy im cieńsza i słabiej domieszkowana jest baza. Prąd wstrzykiwania jest to prąd złożony z nośników wstrzykniętych z bazy do emitera, jego wartość zależy od stosunku koncentracji domieszek w obszarze bazy i emitera.


Polowy[edytuj]

Zasadniczą częścią tranzystora polowego jest kryształ odpowiednio domieszkowanego półprzewodnika z dwiema elektrodami: źródłem (symbol S od ang. source, odpowiednik emitera w tranzystorze bipolarnym) i drenem (D, drain, odpowiednik kolektora). Pomiędzy nimi tworzy się tzw. kanał, którym płynie prąd. Wzdłuż kanału umieszczona jest trzecia elektroda, zwana bramką (G, gate, odpowiednik bazy). W tranzystorach epiplanarnych, jak również w przypadku układów scalonych, w których wytwarza się wiele tranzystorów na wspólnym krysztale, wykorzystuje się jeszcze czwartą elektrodę, tzw. podłoże (B, bulk albo body), służącą do odpowiedniej polaryzacji podłoża.


Przyłożone do bramki napięcie wywołuje w krysztale dodatkowe pole elektryczne, które wpływa na rozkład nośników prądu w kanale. Skutkiem tego jest zmiana efektywnego przekroju kanału, co objawia się jako zmiana oporu dren-źródło.


W tranzystorach MOSFET z kanałem wzbogacanym gdy napięcie UGS między bramką G a źródłem S jest równe zeru, rezystancja kanału jest bardzo duża (rzędu megaomów). Mówi się wówczas, że kanał jest zatkany, ponieważ prąd dren-źródło ID praktycznie nie płynie. Po przekroczeniu pewnej wartości napięcia UGS kanał zaczyna się stopniowo otwierać i w obwodzie dren-źródło może płynąć prąd. Rezystancja między drenem D a źródłem S zmniejsza się ze wzrostem napięcia UGS, ale nie do zera, tylko do pewnej minimalnej wartości oznaczanej w katalogach jako RDSon. Wartość tej rezystancji zależy od maksymalnego napięcia UDS jakie jest w stanie wytrzymać tranzystor i wynosi od 0,07 ? do 4,0 ?. Generalnie tranzystory przeznaczone do pracy z mniejszymi napięciami mają niższą rezystancję RDSon[1]. Straty mocy w przewodzącym tranzystorze są proporcjonalne do prądu płynącego przez kanał zgodnie ze wzorem:


P_{str}=I^2 \cdot R_{DSon}\,

Gdy prąd płynący przez kanał osiągnie wartość maksymalną dla danego napięcia dren-źródło, mówi się, że kanał jest otwarty.

W zależności od typu półprzewodnika, w którym tworzony jest kanał, rozróżnia się:

tranzystory z kanałem typu p, w którym prąd płynie od źródła do drenu tranzystory z kanałem typu n, w którym prąd płynie od drenu do źródła

Ze względu na budowę i sposób działania tranzystorów polowych, prąd bramki praktycznie nie płynie (jest rzędu mikro-, nanoamperów), dzięki temu elementy te charakteryzują się bardzo dużą rezystancją wejściową oraz dużą transkonduktancją.

Obudowa[edytuj]

Główna nazwa obudowy układów scalonych to PGA - pozostałe to właściwie tylko jej odmiany:

  • PGA (ang. Pin Grid Array)
  • PPGA (Plastic PGA CPGA (Ceramic PGA)
  • FC-PGA (Fili Chip PGA)
  • FC-PGA2(Filip Chip PGA2)
  • SPGA (Staggered PGA)
  • SECCM (Single Edge Contact Cartridge)
  • SEPP(Single Edge Processor Package)
  • Micro-FCBGA (Flip Chip Ball Grid Array)
  • LGA

Artykuł nie wyczerpuje tematu - warto w tym celu zagłębić się w tajniki asemblera. Warto mieć na uwadze, że każdy jego dialekt może być odczuwalnie odmienny jeśli będziemy pisać pod różne procesory, stąd też używanie go do pisania programów na niespójne ze sobą urządzenia, jak komputery osobiste bądź nowoczesne urządzenia mobilne, będzie stratą czasu. Świetnie się jednak nadaje do programowania maszyn typu mainframe bądź starych konsol z czasów 8-bitowcow, lub zwykłego firmware.