Dane oryginału

Computer Organization and Architecture, William Stallings, ISBN-13: 9780134997193, Edition: 11th

Authorized translation from the English language edition, entitled Computer Organization and Architecture, 11th Edition, by William Stallings, published by Pearson Education, Inc, publishing as Pearson, Copyright © 2019 Pearson Education, Inc.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc.

Polish language edition published by Polish Scientific Publishers PWN, Copyright © 2022

Przekład: Piotr Fabijańczyk na zlecenie WITKOM Witold Sikorski

Projekt okładki polskiego wydania: INT-MEDIA

Wydawca: Wioleta Szczygielska-Dybciak

Redaktor prowadzący: Monika Zabrocka-Kutera

Redaktor: Anna Bogdanienko

Indeks: Alicja Żarowska-Mazur

Koordynator produkcji: Anna Bączkowska

Skład wersji elektronicznej na zlecenie Wydawnictwo Naukowe PWN S.A.: Michał Latusek

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw, jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty, nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN S.A.

Warszawa 2022

ISBN: 978-83-01-22632-9

eBook został przygotowany na podstawie wydania papierowego z 2022r. (Wydanie I)

Warszawa 2022

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl, reklama@pwn.pl
www.pwn.pl

Fragment

Przedmowa

O Autorze

Część pierwsza. Wprowadzenie

Rozdział 1. Podstawowe pojęcia i ewolucja komputerów

1.1. Organizacja i architektura

1.2. Struktura i działanie

1.3. Komputer IAS

1.4. Bramki, komórki pamięci, układy i moduły wieloukładowe

1.5. Ewolucja architektury Intel x86

1.6. Systemy wbudowane

1.7. Architektura ARM

1.8. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 2. Koncepcje wydajności

2.1. Projektowanie zorientowane na wydajność

2.2. Wielordzeniowość, MIC i GPGPU

2.3. Prawo Amdahla i prawo Little’a

2.4. Podstawowe miary wydajności komputera

2.5. Obliczanie wartości średniej

2.6. Benchmarki i SPEC

2.7. Podstawowe pojęcia, pytania sprawdzające i zadania

Część druga. SYSTEM KOMPUTEROWY

Rozdział 3. Widok najwyższego poziomu na działanie i połączenia wewnętrzne komputera

3.1. Zespoły komputera

3.2. Działanie komputera

3.3. Struktury połączeń wzajemnych

3.4. Połączenie magistralowe

3.5. Połączenia punkt-punkt

3.6. PCI Express

3.7. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 4. Hierarchia pamięci: lokalność i wydajność

4.1. Zasada lokalności

4.2. Charakterystyka systemów pamięci

4.3. Hierarchia pamięci

4.4. Modelowanie wydajności wielopoziomowej hierarchii pamięci

4.5. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 5. Pamięć podręczna

5.1. Koncepcje pamięci podręcznej

5.2. Elementy projektowania pamięci podręcznej

5.3. Organizacja pamięci podręcznej Intel x86

5.4. Organizacja pamięci podręcznej IBM z13

5.5. Modele wydajności pamięci podręcznej

5.6. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 6. Pamięć wewnętrzna

6.1. Półprzewodnikowa pamięć główna

6.2. Korekcja błędów

6.3. DDR DRAM

6.4. eDRAM

6.5. Pamięć flash

6.6. Nowsze technologie nieulotnej pamięci półprzewodnikowej

6.7. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 7. Pamięć zewnętrzna

7.1. Dysk magnetyczny

7.2. RAID

7.3. Dyski SSD

7.4. Pamięć optyczna

7.5. Taśma magnetyczna

7.6. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 8. Wejście/wyjście

8.1. Urządzenia zewnętrzne

8.2. Moduły we-wy

8.3. Programowane we-wy

8.4. We-wy sterowane przerwaniami

8.5. Bezpośredni dostęp do pamięci

8.6. Bezpośredni dostęp do pamięci podręcznej

8.7. Kanały we-wy i procesory

8.8. Standardy interfejsów zewnętrznych

8.9. Struktura we-wy IBM z13

8.10. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 9. Obsługa systemów operacyjnych

9.1. Przegląd systemu operacyjnego

9.2. Szeregowanie czasowe

9.3. Zarządzanie pamięcią

9.4. Zarządzanie pamięcią Intel x86

9.5. Zarządzanie pamięcią ARM

9.6. Podstawowe pojęcia, pytania sprawdzające i problemy

Część trzecia. ARYTMETYKA I LOGIKA

Rozdział 10. Systemy liczbowe

10.1. System dziesiętny

10.2. Pozycyjne systemy liczbowe

10.3. System binarny

10.4. Konwersja między systemem binarnym i dziesiętnym

10.5. Notacja szesnastkowa

10.6. Podstawowe pojęcia i zadania

Rozdział 11. Arytmetyka komputera

11.1. Jednostka arytmetyczna i logiczna

11.2. Reprezentacja liczb całkowitych

11.3. Arytmetyka liczb całkowitych

11.4. Reprezentacja zmiennoprzecinkowa

11.5. Arytmetyka zmiennoprzecinkowa

11.6. Podstawowe pojęcia, pytania sprawdzające i zadania

Rozdział 12. Cyfrowe układy logiczne

12.1. Algebra Boole’a

12.2. Bramki

12.3. Układy kombinacyjne

12.4. Układy sekwencyjne

12.5. Programowalne urządzenia logiczne

12.6. Podstawowe pojęcia i zadania

Dodatek A. Magistrale systemowe

A.1. Struktura magistrali

A.2. Hierarchie wielomagistralowe

A.3. Elementy projektu magistrali

Dodatek B. Koncepcje pamięci podręcznej ofiar

B.1. Pamięć podręczna ofiar

B.2. Selektywna pamięć podręczna ofiar

Dodatek C. Pamięć z przeplotem

Dodatek D. Międzynarodowy alfabet referencyjny

Dodatek E. Stosy

E.1. Stosy

E.2. Implementacja stosu

E.3. Sposoby zapisywania wyrażeń

Dodatek F. Procedury rekurencyjne

F.1. Rekurencja

F.2. Reprezentacja drzewa aktywacji

F.3. Implementacja stosu

F.4. Rekurencja i iteracja

Dodatek G. Zagadnienia dodatkowe dotyczące przetwarzania potokowego rozkazów

G.1. Tablice rezerwacji przetwarzania potokowego

G.2. Bufory zmiany kolejności

G.3. Algorytm Tomasula

G.4. Tablica wyników

Słownik

Odwołania literaturowe

Przypisy

Pozostałe rozdziały dostępne w pełnej wersji e-booka.

Tricii, mojej kochającej żonie, która jest najmilszą i najdelikatniejszą osobą.

Przedmowa

NOWOŚCI W XI WYDANIU

Od czasu opublikowania dziesiątego wydania tej książki, w omawianej dziedzinie obserwuje się ciągły rozwój i wynikające z tego innowacje i ulepszenia. W tym nowym wydaniu staram się uchwycić te zmiany, zachowując jednocześnie szerokie i kompleksowe pokrycie całej dziedziny. Dziesiąte wydanie tej książki zostało obszernie zrecenzowane przez wielu profesorów nauczających tego przedmiotu oraz przez profesjonalistów pracujących w tej dziedzinie. W rezultacie w wielu miejscach narracja została doprecyzowana i uściślona, a ilustracje poprawione.

Poza tymi udoskonaleniami wprowadzono także istotne zmiany mające na celu poprawy aspektu dydaktycznego i przystępności dla czytelnika. Utrzymany został podobny układ rozdziałów, jednak większość materiału została poprawiona oraz dodano nowe materiały. Najważniejsze zmiany to:

• Moduły wieloukładowe: w rozdziale 1 dodano nowe omówienie powszechnie stosowanych obecnie modułów MCM.

• Testy SPEC: zaktualizowano omówienie SPEC w rozdziale 2 tak, aby objąć nowy pakiet testów SPEC CPU2017.

• Hierarchia pamięci: nowy rozdział dotyczący hierarchii pamięci obejmuje teraz nowe informacje oraz te, które znajdowały się w rozdziale dotyczącym pamięci podręcznej. Nowy rozdział 4 zawiera:

– Zaktualizowany i rozszerzony opis zasady lokalności.

– Zaktualizowany i rozszerzony opis hierarchii pamięci.

– Nowe podejście do modelowania wydajności dostępu do danych w hierarchii pamięci.

• Pamięć podręczna: rozdział dotyczący pamięci podręcznej został zaktualizowany i poprawiony. Rozdział 5 zawiera teraz:

– Zmieniony i rozszerzony opis logicznej organizacji pamięci podręcznej, w tym nowe rysunki poprawiające przejrzystość tekstu.

– Nowy opis pamięci adresowalnej zawartością.

– Nowy opis zasad zapisu z alokacją i zapisu bez alokacji.

– Nową część dotyczącą modelowania wydajności pamięci podręcznej.

• Wbudowana pamięć DRAM: rozdział 6 dotyczący pamięci wewnętrznej zawiera teraz część dotyczącą coraz bardziej popularnej pamięci eDRAM.

• Dyski twarde z sektorem Advanced Format 4 k: rozdział 7 dotyczący pamięci zewnętrznej zawiera teraz omówienie szeroko obecnie używanego formatu dysku twardego o sektorze 4 k.

• Algebra Boole’a: dyskusja na temat algebry Boole’a w rozdziale 12 została rozszerzona o nowy tekst, rysunki i tabele w celu lepszego zrozumienia.

• Język asemblera: opis języka asemblera został rozszerzony do pełnego rozdziału, z większą liczbą szczegółów i przykładów.

• Organizacja przetwarzania potokowego: dyskusja na temat przetwarzania potokowego została znacznie rozszerzona o nowy tekst i rysunki. Informacje na ten temat znajdują się w nowych częściach rozdziału 16 (Struktura i działanie procesora), 17 (Komputery z zredukowaną listą rozkazów) i 18 (Równoległość na poziomie rozkazu i procesory superskalarne).[1]

• Spójność pamięci podręcznej: omówienie protokołu spójności pamięci podręcznej MESI w rozdziale 20 zostało rozszerzone o nowy tekst i rysunki.

WSPARCIE PROGRAMÓW NAUKI INFORMATYKI ACM/IEEE I INŻYNIERII KOMPUTEROWEJ

Książka jest przeznaczona zarówno dla odbiorców akademickich, jak i profesjonalnych. Jako podręcznik jest przeznaczony na jedno- lub dwusemestralne studia licencjackie na kierunkach informatyka, inżynieria komputerowa i elektryczna. To wydanie jest zgodne z zaleceniami programu nauczania informatyki ACM/IEEE 2013 (CS2013). Godnie z CS2013 zawartość kursu została podzielona na trzy kategorie: poziom 1 (wszystkie tematy powinny być uwzględnione w programie nauczania), poziom 2 (należy uwzględnić wszystkie lub prawie wszystkie tematy) oraz tematy do wyboru (pożądane, by zapewnić poszerzenie wiedzy). Zakres wiedzy w dziedzinie architektura i organizacja według standardu CS2013 obejmuje pięć tematów poziomu 2 i trzy tematy do wyboru, z których każdy ma kilka podtematów. Tekst tej książki obejmuje wszystkie osiem tematów wymienionych w CS2013. W tabeli P.1 przedstawiono pokrycie dla zakresu wiedzy architektura i organizacja zawartego w tym podręczniku. Książka ta obejmuje również program nauczania inżynierii komputerowej ACM/IEEE 2016 (CE2016). CE2016 definiuje niezbędny zasób wiedzy dla poziomu licencjatu w zakresie inżynierii komputerowej, podzielony na dwanaście obszarów. Jednym z tych obszarów jest architektura i organizacja komputerów (CE-CAO), składająca się z dziesięciu kluczowych obszarów wiedzy. Tekst książki obejmuje wszystkie obszary wiedzy CE-CAO wymienione w CE2016. W tabeli P.2 przedstawiono pokrycie tego zakresu wiedzy.

Tabela P.1. Zakres wiedzy CS2013 architektura i organizacja

Jednostki wiedzy IAS

Tematy

Rozdziały w książce

Logika cyfrowa i systemy cyfrowe (poziom 2)

• Przegląd i historia architektury komputerowej.

• Układy logiczne kombinowane a układy logiczne sekwencyjne/macierze bramek programowalnych przez użytkownika jako podstawowy element składowy kombinacyjnej logiki sekwencyjnej.

• Wiele reprezentacji/warstw interpretacji (sprzęt to tylko kolejna warstwa).

• Ograniczenia fizyczne (opóźnienia bramki, obciążalność wejściowa i wyjściowa, energia/moc).

Rozdział 1

Rozdział 12

Reprezentacja danych na poziomie maszyny (poziom 2)

• Bity, bajty i słowa.

• Numeryczna reprezentacja danych i systemy liczbowe.

• Systemy stało- i zmiennoprzecinkowe.

• Notacja ze znakiem i uzupełnienia do dwóch.

• Reprezentacja danych nienumerycznych (kody znaków, dane graficzne).

Rozdział 10

Rozdział 11

Organizacja komputera na poziomie podstawowym (poziom 2)

• Podstawowa organizacja maszyny von Neumanna.

• Jednostka sterująca, pobieranie, dekodowanie i wykonywanie rozkazów.

• Listy i rodzaje rozkazów (operacje na danych, sterowanie, we-wy).

• Programowanie w asemblerze/języku maszynowym.

• Formaty rozkazów.

• Tryby adresowania.

• Mechanizmy wywoływania i powrotu z podprogramów (język PL/1, tłumaczenie i wykonywanie)

• We-wy i przerwania.

• Wieloprocesory z pamięcią współdzieloną/organizacja wielordzeniowa.

• Wprowadzenie do porównania SIMD i MIMD oraz taksonomii Flynna.

Rozdział 1

Rozdział 8

Rozdział 13

Rozdział 14

Rozdział 15

Rozdział 19

Rozdział 20

Rozdział 21

Organizacja i architektura systemu pamięci

(poziom 2)

• Systemy przechowywania i ich technologia.

• Hierarchia pamięci: lokalność czasowa i przestrzenna.

• Organizacja i operacje w pamięci głównej.

• Opóźnienie, czas cyklu, przepustowość i przeplot.

• Pamięć podręczna (odwzorowywanie adresu, rozmiar bloku, zasady wymiany i przechowywania).

• Spójność pamięci podręcznej wieloprocesorów, stosowanie systemów pamięci do synchronizacji między rdzeniami, operacje natychmiastowe pamięci.

• Pamięć wirtualna (tablica stron, TLB).

• Obsługa usterek i niezawodność.

Rozdział 4

Rozdział 5

Rozdział 6

Rozdział 7

Rozdział 9

Rozdział 20

Interfejsy i komunikacja

(poziom 2)

• Podstawy we-wy: uzgadnianie, buforowanie, programowane we-wy, we-wy sterowane przerwaniami.

• Struktury przerwań: wektorowe i priorytetowe, potwierdzanie przerwań.

• Pamięć zewnętrzna, organizacja fizyczna i dyski.

• Magistrale: protokoły magistrali, arbitraż, bezpośredni dostęp do pamięci (DMA).

• Architektury RAID.

Rozdział 3

Rozdział 7

Rozdział 8

Organizacja funkcjonalna (obieralny)

• Implementacja prostych ścieżek danych, w tym przetwarzanie potokowe rozkazów, wykrywanie zagrożeń i rozwiązywanie.

• Jednostka sterująca: realizacja sprzętowa i mikroprogramowa.

• Przetwarzanie potokowe rozkazów.

• Wprowadzenie do równoległości na poziomie rozkazu (ILP, ang. instruction-level parallelism).

Rozdział 16

Rozdział 17

Rozdział 18

Rozdział 19

Architektury wieloprocesorowe i alternatywne (obieralny)

• Przykładowe listy rozkazów SIMD i MIMD oraz

• architektury.

• Sieci połączeń wzajemnych.

• Współdzielona pamięć w systemach wieloprocesorowych i spójność pamięci.

• Spójność pamięci podręcznej w systemach wieloprocesorowych.

Rozdział 20

Rozdział 21

Ulepszenia wydajności (obieralny)

• Architektura superskalarna.

• Przewidywanie rozgałęzień, wykonanie spekulatywne, wykonanie poza kolejnością.

• Pobieranie wstępne.

• Procesory wektorowe i GPU.

• Wsparcie sprzętowe dla wielowątkowości.

• Skalowalność.

Rozdział 17

Rozdział 18

Rozdział 20

Tabela P.2. Zakres wiedzy architektura i organizacja komputerów CE2016

Jednostki wiedzy

Rozdziały w książce

Historia i przegląd

Rozdział 1 — Podstawowe pojęcia i ewolucja komputerów

Odpowiednie narzędzia, standardy i/lub inżynieria ograniczenia

Rozdział 3 — Widok najwyższego poziomu na działanie i połączenia wewnętrzne komputera

Architektura zestawu instrukcji

Rozdział 13 — Listy rozkazów: cechy i funkcje

Rozdział 14 — Listy rozkazów instrukcji: tryby i formaty adresowania

Rozdział 15 — Język asemblera i tematy pokrewne

Pomiar wydajności

Rozdział 2 — Koncepcje wydajności

Arytmetyka komputerowa

Rozdział 10 — Systemy liczbowe

Rozdział 11 — Arytmetyka komputera

Organizacja procesora

Rozdział 16 — Struktura i działanie procesora

Rozdział 17 — Komputery z zredukowaną listą rozkazów

Rozdział 18 — Równoległość na poziomie rozkazu i procesory superskalarne

Rozdział 19 — Działanie jednostki sterującej i sterowanie za pomocą mikroprogramu

Organizacja systemu pamięci i architektury

Rozdział 4 — Hierarchia pamięci: lokalność i wydajność

Rozdział 5 — Pamięć podręczna

Rozdział 6 — Pamięć wewnętrzna

Rozdział 7 — Pamięć zewnętrzna

Interfejs wejścia/wyjścia i komunikacja

Rozdział 8 — Wejście/wyjście

Podsystemy peryferyjne

Rozdział 3 — Widok najwyższego poziomu na działanie i połączenia wewnętrzne komputera

Rozdział 8 — Wejście/wyjście

Architektury wielordzeniowe/wielordzeniowe

Rozdział 21 — Komputery wielordzeniowe

Architektury systemów rozproszonych

Rozdział 20 — Przetwarzanie równoległe

CELE

Niniejsza książka, która dotyczy budowy i funkcjonowania komputerów, ma na celu jak najjaśniejsze i najpełniejsze przedstawienie natury i cech współczesnego systemu komputerowego.

Z kilku powodów jest to trudne zadanie. Po pierwsze, istnieje ogromna różnorodność produktów, które mogą całkiem słusznie zostać nazywane komputerem, od jednoukładowych mikroprocesorów za kilka dolarów do superkomputerów kosztujących dziesiątki milionów dolarów. Różnorodność przejawia się nie tylko w kwestii kosztów, ale dotyczy także wielkości, wydajności oraz zastosowania. Drugim z powodów jest szybkie i nieustanne tempo zmian, które zawsze charakteryzowało technologię komputerową. Zmiany te obejmują wszystkie aspekty technologii komputerowej, od podstawowej technologii układów scalonych, wykorzystywanej do konstruowania komponentów komputerowych, po coraz częstsze stosowanie koncepcji organizacji równoległych w łączeniu tych komponentów.

Pomimo różnorodności i tempa zmian w dziedzinie komputerów pewne podstawowe rozwiązania są ciągle konsekwentnie używane. Zastosowanie tych koncepcji zależy jednak od aktualnego stanu technologicznego oraz założeń projektowych dotyczących relacji ceny do wydajności. Intencją tej książki jest dokładne omówienie podstaw organizacji i architektury komputerów oraz odniesienie ich do współczesnych zagadnień projektowych.

Już sam podtytuł książki może sugerować temat i podejście przyjęte w tej książce. Zawsze było istotne, by projektować systemy komputerowe o wysokiej wydajności, jednak nigdy ten wymóg nie był tak ważny i jednocześnie trudny do spełnienia jak obecnie. Wszystkie podstawowe charakterystyki wydajności systemów komputerowych, w tym szybkość procesora, szybkość pamięci, pojemność pamięci i szybkości transmisji danych wzajemnych połączeń, gwałtownie rosną. Co więcej, rosną w różnym tempie. Utrudnia to zaprojektowanie zrównoważonego systemu, który maksymalizuje wydajność i wykorzystanie wszystkich komponentów. W ten sposób projektowanie komputerów staje się coraz bardziej grą polegającą na zmianie struktury lub funkcjonowania w jednym obszarze tak, aby zrekompensować niedopasowanie wydajności w innej dziedzinie. Zagadnienie to omówiono w książce na przykładach dotyczących wielu decyzji projektowych.

System komputerowy, jak każdy inny system, składa się z powiązanych ze sobą zestawów komponentów. System można najlepiej scharakteryzować, określając jego strukturę, czyli sposób, w jaki elementy są ze sobą połączone, oraz funkcjonowanie, czyli działania poszczególnych komponentów. Co więcej, należy pamiętać, że struktura komputera jest hierarchiczna. Każdy główny komponent można opisać bardziej szczegółowo, rozkładając go na istotne elementy składowe i opisując ich strukturę oraz funkcjonowanie. W celu zachowania przejrzystości i przystępności struktura hierarchiczna została opisana „od góry do dołu”:

• System komputerowy: główne komponenty to procesor, pamięć i urządzenia we-wy.

• Procesor: główne komponenty to jednostka sterująca, rejestry, jednostka arytmetyczno-logiczna i jednostka wykonująca rozkazy.

• Jednostka sterująca: dostarcza sygnały sterujące do obsługi i koordynacji wszystkich elementów procesora. Tradycyjne podejście wdrożenia jednostki sterującej opierało się na mikroprogramowaniu, w którym głównymi komponentami są pamięć sterowania, zespół szeregowania mikroinstrukcji oraz rejestry. Ostatnio jest to podejście rzadko stosowane, pozostaje jednak ciągle ważną techniką wdrażania.

Autorowi bardzo zależało na zaprezentowaniu materiału w sposób przejrzysty i czytelny, aby zminimalizować ryzyko zgubienia się czytelnika oraz zapewnić lepszą motywację niż podejście oddolne.

W trakcie dyskusji aspekty systemu zostały rozpatrzone z punktu widzenia zarówno architektury (czyli atrybutów systemu widocznych dla programującego w języku maszynowym), jak i organizacji (czyli jednostek operacyjnych i ich wzajemnych połączeń tworzących architekturę).

PRZYKŁADOWE SYSTEMY

Ten tekst ma na celu zapoznanie czytelnika z zasadami projektowania i problemami implementacji współczesnych systemów operacyjnych. W związku z tym podeście czysto koncepcyjne lub teoretyczne byłoby niewystarczające. Zatem w celu zilustrowania koncepcji i powiązania ich z rzeczywistymi decyzjami projektowymi, jako omawiane przykłady, wybrano dwie rodziny procesorów:

• Architektura Intel x86: Architektura x86 jest najpowszechniej stosowana w niewbudowanych systemach komputerowych. x86 jest zasadniczo komputerem ze złożoną listą rozkazów (CISC) z pewnymi funkcjonalnościami RISC. Ostatni przedstawiciele rodziny x86 korzystają z superskalarnych i wieloprocesorowych zasad projektowania. Ewolucja funkcjonalności architektury x86 dostarcza unikalnego studium przypadku ewolucji większości zasad projektowania w architekturze komputerowej.

• ARM: Architektura ARM jest prawdopodobnie najczęściej używanym procesorem wbudowanym, który jest używany w telefonach komórkowych, iPodach, zdalnych czujnikach i wielu innych urządzeniach. ARM jest zasadniczo komputerem o zredukowanej liście rozkazów (RISC). Ostatni przedstawiciele rodziny ARM korzystają z superskalarnych i wielordzeniowych zasad projektowania.

Wiele przykładów, ale nie wszystkie zaprezentowane w tej książce, pochodzi z tych dwóch rodzin komputerów. Wiele innych systemów zarówno współczesnych, jak i historycznych może być równie istotnymi przykładami cech projektowych architektury komputerowej.

UKŁAD TEKSTU

Książka została podzielona na sześć części:

• Wprowadzenie.

• System komputerowy.

• Arytmetyka i logika.

• Zestawy instrukcji i język asemblera.

• Jednostka centralna.

• Organizacja równoległa, w tym wielordzeniowa.

Książka zawiera szereg metod pedagogicznych, w tym wykorzystanie interaktywnych symulacji oraz liczne rysunki i tabele w celu zobrazowania dyskusji. Każdy rozdział zawiera listę podstawowych pojęć, pytań sprawdzających i zadań domowych. Książka zawiera również obszerny słowniczek, listę często używanych akronimów oraz bibliografię.

MATERIAŁY WSPOMAGAJĄCE DLA DYDAKTYKÓW

Materiały pomocnicze dla dydaktyków są dostępne w Instructor Resource Center (IRC) tego podręcznika, do którego można uzyskać dostęp za pośrednictwem witryny internetowej wydawcy www.pearson.com/stallings. W celu uzyskania dostępu do IRC prosimy o kontakt z lokalnym przedstawicielem handlowym Pearson poprzez stronę www.pearson.com/replocator. IRC udostępnia następujące materiały:

• Podręcznik projektów: zasoby projektowe, w tym dokumenty i oprogramowanie przenośne, a także sugerowane tematy projektów dla wszystkich kategorii projektów wymienionych w dalszej części przedmowy.

• Podręcznik rozwiązań: rozwiązania zadań umieszczonych na końcu każdego rozdziału.

• Slajdy PowerPoint: zestaw prezentacji obejmujących wszystkie rozdziały, które można wykorzystać podczas wykładów.

• Pliki PDF: kopie wszystkich rysunków i tabel z książki.

• Zbiór testów: zestaw pytań do każdego z rozdziałów.

• Przykładowe sylabusy: tekst zawiera więcej materiału, niż można wygodnie przerobić w ciągu jednego semestru. W związku z tym dydaktycy mogą wykorzystać kilka przykładowych programów nauczania przeznaczonych do wykorzystania tekstu w ograniczonym czasie. Te programy zostały oparte na rzeczywistych doświadczeniach profesorów z pierwszym wydaniem tej książki.

ZASOBY STUDENCKIE

W nowym wydaniu udostępniono online ogromną ilość oryginalnych materiałów pomocniczych z przeznaczeniem dla studentów. Witryna internetowa Companion, znajdująca się pod adresem www.pearson.com/stallings, zawiera listę odnośników uporządkowanych według rozdziałów oraz arkusz erraty do tej książki. W celu ułatwienia studentom zrozumienia materiału zamieszczono tam także osobny zestaw zadań domowych wraz z rozwiązaniami. Studenci mogą zwiększyć swoje zrozumienie materiału przez: wypracowanie rozwiązań tych problemów, a następnie sprawdzenie własnych odpowiedzi. Witryna zawiera również szereg dokumentów i artykułów, do których odwołuje się tekst.

PROJEKTY I INNE ĆWICZENIA STUDENTÓW

Dla wielu dydaktyków ważnym elementem nauczania organizacji i architektury komputerowej jest wykonanie projektu lub zestaw projektów, dzięki którym student zdobywa praktyczne doświadczenie. Ta książka zapewnia niezrównany poziom wsparcia na potrzeby włączenia komponentu projektu do kursu nauczania. Materiały pomocnicze dydaktyka dostępne za pośrednictwem IRC zawierają nie tylko wskazówki dotyczące przydzielania i struktury projektów, ale także zestaw podręczników dla różnych typów projektów oraz konkretnych zadań, wszystkie napisane specjalnie na potrzeby tej książki. Dydaktycy mogą przypisywać pracę w następujących obszarach:

• Symulacje interaktywne: opisane w dalszej części.

• Projekty badawcze: seria zadań badawczych, które instruują studenta, by zbadał określony temat w internecie i napisał na ten temat raport.

• Projekty symulacyjne: IRC zapewnia obsługę dwóch pakietów symulacyjnych. SimpleScalar może być używany do badania zagadnień związanych z organizacją i architekturą komputerów. SMPCache zapewnia potężne narzędzie edukacyjne do badania problemów z projektowaniem pamięci podręcznej dla wieloprocesorowości symetrycznej.

• Projekty w języku asemblera: używany jest uproszczony język asemblera, CodeBlue, a zadania zostały oparte na popularnej koncepcji Core Wars.

• Zadania do czytania/raportowania: lista artykułów, po jednym lub więcej na każdy rozdział, które można przydzielić studentom do przeczytania, a następnie napisania krótkiego raportu.

• Zadania opisowe: lista zadań pisemnych ułatwiająca naukę materiału.

• Zbiór testów: Obejmuje testy prawda/fałsz, wielokrotnego wyboru oraz pytania i odpowiedzi do wypełnienia.

Taki zróżnicowany zestaw projektów i innych ćwiczeń dla studentów umożliwia dydaktykom wykorzystanie książki jako jednego elementu bogatego i zróżnicowanego doświadczenia edukacyjnego oraz dostosowanie koncepcji kursu do specyficznych potrzeb dydaktyka i studentów.

SYMULACJE INTERAKTYWNE

Ważną cechą tej edycji jest włączenie interaktywnych symulacji. Symulacje te stanowią potężne narzędzie do zrozumienia złożonych cech projektowych nowoczesnych systemów komputerowych. Do zilustrowania kluczowych funkcjonalności i algorytmów w organizacji i projektowaniu architektury komputerów wykorzystano łącznie 20 interaktywnych symulacji. W odpowiednim miejscu książki umieszczono ikony wskazujące, że odpowiednia interaktywna symulacja jest dostępna dla studentów online. Ponieważ animacje umożliwiają użytkownikowi ustawienie warunków początkowych, mogą służyć jako podstawa do zadań studenckich. Suplement dla dydaktyków zawiera zestaw zadań, po jednym dla każdej z animacji. Każde zadanie dotyczy kilku konkretnych problemów, które można przypisać studentom.

PODZIĘKOWANIE

Do powstania nowego wydanie przyczyniło się wiele osób, które hojnie poświęciły swój czas i wiedzę. Recenzji całej książki dokonali następujący profesorowie: Nikhil Bhargava (Indian Institute of Management, Delhi), James Gil de Lamadrid (Bowie State University, Computer Science Department), Debra Calliss (Computer Science and Engineering, Arizona State University), Mohammed Anwaruddin (Wentworth Institute of Technology, Dept. of Computer Science), Roger Kieckhafer (Michigan Technological University, Electrical & Computer Engineering), Paul Fortier (University of Massachusetts Darthmouth, Electrical and Computer Engineering), Yan Zhang (Department of Computer Science and Engineering, University of South Florida), Patricia Roden (University of North Alabama, Computer Science and Information Systems), Sanjeev Baskiyar (Auburn University, Computer Science and Software Engineering) oraz Jayson Rock (University of Wisconsin-Milwaukee, Computer Science). Chciałbym szczególnie podziękować profesorowi Rogerowi Kieckhaferowi za zgodę na wykorzystanie niektórych rysunków i modeli demonstracyjnych z jego notatek z wykładów.

Dziękuję również wielu osobom, które dostarczyły szczegółowych recenzji technicznych jednego lub więcej rozdziałów: Rekai Gonzalez Alberquilla, Allen Baum, Jalil Boukhobza, Dmitry Bufistov, Humberto Calderón, Jesus Carretero, Ashkan Eghbal, Peter Glaskowsky, Ram Huggahalli, Chris Jesshope, Athanasios Kakarountas , Isil Oz, Mitchell Poplingher, Roger Shepherd, Jigar Savla, Karl Stevens, Siri Uppalapati, dr Sriram Vajapeyam, Kugan Vivekanandarajah, Pooria M. Yaghini i Peter Zeno.

Profesor Cindy Norris z Appalachian State University, profesor Bin Mu z University of New Brunswick i profesor Kenrick Mock z University of Alaska uprzejmie dostarczyli zadania dotyczące prac domowych.

Aswin Sreedhar z University of Massachusetts opracował interaktywne zadania symulacyjne.

Profesor Miguel Angel Vega Rodriguez, profesor dr Juan Manuel Sánchez Pérez i profesor dr Juan Antonio Gómez Pulido, wszyscy z University of Extremadura w Hiszpanii, przygotowali zadania SMPCache zamieszczone w podręczniku dla dydaktyków oraz byli autorami podręcznika dla użytkowników SMPCache.

Todd Bezenek z University of Wisconsin i James Stine z Lehigh University przygotowali zadania dotyczące SimpleScalar zamieszczone w podręczniku dla dydaktyków, a Todd jest również autorem podręcznika dla użytkowników SimpleScalar.

Na koniec chciałbym podziękować wielu osobom odpowiedzialnym za wydanie książki, za ich doskonałą pracę. Dotyczy to pracowników Pearson, w szczególności mojej redaktorki Tracy Johnson, jej asystentki Meghan Jacoby i kierownika projektu Boba Engelhardta. Dziękuję także działom marketingu i sprzedaży w firmie Pearson, bez których wysiłków ta książka nie znalazłaby się w rękach czytelnika

O Autorze

Doktor William Stallings jest autorem 18 podręczników oraz, licząc wydania poprawione, ponad 70 książek o bezpieczeństwie komputerowym, sieciach komputerowych i architekturze komputerowej. W ciągu ponad 30 lat działalności w tej dziedzinie był współpracownikiem technicznym, kierownikiem technicznym i dyrektorem w kilku firmach zajmujących się zaawansowanymi technologiami. Obecnie jest niezależnym konsultantem, którego klientami są producenci komputerów i rozwiązań sieciowych oraz ich klienci, firmy tworzące oprogramowanie oraz wiodące, rządowe instytucje badawcze. Autor trzynastokrotnie otrzymał nagrodę za najlepszy podręcznik informatyczny roku od Text and Academic Authors Association.

Autor stworzył i ciągle utrzymuje stronę internetową przeznaczoną dla studentów informatyki, zamieszczoną pod adresem ComputerScienceStudent.com. Ta witryna zawiera dokumenty i odnośniki na różne tematy, które mogą być przedmiotem ogólnego zainteresowania studentów informatyki, a także profesjonalistów. Jest członkiem rady redakcyjnej czasopisma naukowego Cryptologia, poświęconego wszystkim aspektom dotyczącym kryptologii.

Doktor Stallings posiada doktorat z informatyki uzyskany na MIT oraz licencjat z zakresu inżynierii elektrycznej uzyskany w Notre Dame.

Część pierwsza

Wprowadzenie

Rozdział 1

Podstawowe pojęcia i ewolucja komputerów

1.1. Organizacja i architektura

1.2. Struktura i działanie

Działanie

Struktura

1.3. Komputer IAS

1.4. Bramki, komórki pamięci, układy i moduły wieloukładowe

Bramki i komórki pamięci

Tranzystory

Układy mikroelektroniczne

Moduł wieloukładowy

1.5. Ewolucja architektury Intel x86

1.6. Systemy wbudowane

Internet rzeczy (IoT)

Wbudowane systemy operacyjne

Procesory aplikacyjne i procesory dedykowane

Mikroprocesory i mikrokontrolery

Systemy wbudowane i systemy głęboko wbudowane

1.7. Architektura ARM

Ewolucja ARM

Architektura listy rozkazów

Produkty ARM

1.8. Podstawowe pojęcia, pytania sprawdzające i zadania

Cele dydaktyczne

Po przestudiowaniu tego rozdziału powinieneś być w stanie:

• Wyjaśnić ogólne zasady funkcjonowania oraz strukturę komputera cyfrowego.

• Przedstawić przegląd ewolucji technologii komputerowej od wczesnych komputerów cyfrowych do najnowszych mikroprocesorów.

• Przedstawić przegląd ewolucji architektury x86.

• Zdefiniować systemy wbudowane i wymienić niektóre wymagania i ograniczenia, które muszą spełniać różne systemy wbudowane.

1.1. Organizacja i architektura

Opisując systemy komputerowe często wprowadza się rozróżnienie pomiędzy architekturą komputera i organizacją komputera. Chociaż trudno jest podać dokładne definicje tych terminów, to istnieje konsensus co do ogólnych obszarów, których dotyczy każdy z nich. Przykłady można znaleźć w [VRAN80], [SIEW82] i [BELL78a], a ciekawy alternatywny pogląd został przedstawiony w [REDD76].

Architektura komputera odnosi się do atrybutów systemu widocznych dla programisty lub, innymi słowy, tych atrybutów, które mają bezpośredni wpływ na logiczne wykonanie programu. Terminem często używanym zamiennie wobec architektury komputera jest model programowy procesora lub architektura listy rozkazów (ang. instruction set architecture, ISA). ISA definiuje formaty instrukcji, kody operacyjne instrukcji, rejestry, pamięć instrukcji i danych, wpływ wykonywanych instrukcji na rejestry i pamięć oraz algorytm sterowania wykonaniem instrukcji. Organizacja komputera odnosi się do jednostek operacyjnych oraz ich wzajemnych połączeń, które realizują specyfikację związaną z architekturą. Przykłady atrybutów związanych z architekturą obejmują listę rozkazów, liczbę bitów używanych do reprezentowania różnych typów danych (np. liczby, znaki), mechanizmy wejścia/wyjścia oraz metody adresowania pamięci. Atrybuty związane z organizacją obejmują szczegóły sprzętowe niewidoczne dla programisty, takie jak sygnały sterujące, interfejsy między komputerem a urządzeniami peryferyjnymi oraz zastosowana technologia pamięci.

Na przykład to, czy komputer będzie wyposażony w instrukcję mnożenia, jest zagadnieniem projektowym dotyczącym architektury. Z kolei kwestią organizacyjną jest to, czy instrukcja ta będzie realizowana przez specjalną jednostkę mnożącą, czy też przez mechanizm wielokrotnie wykorzystujący jednostkę systemu odpowiedzialną za sumowanie. Decyzja dotycząca organizacji może opierać się na przewidywanej częstotliwości użycia instrukcji mnożenia, względnej szybkości obu rozwiązań oraz kosztach i fizycznej wielkości specjalnej jednostki mnożącej.

Historycznie, jak i obecnie, rozróżnienie między architekturą a organizacją jest bardzo istotne. Wielu producentów komputerów oferuje rodziny modeli komputerów, które zostały oparte na tej samej architekturze, ale różnią się w kwestii organizacji. W związku z tym różne modele pochodzące z tej samej rodziny mogą mieć zarówno różne ceny, jak i właściwości użytkowe. Co więcej, dana architektura może być stosowana na przestrzeni wielu lat i obejmować wiele różnych modeli komputerów, natomiast organizacja może się zmieniać wraz z postępem technologicznym. Wybitnym przykładem obu tych zjawisk jest architektura Systemu 370 IBM. Architektura ta została wprowadzona po raz pierwszy w roku 1970 i obejmowała wiele modeli. Klient o skromnych wymaganiach mógł kupić tańszy i wolniejszy model, a następnie w miarę wzrostu wymagań dokonać później aktualizacji do droższego i wydajniejszego modelu bez konieczności rezygnacji z już opracowanego oprogramowania. Z biegiem lat IBM wprowadził wiele nowych modeli wykorzystujących nowsze technologie, zastępując starsze modele, oferując jednocześnie klientowi większą wydajność, niższy koszt lub jedno i drugie. Te nowsze modele zachowały tę samą architekturę, dzięki czemu inwestycja w oprogramowanie była chroniona. Co ciekawe, architektura Systemu 370, z kilkoma ulepszeniami, przetrwała do dziś jako architektura głównej linii produktów IBM.

W klasie komputerów zwanych mikrokomputerami związek między architekturą i organizacją jest bardzo ścisły. Zmiany w technologii wpływają nie tylko na organizację, ale skutkują także wprowadzeniem coraz wydajniejszej i bardziej złożonej architektury. Ogólnie rzecz biorąc, wymagania dotyczące kompatybilności pomiędzy generacjami są mniejsze w przypadku mikrokomputerów. W ten sposób istnieje większa wzajemna zależność pomiędzy decyzjami projektowymi dotyczącymi organizacji i architektury. Intrygującym przykładem jest komputer o zredukowanej liście rozkazów (RISC), który został omówiony w rozdziale 15 w tomie II.

W tej książce przedstawiono analizę zarówno organizacji, jak i architektury komputera. Być może znacznie większy nacisk został położony na część dotyczącą organizacji. Jednakże, ponieważ organizacja komputera musi być zaprojektowana w celu zaimplementowania określonej specyfikacji architektury, dokładne omówienie organizacji wymaga również szczegółowego omówienia architektury.

1.2. Struktura i działanie

Komputer jest złożonym systemem, a współczesne komputery mogą zawierać miliony podstawowych komponentów elektronicznych. W jaki sposób można zatem je precyzyjnie opisać? Kluczem jest podejście zakładające hierarchiczny charakter najbardziej złożonych systemów, w tym komputera [SIMO96]. System hierarchiczny jest zestawem powiązanych ze sobą podsystemów, a każdy podsystem może z kolei zawierać podsystemy niższego poziomu, aż do osiągnięcia najniższego poziomu podsystemu elementarnego.

Hierarchiczny charakter złożonych systemów ma fundamentalne znaczenie zarówno w przypadku projektu tych systemów, jak i ich opisu. Projektant musi zajmować się tylko określonym poziomem systemu. Z kolei na każdym poziomie system składa się z zestawu komponentów i ich wzajemnych relacji. Działanie na każdym poziomie zależy tylko od uproszczonej i abstrakcyjnej charakterystyki systemu na kolejnym niższym poziomie. Na każdym poziomie projektant musi zająć się zarówno strukturą, jak i funkcjami komponentów systemu.

• Struktura: sposób, w jaki komponenty są ze sobą powiązane.

• Funkcje: działanie każdego pojedynczego komponentu jako części całej konstrukcji.

Opisu systemu można dokonać na dwa sposoby: zaczynając od dołu i kompletując opis aż do uzyskania pełnego opisu lub zaczynając od góry i rozkładając system na jego elementy składowe. Wyniki prac z wielu dziedzin sugerują, że to drugie podejście jest najprecyzyjniejsze i najbardziej efektywne [WEIN75].

W tej książce przyjęto właśnie takie podejście. System komputerowy został opisany, zaczynając od góry i następnie przechodząc w dół. Rozważania rozpoczęto od głównych elementów komputera, opisując ich strukturę oraz działanie, a następnie zostały omówione kolejne poziomy, położone niżej w hierarchii. Pozostała część tego rozdziału zawiera bardzo krótki przegląd tego podejścia.

Działanie

Zarówno struktura, jak i funkcjonowanie komputera są w istocie proste. Ogólnie rzecz biorąc, istnieją tylko cztery podstawowe funkcje, do których można wykorzystać komputer:

• Przetwarzanie danych: Dane mogą przybierać różne formy, a zakres wymagań dotyczących ich przetwarzania jest szeroki. Jak pokazano w dalszej części, istnieje tylko kilka podstawowych metod lub rodzajów przetwarzania danych.

• Przechowywanie danych: Nawet jeśli komputer przetwarza dane na bieżąco (dane są dostarczane i przetwarzane, a wyniki otrzymywane natychmiast), to komputer musi tymczasowo przechowywać co najmniej te dane, które są przetwarzane w danym momencie. W związku z tym mamy do czynienia z co najmniej krótkoterminową funkcjonalnością przechowywania danych. Równie istotne jest to, że komputer może również przechowywać dane długoterminowo, kiedy to pliki danych są przechowywane do późniejszego pobierania i aktualizacji.

• Przenoszenie danych: Środowisko operacyjne komputera składa się z urządzeń, które służą jako źródła lub miejsca docelowe danych. Jeśli dane są odbierane lub dostarczane do urządzenia bezpośrednio podłączonego do komputera, to proces ten jest nazywany procesem we-wy (wejścia/wyjścia), a urządzenie jest określane jako urządzenie peryferyjne. W przypadku gdy dane są przenoszone na większe odległości, do lub z urządzenia zdalnego, wówczas proces jest określany jako transmisja danych.

• Sterowanie: W komputerze jednostka sterująca zarządza zasobami komputera i wydajnością jego części funkcjonalnych w odpowiedzi na instrukcje.

Poprzednia dyskusja może wydawać się absurdalnie uogólniona. Z pewnością jest możliwe rozróżnienie wielu różnych funkcji systemu komputerowego, nawet na najwyższym poziomie struktury komputera, jednak cytując [SIEW82]:

W przypadku komputerów kształtowanie struktury komputera tak, by pasowały do zamierzonej funkcji jest na ogół marginalne. Wynika to z ogólno użytkowego charakteru komputerów, w których cała specjalizacja działania występuje w fazie programowania, a nie w fazie projektowania.

Struktura

W tej części omówiono w bardzo ogólny sposób wewnętrzną strukturę komputera. Rozważania rozpoczynają się od tradycyjnego komputera z jednym procesorem, który wykorzystuje mikroprogramowany układ sterowania, a następnie omówiono typową strukturę wielordzeniową.

PROSTY KOMPUTER JEDNOPROCESOROWY. Na rysunku 1.1 przedstawiono hierarchię wewnętrznej struktury tradycyjnego komputera jednoprocesorowego. Wyróżnić można cztery główne elementy strukturalne:

• Jednostka centralna (CPU): steruje działaniem komputera i wykonuje działania związane z przetwarzaniem danych. Często jest nazywana po prostu procesorem.

• Pamięć główna: jest wykorzystywana do przechowywania danych.

• Układ wejścia/wyjścia: jego przeznaczeniem jest przenoszenie danych pomiędzy komputerem i jego środowiskiem zewnętrznym.

• Połączenie systemowe: jest to pewien mechanizm, który zapewnia komunikację pomiędzy procesorem, pamięcią główną i układem we/wy. Typowym przykładem połączenia systemowego jest magistrala systemowa, składająca się z szeregu przewodów przewodzących, do których podłączone są wszystkie pozostałe komponenty.

Rysunek 1.1. Komputer: struktura najwyższego poziomu

Komputer może składać się z jednego lub większej liczby każdego z wyżej wymienionych komponentów. Do niedawna, tradycyjny komputer zawierał tylko jeden procesor. W ostatnich latach jednak coraz częściej w jednym komputerze wykorzystuje się wiele procesorów. W dalszej części książki wybrane kwestie projektowe dotyczące systemów z wieloma procesorami są omawiane sukcesywnie, natomiast część piąta (tom II) koncentruje się już na komputerach tego typu.

Każdy z tych komponentów został szczegółowo omówiony w części drugiej. Jednak dla naszych celów najciekawszym i pod pewnymi względami najbardziej złożonym komponentem komputera jest procesor. Jego główne elementy strukturalne to:

• Jednostka sterująca: steruje działaniem procesora, a tym samym i komputera.

• Jednostka arytmetyczno-logiczna (ALU): realizuje przetwarzanie danych komputera.

• Rejestry: zapewnia pamięć wewnętrzną na potrzeby procesora.

• Połączenia wewnętrzne CPU: mechanizmy, które zapewniają komunikację pomiędzy jednostką sterującą, jednostką arytmetyczno-logiczną i rejestrami.

W części trzeciej omówiono komponenty wprowadzające pewną złożoność, związaną z przetwarzaniem równoległym i potokowym. Istnieje kilka podejść do projektowania jednostki sterującej, z których bardzo popularnym podejściem jest to oparte na mikroprogramowaniu. W istocie taka jednostka sterująca działa na zasadzie wykonywania mikroinstrukcji, które definiują funkcjonowanie jednostki sterującej. Wykorzystując takie podejście, strukturę jednostki sterującej można przedstawić tak, jak na rysunku 1.1. Struktura ta została omówiona w części czwartej (tom II).

WIELORDZENIOWA STRUKTURA KOMPUTERA. Jak już wspomniano, współczesne komputery mają na ogół wiele procesorów. Gdy wszystkie te procesory znajdują się na jednym układzie, wówczas taki komputer nazywany jest komputerem wielordzeniowym, a każda jednostka przetwarzająca (składająca się z jednostki sterującej, jednostki arytmetyczno-logicznej, rejestrów i być może pamięci podręcznej) jest nazywana rdzeniem. W celu wyjaśnienia tej terminologii w tekście zostały użyte następujące definicje:

• Jednostka centralna (CPU): część komputera, która pobiera i wykonuje rozkazy. Składa się z jednostki arytmetyczno-logicznej, jednostki sterującej i rejestrów. W systemie z pojedynczą jednostką centralną jest często po prostu określana jako procesor.

• Rdzeń: indywidualna jednostka przetwarzania w układzie procesora. W systemie z jednym procesorem rdzeń może być równoważny pod względem funkcjonalnym z procesorem CPU. Inne wyspecjalizowane jednostki przetwarzania, jak te zoptymalizowane względem operacji wykonywanych na wektorach i macierzach, są również określane jako rdzenie.

• Procesor: fizyczny kawałek krzemu zawierający jeden lub więcej rdzeni. Procesor jest składnikiem komputera, który interpretuje i wykonuje instrukcje. Jeśli procesor zawiera wiele rdzeni, jest określany jako procesor wielordzeniowy.

Po około dziesięciu latach dyskusji istnieje szeroki konsensus w branży co do tego zastosowania.

Inną ważną cechą współczesnych komputerów jest wykorzystanie wielu poziomów pamięci, zwanych pamięcią podręczną, pomiędzy procesorem a pamięcią główną. Zagadnienie to omówiono szczegółowo w rozdziale 4. Na tym etapie dyskusji wystarczające jest zwrócenie uwagi na to, że pamięć podręczna jest mniejsza i szybsza niż pamięć główna i jest wykorzystywana do przyspieszenia dostępu do pamięci, co jest dokonywane przez umieszczanie w pamięci podręcznej danych z pamięci głównej, które prawdopodobnie będą używane w najbliższej przyszłości. Większą poprawę wydajności można uzyskać, używając wielu poziomów pamięci podręcznej, z poziomem 1 (L1) najbliższym rdzenia i dodatkowymi poziomami (L2, L3 ibody table td.) znajdującymi się coraz dalej od rdzenia. W takim schemacie poziom n jest mniejszy i szybszy niż poziom n + 1.

Rysunek 1.2 przedstawia uproszczony schemat głównych elementów typowego komputera wielordzeniowego. Większość komputerów, w tym te wbudowane w smartfony i tablety, a także komputery osobiste, laptopy i stacje robocze, umieszczona jest na płycie głównej. Przed opisaniem tego układ konieczne jest jednak zdefiniowanie kilku terminów. Płytka układu drukowanego (PCB – printed circuit board) to sztywna, płaska płytka, która utrzymuje i łączy układy scalone oraz inne elementy elektroniczne. Taka płytka składa się z warstw, zwykle od dwóch do dziesięciu, które łączą komponenty za pomocą wytrawionych miedzianych ścieżek. Główna płytka drukowana w komputerze nazywana jest płytą systemową lub płytą główną, podczas gdy mniejsze płytki podłączane do gniazd na płycie głównej nazywane są kartami rozszerzeń.

Rysunek 1.2. Uproszczony schemat głównych elementów komputera wielordzeniowego

Najbardziej istotnymi elementami na płycie głównej są układy. Mikroukład jest pojedynczym elementem wykonanym z materiału półprzewodnikowego, zazwyczaj z krzemu, na którym wytwarzane są układy elektroniczne i bramki logiczne. Powstały produkt jest określany jako układ scalony.

Płyta główna zawiera złącze lub gniazdo dla układu procesora, który zazwyczaj zawiera wiele pojedynczych rdzeni i dlatego jest nazywany procesorem wielordzeniowym. Na płycie głównej dostępne są również gniazda dla układów pamięci, układów kontrolera we-wy i innych kluczowych komponentów komputera. W przypadku komputerów stacjonarnych gniazda rozszerzeń umożliwiają podłączenie większej liczby komponentów na kartach rozszerzeń. Zatem nowoczesna płyta główna łączy tylko kilka pojedynczych układów, z których każdy zawiera od kilku tysięcy do setek milionów tranzystorów.

Rysunek 1.2 przedstawia układ procesora, który zawiera osiem rdzeni i pamięć podręczną L3. Na rysunku nie zamieszczono układu logicznego wymaganego do sterowania operacjami między rdzeniami i pamięcią podręczną oraz między rdzeniami i układami zewnętrznymi na płycie głównej. Jak pokazano na rysunku, pamięć podręczna L3 zajmuje dwie odrębne części powierzchni układu. Jednak zazwyczaj wszystkie rdzenie mają dostęp do całej pamięci podręcznej L3 za pośrednictwem wyżej wymienionych układów sterujących. Układ procesora pokazany na rysunku 1.2 nie reprezentuje żadnego konkretnego produktu, a tylko ogólne pojęcie o tym, jak takie układy są rozmieszczone.

W kolejnym etapie szczegółowo przyjrzymy się strukturze pojedynczego rdzenia, który zajmuje część układu procesora. Ogólnie rzecz biorąc, elementami funkcjonalnymi rdzenia są:

• Układ logiczny rozkazów: wykonuje zadania związane z pobieraniem rozkazów i dekodowaniem każdego w celu określenia operacji rozkazu oraz lokacji w pamięci każdego argumentu.

• Jednostka arytmetyczno-logiczna (ALU): wykonuje operację określoną przez rozkaz.

• Układ logiczny ładowania/przechowywania: zarządza transferem danych do i z pamięci głównej za pośrednictwem pamięci podręcznej.

W rdzeniu zlokalizowana jest także pamięć podręczna L1, podzielona na pamięć podręczną rozkazów (pamięć podręczna I), która jest używana do przesyłania rozkazów do i z pamięci głównej, oraz pamięć podręczną danych L1 do przesyłania argumentów i wyników. Układy procesorów zawierają również pamięć podręczną L2, która obecnie również stanowi część rdzenia. Bardzo często pamięć podręczna L2 jest również dzielona na pamięć podręczną rozkazów i danych, aczkolwiek używana jest również połączona, pojedyncza pamięć podręczna L2.

Należy pamiętać, że taka reprezentacja układu rdzenia ma na celu jedynie przedstawienie ogólnej koncepcji wewnętrznej struktury rdzenia. W konkretnym produkcie poszczególne elementy funkcjonalne nie mogą być tak odrębne, jak pokazano to na rysunku 1.2, zwłaszcza jeśli niektóre lub wszystkie z tych funkcji są zaimplementowane jako część mikroprogramowanej jednostki sterującej.

PRZYKŁADY. Najbardziej pouczające jest przyjrzenie się kilku rzeczywistym przykładom, ilustrującym hierarchiczną strukturę komputerów. Na rysunku 1.3 przedstawiono zdjęcie płyty głównej komputera zbudowanego na bazie dwóch procesorów Intel Quad-Core Xeon. Wiele elementów oznaczonych na fotografii omówiono w dalszej części tej książki. W tym miejscu wymieniamy najważniejsze, poza gniazdami procesorów:

• Gniazda PCI Express dla zaawansowanych kart graficznych i dodatkowych urządzeń peryferyjnych (PCIe opisano w podrozdziale 3.6).

• Kontroler Ethernet i porty Ethernet do połączeń sieciowych.

• Gniazda USB dla urządzeń peryferyjnych.

• Gniazda Serial ATA (SATA) do podłączenia pamięci dyskowej (Ethernet, USB i SATA omówiono w podrozdziale 7.7).

• Interfejsy dla układów pamięci głównej DDR (podwójna szybkość transmisji danych) (DDR omówiono w podrozdziale 5.3).

• Chipset Intel 3420 jest kontrolerem we-wy umożliwiającym operacje bezpośredniego dostępu do pamięci między urządzeniami peryferyjnymi a pamięcią główną (DDR omówiono w podrozdziale 7.5).

Rysunek 1.3. Płyta główna z dwoma czterordzeniowymi procesorami Intel Xeon. Źródło: Courtesy of Chassis Plans Rugged Rackmount Computers

Zgodnie z przyjętą strategią omawiania struktury „z góry na dół”, jak pokazano na rysunkach 1.1 i 1.2, możemy przejść do szczegółów i przyjrzeć się wewnętrznej strukturze układu procesora, zwanego jednostką procesora (PU). Dla odmiany jako przykład został wykorzystany układ IBM, a nie Intela. Na rysunku 1.4 przedstawiono przeskalowany układ procesora IBM z13, który jest wykorzystywany w komputerach głównej linii IBM [LASC16]. Układ ten ma 3,99 miliarda tranzystorów. Etykiety na rysunku wskazują, w jaki sposób przydzielano poszczególne fragmenty powierzchni krzemowej układu. Można łatwo zauważyć, że układ ten ma osiem rdzeni, czyli procesorów. Ponadto znaczna część układu jest zajęta przez pamięć podręczną L3, która jest współdzielona przez wszystkie osiem rdzeni. Układ logiczny L3 steruje ruchem między pamięcią podręczną L3 i rdzeniami oraz między pamięcią podręczną L3 i środowiskiem zewnętrznym. Dodatkowo zaimplementowano układ logiczny sterujący pamięcią masową (SC) między rdzeniami i pamięcią podręczną L3. Dostępem do pamięci umieszczonej na zewnątrz mikroukładu steruje kontroler pamięci. Z kolei magistrala GX I/O steruje interfejsem adapterów kanałowych, które uzyskują dostęp do we-wy.

Rysunek 1.4. Schemat procesora IBM z13

Rysunek 1.5. Budowa rdzenia procesora IBM z13

Przechodząc do kolejnego poziomu, omówimy wewnętrzną strukturę pojedynczego rdzenia, która została pokazana na rysunku 1.5. Rdzeń stanowi implementację architektury listy rozkazów z13, która jest nazywana architekturą z/Architecture. Należy pamiętać, że jest to jedynie część krzemowej powierzchni, która tworzy układ jednoprocesorowy. Główne obszary składowe w ramach tego fragmentu układu procesora to:

• ISU (jednostka sekwencji rozkazów): Określa kolejność wykonywania instrukcji w tak zwanej architekturze superskalarnej. Umożliwia to wykonywanie potoku poza kolejnością (ang. out-of-order, OOO). Dodatkowo służy do śledzenia nazw rejestrów, zależności instrukcji OOO i obsługi wysyłania zasobów instrukcji. Koncepcje te zostały omówione w rozdziale 16 (tom II).

• IFB (pobieranie i rozgałęzianie rozkazów) oraz ICM (pamięć podręczna rozkazów i łączenie rozkazów): Te dwie podjednostki zawierają pamięć podręczną rozkazów o pojemności 128 kB[2], układy logiczne przewidywania rozgałęzień, sterowanie pobieraniem rozkazów oraz bufory. Względny rozmiar tych podjednostek wynika ze skomplikowanego projektu przewidywania rozgałęzień.

• IDU (jednostka dekodowania rozkazów): IDU jest zaopatrywany z buforów IFU i jest odpowiedzialny za parsowanie i dekodowanie wszystkich kodów operacji z/Architecture.

• LSU (load-store unit): LSU zawiera 96 kB pamięci podręcznej danych L1 i zarządza ruchem danych między pamięcią podręczną danych L2 a funkcjonalnymi jednostkami wykonawczymi. Jest odpowiedzialny za obsługę wszystkich typów dostępów do operandów o wszystkich długościach, trybach i formatach, zgodnie z definicją w z/Architecture.

• XU (jednostka translacji): Ta jednostka tłumaczy adresy logiczne z instrukcji na adresy fizyczne w pamięci głównej. XU zawiera również bufor podręczny translacji (TLB) używany do przyspieszenia dostępu do pamięci. TLB omówiono w rozdziale 8.

• PC (jednostka wszechobecna): Używana do oprzyrządowania i zbierania błędów.

• FXU (jednostka stałoprzecinkowa): FXU wykonuje operacje arytmetyczne stałoprzecinkowe.

• VFU (jednostki wektorowe i zmiennoprzecinkowe): binarna część zmiennoprzecinkowa obsługuje wszystkie binarne i szesnastkowe operacje zmiennoprzecinkowe, a także operacje mnożenia stałoprzecinkowego. Część zmiennoprzecinkowa dziesiętna obsługuje zarówno operacje stałoprzecinkowe, jak i zmiennoprzecinkowe na liczbach przechowywanych jako cyfry dziesiętne. Część wykonywania wektora obsługuje operacje wektorowe.

• RU (jednostka odzyskiwania): RU przechowuje kopię pełnego stanu systemu, który obejmuje wszystkie rejestry, zbiera sygnały awarii sprzętu i zarządza akcjami odzyskiwania sprzętu.

• COP (dedykowany koprocesor): COP jest odpowiedzialny za kompresję danych i funkcje szyfrowania dla każdego rdzenia.

• L2D: Pamięć podręczna danych L2 o wielkości 2 MB dla całego ruchu pamięci poza instrukcjami.

• L2I: Pamięć podręczna instrukcji L2 o wielkości 2 MB.

Pojęcia przedstawione w tej części zostaną bardziej szczegółowo wyjaśnione w dalszej części książki.

1.3. Komputer IAS

W pierwszych generacjach komputerów elementy cyfrowych układów logicznych oraz pamięci oparte były na lampach próżniowych, przy których użyciu zbudowano szereg komputerów badawczych, a następnie komercyjnych. Dla naszych celów pouczające będzie zbadanie być może najsłynniejszego komputera pierwszej generacji, znanego jako komputer IAS. Przykład ten doskonale ilustruje wiele podstawowych pojęć występujących we wszystkich systemach komputerowych.

Podstawowe podejście projektowe zaimplementowane po raz pierwszy w komputerze IAS jest znane jako koncepcja przechowywanego programu. Ten pomysł jest zwykle przypisywany matematykowi Johnowi von Neumannowi, jednak mniej więcej w tym samym czasie pomysł ten rozwinął też Alan Turing. Pierwszą publikacją na temat tego pomysłu była propozycja von Neumanna z 1945 roku dotycząca nowego komputera, EDVAC (Electronic Discrete Variable Computer).[3]

W roku 1946 von Neumann i jego koledzy rozpoczęli projektowanie nowego komputera opartego na koncepcji przechowywanego programu, zwanego komputerem IAS, w Princeton Institute for

Advanced Studies. Pomimo że komputer IAS nie został ukończony do roku 1952, to jest prototypem wszystkich późniejszych komputerów ogólnego przeznaczenia.[4]

Rysunek 1.6 przedstawia strukturę komputera IAS (porównaj z rysunkiem 1.1). Składa się ona z:

• Pamięci głównej, w której przechowywane są zarówno dane, jak i rozkazy.[5]

• Jednostki arytmetyczno-logicznej (ALU) mogącej wykonywać działania na danych binarnych.

• Jednostki sterującej, która interpretuje rozkazy w pamięci i powoduje ich wykonanie.

• Urządzeń we-wy obsługiwanych przez jednostkę sterującą.

Struktura ta została zarysowana we wcześniejszej propozycji von Neumanna, którą warto w tym miejscu częściowo przytoczyć [VONN45]:

2.2. Po pierwsze, ponieważ urządzenie jest przede wszystkim komputerem, będzie zatem musiało najczęściej wykonywać elementarne operacje arytmetyczne: dodawanie, odejmowanie, mnożenie i dzielenie. Rozsądne jest zatem, aby zawierało wyspecjalizowane „organy” przeznaczone do wykonania tylko tych operacji.

Należy jednak zauważyć, że chociaż zasada ta jako taka jest prawdopodobnie słuszna, to specyficzny sposób jej realizacji wymaga dokładnej analizy. W każdym razie prawdopodobnie będzie musiała istnieć centralna, arytmetyczna część urządzenia, a to stanowi pierwszą specyficzną część komputera: CA.

Rysunek 1.6. Struktura komputera IAS

2.3. Po drugie, logiczne sterowanie urządzeniem, to znaczy właściwe szeregowanie jego działania, może być najskuteczniej przeprowadzone przez sterowanie centralne. Jeśli urządzenie ma być elastyczne, to znaczy możliwie jak najbardziej uniwersalne, należy odróżnić szczegółowe rozkazy sprecyzowane dla konkretnego problemu oraz ogólne organy sterujące dbające o wykonanie tych rozkazów, bez względu na to, czym one są. Te pierwsze muszą być w pewien sposób przechowywane, natomiast te drugie reprezentowane przez określone części robocze urządzenia. Przez sterowanie centralne rozumiemy tylko tę ostatnią funkcję, natomiast organy, które ją realizują, tworzą drugą specyficzna część: CC.

2.4. Po trzecie, każde urządzenie, które ma wykonywać długie i skomplikowane sekwencje operacji (w szczególności obliczenia), musi mieć sporą pamięć…

Rozkazów sterujących rozwiązaniem skomplikowanego problemu może być bardzo dużo, zwłaszcza, jak w większości przypadków, jeśli kod jest przypadkowy. Rozkazy te muszą zostać zapamiętane.

W każdym razie całkowita pamięć stanowi trzecią specyficzną część urządzenia: M.

2.6. Trzy specyficzne części CA, CC (razem C) oraz M odpowiadają neuronom skojarzeniowym w ludzkim układzie nerwowym. Pozostaje omówić ekwiwalenty neuronów sensorycznych lub doprowadzających oraz motorycznych lub odprowadzających. Są to organy wejścia i wyjścia urządzenia.

Urządzenie musi mieć możliwość utrzymywania kontaktu z wejściem i wyjściem za pomocą specyficznego narzędzia, które jest nazywane zewnętrznym narzędziem rejestrującym urządzenia: R.

2.7. Po czwarte, urządzenie musi mieć organy do przesyłania informacji z R do jego specyficznych części C i M. Organy te stanowią jego wejście, a zatem czwartą specyficzną część: I. Zobaczymy, że najlepiej jest dokonywać wszystkich transferów z R (poprzez I) do M i nigdy bezpośrednio do C.

2.8. Po piąte, urządzenie musi mieć narządy do przenoszenia z jego specyficznych części C i M do R. Organy te tworzą wyjście urządzenia, zatem jego piątą specyficzną część: O. Zobaczymy, że ponownie najlepiej jest dokonywać wszystkich transferów z M (poprzez O) do R, a nigdy bezpośrednio z C.

Z rzadkimi wyjątkami wszystkie dzisiejsze komputery mają tę samą ogólną strukturę oraz funkcję i dlatego są określane jako maszyny von Neumanna. Warto więc w tym miejscu krótko opisać działanie komputera IAS [BURK46, GOLD54]. Zgodnie z [HAYE98] terminologia i notacja von Neumanna powinny zostać dopasowane do wymagań współczesnych. Przykłady wykorzystane w tej dyskusji zostały oparte na ostatnim z tych tekstów.

Pamięć IAS składa się z 4096 miejsc przechowywania, zwanych słowami, z których każde zawiera po 40 cyfr binarnych (bitów).[6] Przechowywane są tam zarówno dane, jak i rozkazy. Liczby są reprezentowane w postaci binarnej, a każdy rozkaz jest również kodem binarnym. Rysunek 1.7 ilustruje te formaty. Każda liczba jest reprezentowana przez bit znaku i wartość 39-bitową. Słowo może alternatywnie zawierać dwa 20-bitowe rozkazy, przy czym każdy z nich składa się z 8-bitowego kodu operacji (opcode) określającego operację do wykonania oraz 12-bitowego adresu określającego jedno ze słów w pamięci (ponumerowanych od 0 do 999).

Rysunek 1.7. Formaty pamięci IAS

Jednostka sterująca obsługuje IAS, pobierając rozkazy z pamięci i wykonując je pojedynczo. Wyjaśniamy te operacje w odniesieniu do rysunku 1.6, na którym pokazano, że zarówno jednostka sterująca, jak i jednostka ALU zawierają miejsca przechowywania, zwane rejestrami. Są one zdefiniowane w następujący sposób:

• Rejestr buforowy pamięci (MBR): Zawiera słowo, które ma być przechowywane w pamięci lub wysłane do jednostki we-wy lub jest używane do odbierania słowa z pamięci lub z jednostki we-wy.

• Rejestr adresowy pamięci (MAR): Określa adres w pamięci dotyczący słowa, które ma zostać zapisane lub odczytane w rejestrze MBR.

• Rejestr rozkazów (IR): Zawiera 8-bitowy kod operacyjny wykonywanego rozkazu.

• Buforowy rejestr rozkazów (IBR): Stosowany do tymczasowego przechowywania prawego rozkazu słowa w pamięci.

• Licznik programu (PC): Zawiera adres następnej pary rozkazów, która ma zostać pobrana z pamięci.

• Akumulator (AC) i rejestr mnożenia-dzielenia (MQ): Stosowane do tymczasowego przechowywania argumentów i wyników operacji ALU. Na przykład wynik pomnożenia dwóch liczb 40-bitowych jest liczbą 80-bitową. 40 najbardziej znaczących bitów jest przechowywanych w AC, a najmniej znaczące w MQ.

Komputer IAS działa przez powtarzalne wykonywanie cyklu rozkazu, tak jak pokazano na rysunku 1.8. Każdy cykl rozkazu składa się z dwóch podcykli.

Podczas cyklu pobierania kod operacyjny następnego rozkazu jest ładowany do rejestru IR, a część adresowa jest ładowana do rejestru MAR. Rozkaz może być pobrany z rejestru IBR lub może zostać uzyskany z pamięci przez załadowanie słowa do rejestru MBR, a następnie do rejestrów IBR, IR i MAR.

Dlaczego odbywa się to pośrednio? Operacje te są kontrolowane przez układy elektroniczne i powodują wykorzystanie ścieżek danych. W celu uproszczenia układów elektronicznych podczas odczytu i zapisu używany jest tylko jeden rejestr do określenia adresu w pamięci oraz używany jest tylko jeden rejestr jako źródło lub miejsce przeznaczenia.

Gdy kod operacji znajdzie się w rejestrze IR, wykonywany jest cykl wykonywania. Układ sterujący interpretuje kod operacji i wykonuje rozkazy, wysyłając odpowiednie sygnały sterujące, aby spowodować przeniesienie danych lub wykonanie operacji przez jednostkę ALU.

Komputer IAS miał łącznie 21 rozkazów, które zostały wymienione w tabeli 1.1. Można je pogrupować w następujący sposób:

• Przenoszenie danych: Przenoszenie danych między pamięcią a rejestrami ALU lub między dwoma rejestrami ALU.

• Rozgałęzienie bezwarunkowe: Normalnie jednostka sterująca wykonuje szeregowo kolejne rozkazy z pamięci. Sekwencję tę można zmienić za pomocą rozkazu rozgałęzienia, co ułatwia wykonywanie operacji powtarzalnych.

• Rozgałęzienie warunkowe: Rozgałęzienie można uzależnić od pewnego warunku, dopuszczając tym samym punkty decyzyjne.

Rysunek 1.8. Częściowa sieć działania komputera IAS

• Arytmetyka: Operacje wykonywane przez ALU.

• Modyfikowanie adresu: Obliczanie adresów w jednostce ALU, a następnie umieszczanie ich w rozkazach przechowywanych w pamięci. Program uzyskuje w ten sposób znaczną elastyczność adresowania.

W tabeli 1.1 przedstawiono rozkazy (z pominięciem rozkazów we-wy) w łatwej do odczytania formie symbolicznej. W formie binarnej każdy rozkaz musi być zgodny z formatem przedstawionym na rysunku 1.7b. Część kodu operacji (pierwsze 8 bitów) określa, który z 21 rozkazów ma zostać wykonany. Część adresowa (pozostałe 12 bitów) określa, które z 4096 miejsc pamięci mają zostać zaangażowane w wykonanie rozkazu.

Tabela 1.1. Lista rozkazów IAS

Rodzaj rozkazu

Kod operacji

Forma symboliczna

Opis

Transfer danych

00001010

00001001

00100001

00000001

00000010

00000011

00000100

LOAD MQ

LOAD MQ,M(X)

STOR M(X)

LOAD M(X)

LOAD –M(X)

LOAD |M(X)|

LOAD –|M(X)|

Przenieś zawartość rejestru MQ do akumulatora AC

Przenieś zawartość lokacji pamięci X do MQ

Przenieś zawartość akumulatora do lokacji pamięci X

Przenieś M(X) do akumulatora

Przenieś – M(X) do akumulatora

Przenieś wartość bezwzględną M(X) do akumulatora

Przenieś –|M(X)| do akumulatora

Rozgałęzienie bezwarunkowe

00001101

00001110

JUMP M(X,0:19)

JUMP M(X,20:39)

Pobierz następną instrukcję z lewej połowy M(X)

Pobierz następną instrukcję z prawej połowy M(X)

Rozgałęzienie warunkowe

00001111

00010000

JUMP + M(X,0:19)

JUMP + M(X,20:39)

Jeśli liczba w akumulatorze jest nieujemna, pobierz następny rozkaz z lewej połowy M(X)

Jeśli liczba w akumulatorze jest nieujemna, pobierz następny rozkaz z prawej połowy M(X)

Działania arytmetyczne

00000101

00000111

00000110

00001000

00001011

00001100

00010100

00010101

ADD M(X)

ADD |M(X)|

SUB M(X)

SUB |M(X)|

MUL M(X)

DIV M(X)

LSH

RSH

Dodaj M(X) do AC, umieść wynik w AC

Dodaj |M(X)| do AC, umieść wynik w AC

Odejmij M(X) od AC, umieść wynik w AC

Odejmij |M(X)| od AC, umieść resztę w AC

Pomnóż M(X) przez MQ, umieść najbardziej znaczące bity wyniku w AC, umieść najmniej znaczące bity w MQ

Podziel AC przez M(X), umieść iloraz w MQ, a resztę w AC

Pomnóż akumulator przez 2, czyli przesuń w lewo o jedną pozycję

Podziel akumulator przez 2, czyli przesuń w prawo o jedną pozycję

Modyfikacja adresu

00010010

00010011

STOR M(X,8:19)

STOR M(X,28:39)

Zamień lewe pole adresu w M(X) na 12 skrajnych prawych bitów AC

Zamień prawe pole adresu w M(X) na 12 skrajnych prawych bitów AC

Na rysunku 1.8 przedstawiono kilka przykładów rozkazów wykonywanych przez jednostkę sterującą. Zauważ, że każda operacja wymaga kilku kroków, z których niektóre są dość skomplikowane. Operacja mnożenia wymaga 39 podoperacji, po jednej dla każdej pozycji bitowej z wyjątkiem bitu znaku.

1.4. Bramki, komórki pamięci, układy i moduły wieloukładowe

Bramki i komórki pamięci

Jak wiemy, podstawowe elementy komputera cyfrowego muszą wykonywać funkcje przechowywania, przesyłania, przetwarzania danych oraz sterowania. Wymagane są tylko dwa podstawowe typy komponentów (rysunek 1.9): bramki i komórki pamięci. Bramka to narzędzie, które realizuje prostą funkcję boolowską lub logiczną. Na przykład bramka AND z wejściami A i B oraz wyjściem C implementuje wyrażenie JEŻELI A I B SĄ PRAWDZIWE, TO C JEST PRAWDZIWE. Takie urządzenia nazywane są bramkami, ponieważ kontrolują przepływ danych w podobny sposób, w jaki bramy kanałowe kontrolują przepływ wody. Komórka pamięci to narzędzie, które może przechowywać jeden bit danych. Oznacza to, że może znajdować się tylko w jednym z dwóch stabilnych stanów w dowolnym momencie. Łącząc dużą liczbę tych podstawowych narzędzi, można skonstruować komputer. Można to odnieść do naszych czterech podstawowych funkcji w następujący sposób:

• Przechowywanie danych: Zapewniane przez komórki pamięci.

• Przetwarzanie danych: Zapewniane przez bramki.

• Przenoszenie danych: Ścieżki między komponentami zapewniają możliwość przenoszenia danych z pamięci do pamięci i z pamięci przez bramki do pamięci.

• Sterowanie: Ścieżki pomiędzy komponentami mogą również przenosić sygnały sterujące. Na przykład bramka może mieć jedno lub dwa wejścia danych oraz jedno wejście sygnału sterującego, które aktywuje bramkę. Gdy sygnał sterujący jest włączony, bramka wykonuje swoją funkcję na wejściach danych i wytwarza dane wyjściowe. W przeciwnym razie, gdy nie ma sygnału sterującego, wyjście jest puste, podobnie jak w przypadku stanu wysokiej impedancji. Analogicznie komórka pamięci przechowuje bit znajdujący się na wejściu, gdy sygnał sterujący ZAPIS (WRITE) jest włączony, oraz umieszcza bit na wyjściu, gdy włączony jest sygnał sterujący ODCZYT (READ). Tak więc komputer składa się z bramek, komórek pamięci oraz wzajemnych połączeń między tymi elementami. Z kolei bramki i komórki pamięci zbudowane są z prostych elementów elektronicznych, takich jak tranzystory i kondensatory.

Tranzystory

Podstawowym elementem składowym układów cyfrowych, które są używane do budowy procesorów, pamięci oraz innych cyfrowych urządzeń logicznych jest tranzystor. Aktywna część tranzystora jest wykonana z krzemu lub innego materiału półprzewodnikowego, który pod wpływem impulsów elektrycznych może zmieniać swój stan elektryczny. W swoim normalnym stanie materiał taki może być nieprzewodzący lub przewodzący, utrudniając lub umożliwiając przepływ prądu. Po przyłożeniu napięcia do bramki tranzystor zmienia swój stan.

Rysunek 1.9. Podstawowe elementy komputera

Pojedynczy, niezależny tranzystor nazywany jest elementem dyskretnym. W latach pięćdziesiątych i wczesnych sześćdziesiątych XX wieku sprzęt elektroniczny składał się głównie z elementów dyskretnych: tranzystorów, rezystorów, kondensatorów i tym podobnych. Elementy dyskretne były produkowane osobno, oddzielnie pakowane i lutowane lub łączone ze sobą na płytkach układów drukowanych, które następnie instalowano w komputerach, oscyloskopach i innym sprzęcie elektronicznym. Za każdym razem, gdy w urządzeniu elektronicznym konieczne było zainstalowanie tranzystora, niezbędne było przylutowanie do płytki drukowanej małej metalowej rurki zawierającej kawałek krzemu wielkości główki od szpilki. W rezultacie cały proces produkcyjny, od tranzystora po płytkę drukowaną, był bardzo kosztowny i kłopotliwy.

Trudności te zaczęły stwarzać problemy w branży komputerowej, ponieważ wczesne komputery drugiej generacji zawierały około 10 000 tranzystorów, a liczba ta bardzo szybko wzrosła do setek tysięcy. W konsekwencji produkcja nowszych i bardziej wydajnych urządzeń stała się bardzo trudna.

Układy mikroelektroniczne

Mikroelektronika oznacza dosłownie „małą elektronikę”. Od początków elektroniki cyfrowej i przemysłu komputerowego istnieje konsekwentna tendencja do zmniejszania rozmiarów cyfrowych układów elektronicznych. Zanim przyjrzymy się implikacjom i korzyściom tego trendu, musimy powiedzieć coś więcej o naturze elektroniki cyfrowej. Bardziej szczegółowe omówienie tego tematu znajduje się w rozdziale 12.

Układ scalony wykorzystuje fakt, że elementy, takie jak tranzystory, rezystory i przewodniki, mogą być wykonane z półprzewodnika takiego jak krzem. Wytwarzanie całego układu z maleńkiego kawałka krzemu zamiast łączenia dyskretnych komponentów wykonanych z oddzielnych kawałków krzemu w ten sam układ jest jedynie rozwinięciem technologii ciała stałego. Na jednej płytce krzemowej można wytwarzać jednocześnie wiele tranzystorów i, co równie ważne, tranzystory te można później połączyć w układy podczas procesu metalizacji.

Na rysunku 1.10 przedstawiono kluczowe koncepcje układu scalonego. Cienki wafel krzemowy jest dzielony na macierz małych obszarów, każdy o powierzchni kilku milimetrów kwadratowych. Następnie w każdym obszarze wytwarzany jest identyczny

Rysunek 1.10. Związek pomiędzy waflem krzemowym, mikroukładem i bramką

wzór układu, a wafel krzemowy jest dzielony na mikroukłady. Każdy taki mikroukład składa się z wielu bramek i/lub komórek pamięci oraz szeregu punktów podłączenia wejścia i wyjścia. Tak wykonany układ jest następnie pakowany w obudowę, której głównym zadaniem jest ochrona przed uszkodzeniem oraz zapewnienie końcówek do podłączenia urządzeń zewnętrznych. W celu wytworzenia większych i bardziej złożonych układów można następnie połączyć ze sobą na płytce drukowanej wiele tak obudowanych mikroukładów. Na rysunku 1.11a pokazano, jak wygląda obudowany procesor lub układ pamięci, natomiast na rysunku 1.11b przedstawiono obudowany układ scalony podłączony do płyty głównej.

Początkowo można było niezawodnie wytwarzać i umieszczać razem jedynie kilka bramek lub komórek pamięci. Te wczesne układy scalone noszą miano układów o małej skali integracji (SSI). Jednak z biegiem czasu stało się możliwe upakowywanie coraz większej liczby elementów na tym samym mikroukładzie. Ten wzrost gęstości przedstawiono na rysunku 1.12. Jest to jeden z najbardziej niezwykłych trendów technologicznych, jakie kiedykolwiek odnotowano.[7] Liczba ta odzwierciedla słynne prawo Moore’a, które zostało zaproponowane przez współzałożyciela firmy Intel Gordona Moore’a w 1965 roku [MOOR65]. Moore zaobserwował, że liczba tranzystorów, które można umieścić na jednym mikroukładzie, podwaja się każdego roku i prawidłowo przewidział, że tempo to utrzyma się w najbliższej przyszłości. Ku zaskoczeniu wielu, w tym i samego Moore’a, tempo utrzymywało się rok po roku i dekada po dekadzie. W latach 70. ubieglego wieku tempo zwolniło, a liczba elementów podwajała się co 18 miesięcy. Jednak od tamtej pory tempo to utrzymuje się na tym samym poziomie.

Konsekwencje prawa Moore’a są głębokie:

1. W okresie szybkiego wzrostu gęstości koszt mikroukładu pozostał praktycznie niezmieniony. Oznacza to, że koszt komputerowych układów logicznych oraz układów pamięci spadał w dramatycznym tempie.

2. Wraz ze wzrostem gęstości upakowania elementy układów logicznych oraz pamięci są umieszczane coraz bliżej siebie. W rezultacie długość ścieżek elektrycznych uległa skróceniu, co istotnie wpłynęło na zwiększenie szybkości działania.

Rysunek 1.11. Procesor oraz mikroukład pamięci na płycie głównej

Rysunek 1.12. Wzrost liczby tranzystorów w układach scalonych

3. Komputery stają się coraz mniejsze, co ułatwia umieszczanie ich w różnych środowiskach.

4. Maleją wymagania dotyczące pobieranej mocy.

5. Połączenia wewnątrz układu scalonego są znacznie bardziej niezawodne niż połączenia lutowane. Im większa liczba układów w każdym mikroukładzie, tym mniejsza liczba połączeń między mikroukładami.

Moduł wieloukładowy

Stale rosnące wymagania dotyczące zwiększania gęstości i szybkości pamięci doprowadziły do zintensyfikowania wysiłków na rzecz dalszej miniaturyzacji, z których jednym z najważniejszych i powszechnie stosowanych jest moduł wieloukładowy (MCM). W tradycyjnym projekcie systemu każdy pojedynczy procesor lub układ pamięci jest umieszczany w obudowie i następnie umieszczany na płycie głównej (patrz rysunek 1.11).

Podstawową ideą rozwoju technologii MCM jest zmniejszenie średniej odległości między układami scalonymi w układzie elektronicznym. MCM to pakiet mikroukładów, który zawiera kilka nieobudowanych mikroukładów umieszczonych bardzo blisko siebie na pewnym podłożu (podstawie) i połączonych ścieżkami umieszczonymi w tej podstawie. Krótkie ścieżki między mikroukładami wpływają na zwiększenie wydajności oraz eliminację wielu szumów, które mogłyby wpływać na zewnętrzne ścieżki między poszczególnymi pakietami mikroukładów.

Rysunek 1.13. Moduł wieloukładowy

Klasyfikacja MCM dokonywana jest na podstawie podstawy układu i obejmuje następujące typy [BLUM99]:

• MCM-L: składa się z metalowych ścieżek umieszczonych na ułożonych warstwowo arkuszach laminatu organicznego.

• MCM-C: drukowane warstwy przewodzącego metalu na współwypalanych warstwach ceramicznych.

• MCM-D: drukowane warstwy metalu osadzane z fazy gazowej naprzemiennie z nawiniętymi lub osadzanymi z fazy gazowej cienkimi warstwami dielektrycznymi.

Podstawowa architektura MCM składa się z (rysunek 1.13):

• Układy scalone: nieobudowane mikroukłady montowane na powierzchni podstawy lub w podstawie.

• Połączenia poziomu 1: połączenia między mikroukładami realizowane przez ścieżki umieszczone w podstawie.

• Podstawa: wspólna podstawa zapewniająca wszystkie połączenia sygnałowe oraz mechaniczne wsparcie dla wszystkich mikroukładów.

• Obudowa MCM: zapewnia układom pewien stopień mechanicznej ochrony oraz odpowiada za odprowadzanie ciepła i połączenia.

• Połączenia poziomu 2: zapewniają niezbędny interfejs z płytką drukowaną, na której został zamontowany moduł MCM.

Tabela 1.3. Ewolucja mikroprocesorów Intel (strona 1 z 2)

(a) Procesory z lat 70. ubiegłego wieku

4004

8008

8080

8086

8088

Rok wprowadzenia

1971

1972

1974

1978

1979

Taktowanie zegara

108 kHz

108 kHz

2 MHz

5 MHz, 8 MHz, 10 MHz

5 MHz, 8 MHz

Szerokość magistrali

4 bity

8 bitów

8 bitów

16 bitów

8 bitów

Liczba tranzystorów

2300

3500

6000

29 000

29 000

Litografia (μm)

10

8

6

3

6

Adresowalność pamięci

640 bajtów

16 kB

64 kB

1 MB

1 MB

(b) Procesory z lat 80. ubiegłego wieku

80286

386TM DX

386TM SX

486TM DX CPU

Rok wprowadzenia

1982

1985

1988

1989

Taktowanie zegara

6–12,5 MHz

16–33 MHz

16–33 MHz

25–50 MHz

Szerokość magistrali

16 bitów

32 bitów

16 bitów

32 bitów

Liczba tranzystorów

134 000

275 000

275 000

1,2 miliona

Litografia (μm)

1,5

1

1

0,8 –1

Adresowalność pamięci

16 MB

4 GB

16 MB

4 GB

Pamięć wirtualna

1 GB

64 TB

64 TB

64 TB

Pamięć podręczna

–

–

–

8 kB

(c) Procesory z lat 90. ubiegłego wieku

486TM SX

Pentium

Pentium Pro

Pentium II

Rok wprowadzenia

1991

1993

1995

1997

Taktowanie zegara

16–33 MHz

60–166 MHz

150–200 MHz

200–300 MHz

Szerokość magistrali

32 bitów

32 bitów

64 bitów

64 bitów

Liczba tranzystorów

1,185 miliona

3,1 miliona

5,5 miliona

7,5 miliona

Litografia (μm)

1

0,8

0,6

0,35

Adresowalność pamięci

4 GB

4 GB

64 GB

64 GB

Pamięć wirtualna

64 TB

64 TB

64 TB

64 TB

Pamięć podręczna

8 kB

8 kB

512 kB L1 i 1 MB L2

512 kB L2

(d) Najnowsze procesory

Pentium III

Pentium 4

Core 2 Duo

Core i7 EE

4960X

Core i9-

7900X

Rok wprowadzenia

1999

2000

2006

2013

2017

Taktowanie zegara

450–660 MHz

1,3–1,8 GHz

1,06–1,2

GHz

4 GHz

4,3 GHz

Szerokość magistrali

64 bitów

64 bitów

64 bitów

64 bitów

64 bitów

Liczba tranzystorów

9,5 miliona

42 miliony

167 milionów

1,86 miliarda

7,2 miliarda

Litografia (nm)

250

180

65

22

14

Adresowalność pamięci

64 GB

64 GB

64 GB

64 GB

128 GB

Pamięć wirtualna

64 TB

64 TB

64 TB

64 TB

64 TB

Pamięć podręczna

512 kB L2

256 kB L2

2 MB L2

1,5 MB L2/
15 MB L3

14 MB L3

Liczba rdzeni

1

1

2

6

10

1.5. Ewolucja architektury Intel x86

W książce wykorzystano wiele konkretnych przykładów projektowania i wdrażania systemów komputerowych, w celu zilustrowania koncepcji i omówienia związanych z nimi kompromisów. Przykłady istotnych cech projektowych architektury komputerowej można omówić na podstawie licznych systemów, zarówno współczesnych, jak i historycznych. Jednakże w tej książce wykorzystano głównie przykłady z dwóch rodzin procesorów: architektury Intel x86 oraz ARM. Obecna oferta rodziny x86 to wyniki dziesięcioleci prac projektowych dotyczących komputerów ze złożoną listą rozkazów (CISC). W rodzinie x86 wykorzystano wyrafinowane zasady projektowania, które kiedyś znajdowały zastosowanie tylko w komputerach głównej linii oraz superkomputerach i służyły jako doskonały przykład projektowania CISC. Alternatywnym podejściem do projektowania procesorów jest komputer o zredukowanej liście rozkazów (RISC). Jednym z najpotężniejszych i najlepiej zaprojektowanych systemów opartych na architekturze RISC jest architektura ARM, która jest używana w szerokiej gamie systemów wbudowanych. W tej i następnej części przedstawiamy krótki przegląd tych dwóch systemów.

Jeśli chodzi o udział w rynku, to od dziesięcioleci Intel zajmuje pierwsze miejsce wśród producentów mikroprocesorów do systemów niewbudowanych, i wydaje się mało prawdopodobne, by miało się to zmienić. Ewolucja flagowego mikroprocesora tej firmy jest dobrym punktem odniesienia do omówienia ogólnej ewolucji technologii komputerowej.

W tabeli 1.3 zaprezentowano przebieg tej ewolucji. Co ciekawe, w miarę jak rozwój oraz stopień skomplikowania mikroprocesorów się zwiększał, udział Intela w rynku także wzrastał. Intel rozwijał mikroprocesory jeden po drugim, co cztery lata. Jednak by utrzymać dystans do rywali, Intel skrócił czas rozwoju o rok lub dwa. Dotyczyło to także najnowszych generacji x86.[8]

Warto wymienić niektóre z najważniejszych wydarzeń związanych z ewolucją linii produktów firmy Intel:

• 8080: Pierwszy na świecie mikroprocesor ogólnego przeznaczenia. Była to maszyna 8-bitowa z 8-bitową ścieżką danych do pamięci. Procesor 8080 został użyty w pierwszym komputerze osobistym, Altair.

• 8086: Znacznie wydajniejsza i 16-bitowa maszyna. Oprócz szerszej ścieżki danych i większych rejestrów, 8086 miał pamięć podręczną rozkazów lub kolejkę, do której wstępnie pobieranych było kilka rozkazów przed ich wykonaniem. Wariant tego procesora, 8088, został użyty w pierwszym komputerze osobistym IBM, co zapewniło sukces Intelowi. 8086 jest pierwszym mikroprocesorem wykorzystującym architekturę x86.

• 80286: To rozszerzenie linii 8086 umożliwiało adresowanie pamięci o wielkości 16 MB zamiast zaledwie 1 MB.

• 80386: Pierwsza 32-bitowa maszyna Intela i gruntowna rewizja linii produktów. Dzięki 32-bitowej architekturze 80386 dorównywał złożonością i wydajnością minikomputerom i komputerom mainframe, które zostały wprowadzone zaledwie kilka lat wcześniej. Był to pierwszy procesor Intel obsługujący wielozadaniowość, co oznacza, że mógł uruchamiać wiele programów jednocześnie.

• 80486: W tym mikroprocesorze wprowadzono znacznie bardziej wyrafinowaną i wydajną technologię pamięci podręcznej oraz wyrafinowane potokowe przetwarzanie instrukcji. 80486 oferował również wbudowany dodatkowy koprocesor matematyczny, który odciążał główny procesor w wykonywaniu operacji matematycznych.

• Pentium: Wraz z procesorem Pentium firma Intel wprowadziła techniki superskalarne, które umożliwiają równoległe wykonywanie wielu rozkazów.

• Pentium Pro: Był kontynuacją przejścia do organizacji superskalarnej zapoczątkowanej wraz z wprowadzeniem procesora Pentium oraz z intensywnym wykorzystaniem przemianowania rejestrów, przewidywania rozgałęzień, analizy przepływu danych i spekulatywnego wykonywania rozkazów.

• Pentium II: Wykorzystywał technologię Intel MMX, zaprojektowaną specjalnie do wydajnego przetwarzania danych wideo, audio i graficznych.

• Pentium III: Wykorzystywał dodatkowe rozkazy zmiennoprzecinkowe – rozszerzenie listy rozkazów Streaming SIMD Extensions (SSE) dodało 70 nowych rozkazów zaprojektowanych w celu zwiększenia wydajności, gdy dokładnie te same operacje mają być wykonywane na wielu obiektach danych. Typowe zastosowania to cyfrowe przetwarzanie sygnałów i przetwarzanie grafiki.

• Pentium 4: Wykorzystywał dodatkowe rozkazy zmiennoprzecinkowe i inne ulepszenia związane z przetwarzaniem multimediów.

• Core: Był to pierwszy mikroprocesor Intel x86 z podwójnym rdzeniem, co odnosi się do implementacji dwóch rdzeni w jednym mikroukładzie.

• Core 2: Był rozszerzeniem architektury Core do 64 bitów. Core 2 Quad zawierał cztery rdzenie umieszczone na jednym mikroukładzie. Nowsze oferty serii Core mają do 10 rdzeni w jednym mikroukładzie. Ważnym dodatkiem do architektury była lista rozkazów Advanced Vector Extensions, który zapewniał zestaw 256-bitowych, a następnie 512-bitowych rozkazów do wydajnego przetwarzania danych wektorowych.

Prawie 40 lat po wprowadzeniu w 1978 roku architektura x86 nadal dominuje na rynku procesorów, wyłączając systemy wbudowane. Pomimo że organizacja i technologia maszyn x86 zmieniły się dramatycznie na przestrzeni dziesięcioleci, to architektura listy rozkazów ewoluowała tak, aby zachować kompatybilność wsteczną z wcześniejszymi wersjami. Zatem każdy program napisany z przeznaczeniem do starszej wersji architektury x86 może być również wykonywany na nowszych wersjach. Wszystkie zmiany w architekturze listy rozkazów obejmowały dodawanie nowych rozkazów do listy, bez usuwania rozkazów z listy. Tempo zmian polegało na dodawaniu do architektury mniej więcej jednego rozkazu miesięcznie [ANTH08], dzięki czemu w zestawie rozkazów znajdują się tysiące instrukcji.

Architektura x86 stanowi doskonałą ilustrację postępu w dziedzinie technologii komputerowej w ciągu ostatnich 35 lat. W roku 1978 został wprowadzony mikroprocesor 8086 z zegarem 5 MHz, który miał 29 000 tranzystorów. Wprowadzony w 2013 roku sześciordzeniowy Core i7 EE 4960X działa z częstotliwością 4 GHz, co daje 800-krotne przyspieszenie oraz ma 1,86 miliarda tranzystorów, czyli około 64 000 razy więcej niż 8086. Jednocześnie Core i7 EE 4960X jest tylko w niewielkim stopniu większy niż 8086, a koszt jego wytworzenia jest porównywalny.

1.6. Systemy wbudowane

Termin system wbudowany odnosi się do korzystania z elektroniki i oprogramowania w produkcie, w przeciwieństwie do komputera ogólnego przeznaczenia, takiego jak laptop lub komputer stacjonarny. Każdego roku sprzedaje się miliony komputerów, w tym laptopów, komputerów osobistych, stacji roboczych, serwerów, komputerów głównej linii i superkomputerów. W przeciwieństwie do tego, każdego roku produkowane są miliardy systemów komputerowych, które zostały wbudowane w większe urządzenia. Obecnie wiele, być może większość urządzeń wykorzystujących energię elektryczną ma wbudowany system komputerowy. Jest prawdopodobne, że w niedalekiej przyszłości praktycznie wszystkie takie urządzenia będą miały wbudowane systemy obliczeniowe.

Istnieje zbyt wiele rodzajów urządzeń z systemami wbudowanymi, by je wymienić. Przykłady obejmują telefony komórkowe, aparaty cyfrowe, kamery wideo, kalkulatory, kuchenki mikrofalowe, systemy bezpieczeństwa domowego, pralki, systemy oświetleniowe, termostaty, drukarki, różne systemy motoryzacyjne (np. sterowanie skrzynią biegów, tempomat, wtrysk paliwa, hamulce z ABS oraz zawieszenia), rakiety tenisowe, szczoteczki do zębów oraz liczne rodzaje czujników i siłowników w systemach automatycznych.

Bardzo często systemy wbudowane są ściśle powiązane ze swoim środowiskiem. Wynikać z tego mogą pewne ograniczenia w czasie rzeczywistym narzucone przez potrzebę interakcji ze środowiskiem. Ograniczenia, takie jak pewna wymagana szybkość transferu, wymagana precyzja pomiaru lub czas trwania, wpływają na tempo działania oprogramowania. W przypadku gdy istnieje potrzeba zarządzania jednocześnie wieloma działaniami, pojawiają się bardziej złożone ograniczenia w czasie rzeczywistym.

Na rysunku 1.14 przedstawiono ogólną organizację systemu wbudowanego. Oprócz procesora i pamięci istnieje szereg elementów różniących się od typowego komputera stacjonarnego lub laptopa:

• Mogą istnieć różne interfejsy, które umożliwiają systemowi mierzenie, manipulowanie oraz inną interakcję ze środowiskiem zewnętrznym. Systemy wbudowane często wchodzą w interakcje (wykrywają, manipulują i komunikują się) ze światem zewnętrznym za pośrednictwem czujników i elementów wykonawczych. Są to zazwyczaj systemy reaktywne, pozostające w ciągłej interakcji z otoczeniem i działające w tempie określonym przez to środowisko.

• Interfejs użytkownika może być tak prosty jak migające światło lub tak skomplikowany jak widzenie przez robota w czasie rzeczywistym. W wielu przypadkach nie istnieje interfejs użytkownika.

• Port diagnostyczny może być używany do diagnozowania kontrolowanego systemu, a nie tylko do diagnozowania komputera.

Rysunek 1.14. Możliwa organizacja systemów wbudowanych

• W celu zwiększenia wydajności lub niezawodności może być użyty specjalny sprzęt bezpośrednio programowalny (FPGA), specjalizowalny (ASIC) lub nawet niecyfrowy.

• Oprogramowanie często ma ustaloną funkcjonalność i jest specyficzne dla konkretnego zastosowania.

• Wydajność ma ogromne znaczenie dla systemów wbudowanych. Są zoptymalizowane pod kątem zużycia energii, rozmiaru kodu, czasu wykonania, wagi i wymiarów oraz kosztów produkcji.

Istnieją również pewne obszary podobieństwa do systemów komputerowych ogólnego przeznaczenia, na które warto zwrócić uwagę:

• Nawet w przypadku oprogramowania o ustalonej funkcjonalności istniejąca możliwość bezpośredniej aktualizacji w celu usunięcia błędów, poprawy bezpieczeństwa oraz dodania funkcjonalności stała się bardzo ważna w przypadku systemów wbudowanych, a nie tylko w urządzeniach konsumenckich.

• Stosunkowo niedawnym osiągnięciem są platformy przeznaczone dla systemów wbudowanych, które obsługują szeroką gamę aplikacji. Dobrymi tego przykładami są smartfony i urządzenia audio/wideo, takie jak inteligentne telewizory.

Internet rzeczy (IoT)

Warto osobno wskazać jedną z głównych przyczyn rozprzestrzeniania się systemów wbudowanych. Internet rzeczy (IoT) to termin odnoszący się do rozszerzającej się sieci inteligentnych urządzeń, od dużych urządzeń po małe czujniki. Dominującą kwestią jest wbudowanie przenośnych nadajników i odbiorników krótkiego zasięgu w szerokiej gamie gadżetów i przedmiotów codziennego użytku, umożliwiając nowe formy komunikacji między ludźmi i przedmiotami oraz między samymi przedmiotami. Internet obsługuje obecnie miliardy połączeń obiektów przemysłowych oraz osobistych, zwykle za pośrednictwem systemów umieszczonych w chmurze. Obiekty te dostarczają informacje z czujników, oddziałują na swoje otoczenie, a w niektórych przypadkach modyfikują się w celu zarządzania większym systemem, takim jak fabryka lub miasto.

IoT stanowią głównie głęboko osadzone urządzenia (zdefiniowane poniżej). To urządzenia o niewielkiej przepustowości, przechwytujące dane o małej powtarzalności i o niskim wykorzystaniu danych, które komunikują się ze sobą i dostarczają dane za pośrednictwem interfejsów użytkownika. Z kolei urządzenia wbudowane, takie jak kamery do monitoringu wideo o wysokiej rozdzielczości, wideotelefony VoIP i inne wymagają możliwości przesyłania strumieniowego o dużej przepustowości. Jednak bardzo duża liczba produktów wymaga jedynie przerywanego dostarczania pakietów danych.

Odnosząc się do obsługiwanych systemów końcowych, internet przeszedł przez około cztery generacje wdrożeń, których kulminacją był IoT:

1. Technologia informatyczna (IT): Komputery PC, serwery, routery, zapory sieciowe ibody table td., kupowane jako urządzenia IT przez pracowników działu IT w przedsiębiorstwach i korzystające głównie z łączności przewodowej.

2. Technologia operacyjna (OT): Maszyny oraz urządzenia z wbudowanym IT zbudowane przez firmy niebędące stricte informatycznymi. Urządzenia takie jak maszyny medyczne, SCADA (kontrola nadzoru i akwizycja danych), sterowanie procesami, kioski, kupowane jako urządzenia przez pracowników OT z przedsiębiorstw. Wykorzystują przede wszystkim łączność przewodową.

3. Technologia osobista: Smartfony, tablety i czytniki e-booków kupowane jako urządzenia informatyczne przez konsumentów (pracowników). Komunikują się wyłącznie przy użyciu wielu form łączności bezprzewodowej.

4. Technologia czujnika/siłownika: Urządzenia o sprecyzowanym, konkretnym przeznaczeniu kupowane przez konsumentów, informatyków i specjalistów OT. Korzystają wyłącznie z łączności bezprzewodowej, ogólnie w jednej formie, jako część większych systemów.

To właśnie urządzenia czwartej generacji zwykle uważa się za IoT, który charakteryzuje się wykorzystaniem miliardów urządzeń wbudowanych.

Wbudowane systemy operacyjne

Istnieją dwa ogólne podejścia do tworzenia wbudowanego systemu operacyjnego (OS). Pierwsze podejście polega na wykorzystaniu istniejącego systemu operacyjnego i dostosowaniu go do zastosowań wbudowanych. Na przykład istnieją wbudowane wersje systemów Linux, Windows i Mac, a także inne komercyjne i zastrzeżone systemy operacyjne przeznaczone dla systemów wbudowanych. Drugim podejściem jest zaprojektowanie i wdrożenie systemu operacyjnego przeznaczonego wyłącznie do użytku wbudowanego. Przykładem jest TinyOS, szeroko stosowany w bezprzewodowych sieciach czujników. Temat ten został szczegółowo omówiony w [STAL18].

Procesory aplikacyjne i procesory dedykowane

W tym punkcie i dwóch następnych pokrótce przedstawimy niektóre terminy powszechnie spotykane w literaturze dotyczącej systemów wbudowanych. Procesory aplikacyjne są określane przez zdolność procesora do uruchamiania złożonych systemów operacyjnych, takich jak Linux, Android i Chrome OS. Zatem procesor aplikacyjny jest z natury procesorem ogólnego przeznaczenia. Dobrym przykładem zastosowania wbudowanego procesora aplikacyjnego jest smartfon. Taki system wbudowany został zaprojektowany do obsługi wielu aplikacji i wykonywania szerokiej gamy funkcji.

Większość systemów wbudowanych wykorzystuje procesor dedykowany, który, jak wskazuje sama nazwa, jest przeznaczony do wykonywania przez urządzenie jednego lub kilku sprecyzowanych zadań. Ponieważ taki system wbudowany jest przeznaczony do wykonywania określonego zadania lub zadań, więc procesor i związane z nim komponenty można zaprojektować tak, by zminimalizować rozmiar i koszty.

Mikroprocesory i mikrokontrolery

Jak już omówiliśmy, wczesne układy mikroprocesorowe zawierały rejestry, jednostkę ALU oraz pewien rodzaj jednostki sterującej lub układu logicznego przetwarzania rozkazów. Wraz ze wzrostem gęstości upakowania tranzystorów stało się możliwe zwiększenie złożoności architektury listy rozkazów, a ostatecznie dodanie pamięci i więcej niż jednego procesora. Współczesne układy mikroprocesorowe, jak pokazano na rysunku 1.2, zawierają wiele rdzeni oraz pamięć podręczną o dużej pojemności.

Układ mikrokontrolera znacząco się różni w kwestii wykorzystania dostępnej przestrzeni logicznej. Na rysunku 1.15 pokazano ogólne elementy znajdujące się zwykle w układzie mikrokontrolera. Jak pokazano, mikrokontroler to pojedynczy układ, który zawiera procesor, nieulotną pamięć programu (ROM), ulotną pamięć wejścia

Rysunek 1.15. Typowe elementy układu mikrokontrolera

i wyjścia (RAM), zegar oraz jednostkę sterującą wejściem i wyjściem. Część mikrokontrolera przeznaczona na procesor zajmuje znacznie mniejszą powierzchnię krzemu w porównaniu z mikroprocesorami oraz jest dużo efektywniejsza pod względem zużycia energii.

Organizacja mikrokontrolerów została omówiona bardziej szczegółowo w podrozdziale 1.7.

Mikrokontrolery są nazywane również „mikrokomputerem jednoukładowym”, a miliardy jednostek mikrokontrolerów są każdego roku umieszczane w niezliczonych produktach, od zabawek po urządzenia i samochody. Na przykład jeden pojazd może wykorzystywać 70 lub więcej mikrokontrolerów. Zazwyczaj, zwłaszcza w przypadku mniejszych i tańszych mikrokontrolerów, są one wykorzystywane jako procesory służące do wykonywania konkretnych zadań. Na przykład mikrokontrolery są powszechnie wykorzystywane w procesach automatyzacji. Zapewniając proste reakcje na dane wejściowe, mogą sterować maszynami, włączać i wyłączać wentylatory, otwierać i zamykać zawory i tak dalej. Stanowią integralną część nowoczesnej technologii przemysłowej i należą do najtańszych sposobów produkcji maszyn, które mogą zapewniać niezwykle złożone funkcjonalności.

Mikrokontrolery są dostępne w różnych rozmiarach fizycznych oraz o różnej mocy obliczeniowej. W przypadku procesorów wykorzystywana jest architektura od 4-bitowej do 32-bitowej. Mikrokontrolery są znacznie wolniejsze niż mikroprocesory i zwykle częstotliwość ich taktowania jest wyrażana w MHz, a nie w GHz jak w przypadku mikroprocesorów. Inną typową cechą mikrokontrolera jest to, że nie zapewnia interakcji z człowiekiem. Mikrokontroler jest zaprogramowany do wykonywania określonego zadania, następnie osadzony w urządzeniu, gdzie w razie potrzeby wykonuje to zadanie.

Systemy wbudowane i systemy głęboko wbudowane

W tej części książki zdefiniowaliśmy pojęcie systemu wbudowanego. Istnieje pewien dość liczny podzbiór systemów wbudowanych, który jest określany mianem systemów głęboko wbudowanych. Chociaż termin ten jest szeroko stosowany w literaturze technicznej i handlowej, to na próżno można przeszukiwać internet (a przynajmniej ja to zrobiłem) w celu znalezienia prostej definicji. Ogólnie można powiedzieć, że system głęboko wbudowany ma procesor, którego zachowanie jest trudne do zaobserwowania zarówno przez programistę, jak i użytkownika.

System głęboko wbudowany wykorzystuje mikrokontroler, a nie mikroprocesor. Nie istnieje możliwość jego zaprogramowania po tym, jak logika działania programu została zapisana w pamięci ROM (pamięć tylko do odczytu) urządzenia. Nie występuje też interakcja z użytkownikiem.

Systemy głęboko wbudowane to dedykowane, jednofunkcyjne urządzenia, które wykrywają coś w środowisku, następnie wykonują podstawowy poziom przetwarzania danych i wykonują pewne operacje na podstawie wyników. Głęboko wbudowane systemy często mają możliwości łączności bezprzewodowej i pojawiają się w konfiguracjach sieciowych, takich jak sieci czujników rozmieszczonych na dużym obszarze, np. w fabryce lub na polu rolnym. Internet rzeczy w dużej mierze zależy od systemów głęboko wbudowanych. Zazwyczaj systemy głęboko wbudowane charakteryzują ekstremalne ograniczenia w kwestii zasobów pamięci, rozmiaru procesora, czasu i zużycia energii.

1.7. Architektura ARM

Architektura ARM odnosi się do architektury procesora, która wyewoluowała z zasad projektowania RISC i jest obecnie używana w systemach wbudowanych. Zasady projektowania RISC omówiono szczegółowo w rozdziale 7. W tej części przedstawiamy krótki przegląd architektury ARM.

Ewolucja ARM

ARM to rodzina mikroprocesorów i mikrokontrolerów opartych na architekturze RISC, zaprojektowanych przez ARM Holdings, Cambridge, w Anglii. Firma ta nie produkuje procesorów, zajmuje się jedynie projektowaniem architektury mikroprocesorowej i wielordzeniowej oraz udziela na nie licencji producentom. ARM Holdings oferuje dwa rodzaje produktów podlegających licencjonowaniu: procesory i architektury procesorów. W przypadku procesorów klient nabywa prawa do wykorzystywania projektów dostarczonych przez ARM we własnych mikroukładach. W przypadku architektury procesorowej klient nabywa prawa do zaprojektowania własnego procesora zgodnego z architekturą ARM.

Mikroukłady ARM to szybkie procesory, które są znane z małych rozmiarów i niskiego zapotrzebowania na energię. Są szeroko stosowane w smartfonach i innych urządzeniach przenośnych, w tym w systemach służących do gier, a także w szerokiej gamie produktów konsumenckich. Układy ARM znajdują zastosowanie w popularnych urządzeniach iPod i iPhone firmy Apple, a także są używane w praktycznie wszystkich smartfonach z systemem Android. Partnerzy ARM dostarczyli w 2016 roku 16,7 miliarda mikroukładów opartych na architekturze ARM. Jest to prawdopodobnie najszerzej stosowana architektura procesorów wbudowanych i w rzeczywistości najszerzej stosowana architektura procesorów dowolnego rodzaju na świecie [VANC14].

Początki technologii ARM sięgają brytyjskiej firmy Acorn Computers. Na początku lat 80. XX wieku firma Acorn uzyskała kontrakt od British Broadcasting Corporation (BBC) na opracowanie nowej architektury mikrokomputera dla BBC Computer Literacy Project. Sukces tego kontraktu umożliwił firmie Acorn opracowanie pierwszego komercyjnego procesora opartego na RISC, Acorn RISC Machine (ARM). Pierwsza wersja, ARM1, została wdrożona w 1985 roku i była wykorzystywana do wewnętrznych badań nad dalszym rozwojem architektury ARM, a także jako koprocesor w urządzeniu BBC.

Na tym wczesnym etapie rozwoju firma Acorn korzystała z usług firmy VLSI Technology, której zlecała faktyczną produkcję mikroukładów procesorów. Firma VLSI posiadała licencję na sprzedaż mikroukładów na własną rękę i odniosła duży sukces w zachęcaniu innych firm do używania rozwiązań ARM w swoich produktach, zwłaszcza jako procesorów wbudowanych.

Konstrukcja ARM była w stanie zaspokoić rosnące komercyjne zapotrzebowanie na wysoko wydajny, energooszczędny, niewielki i tani procesor do zastosowań wbudowanych. Jednak dalszy rozwój wykraczał poza możliwości firmy Acorn. W związku z tym powstała nowa firma ARM Lbody table td., której partnerami i założycielami są Acorn, VLSI oraz Apple Computer. Oznaczenie Acorn RISC Machine zostało zamienione na Advanced RISC Machines.[9] W roku 2016 ARM została przejęta przez japońską firmę telekomunikacyjną SoftBankGroup.

Architektura listy rozkazów

W przypadku ARM lista rozkazów (ISA, ang. Instruction Set Architecture) jest bardzo usystematyzowana, zaprojektowana z myślą o wydajnej implementacji procesora i wydajnej realizacji zadań. Wszystkie rozkazy mają długość 32 bitów oraz regularny format. To sprawia, że lista rozkazów ARM nadaje się do wdrożenia w szerokiej gamie produktów.

Uzupełnieniem podstawowej listy rozkazów ARM ISA jest lista rozkazów Thumb, która jest ponownie zakodowanym podzbiorem listy rozkazów ARM. Thumb ma na celu zwiększenie wydajności tych implementacji ARM, które wykorzystują 16-bitową lub węższą szynę danych pamięci, oraz zapewnienie lepszej gęstości kodu niż w przypadku listy rozkazów ARM. Lista rozkazów Thumb zawiera podzbiór 32-bitowej listy rozkazów ARM przekodowany na instrukcje 16-bitowe. Aktualna obecnie wersja to Thumb-2.

ARM i Thumb-2 ISA zostały omówione w rozdziałach 12 i 13 (tom II).

Produkty ARM

ARM Holdings udziela licencji na szereg wyspecjalizowanych mikroprocesorów oraz powiązanych technologii, jednak większość linii produktów to rodzina architektur mikroprocesorowych Cortex. Istnieją trzy architektury Cortex, dla wygody oznaczone literami A, R i M.

CORTEX-A. Seria procesorów Cortex-A obejmuje procesory aplikacyjne przeznaczone do urządzeń mobilnych, takich jak smartfony i czytniki eBooków, a także urządzeń konsumenckich, takich jak telewizja cyfrowa i bramy domowe (np. modemy internetowe DSL i kablowe). Procesory te działają z wyższą częstotliwością taktowania (ponad 1 GHz) i obsługują jednostkę zarządzania pamięcią (MMU), która jest wymagana do osiągnięcia pełnej funkcjonalności systemu operacyjnego, takiego jak Linux, Android, MS Windows i mobilne systemy operacyjne. MMU jest modułem sprzętowym obsługującym pamięć wirtualną i stronicowanie przez tłumaczenie adresów wirtualnych na adresy fizyczne.Temat ten został omówiony w rozdziale 8.

Obie architektury wykorzystują zarówno rozkazy ARM, jak i Thumb-2. Procesory z tej serii występują zarówno w wersji 32-bitowej, jak i 64-bitowej.

CORTEX-R. Został zaprojektowany do obsługi aplikacji czasu rzeczywistego, w których sterowanie taktowaniem zdarzeń musi odbywać się z natychmiastową reakcją na zdarzenia. Procesory tej serii mogą działać ze stosunkowo wysoką częstotliwością zegara (np. 200 MHz do 800 MHz) oraz charakteryzują się bardzo małym opóźnieniem. W celu wspierania głęboko wbudowanych urządzeń czasu rzeczywistego Cortex-R zawiera ulepszenia zarówno listy rozkazów, jak i organizacji procesora. Większość z tych procesorów nie ma MMU. Ponadto ze względu na ograniczone wymagania dotyczące danych oraz niewielką liczbę jednocześnie obsługiwanych procesów nie ma potrzeby stosowania skomplikowanej obsługi sprzętowej i programowej dla pamięci wirtualnej. Cortex-R ma moduł ochrony pamięci (MPU, ang. Memory Protection Unit), pamięć podręczną oraz inne funkcje pamięci przeznaczone do zastosowań przemysłowych. MPU jest modułem sprzętowym, który uniemożliwia programowi znajdującemu się w pamięci uzyskanie przypadkowego dostępu do pamięci przypisanej do innego aktywnego programu. Używając różnych metod, wokół programu tworzona jest granica ochronna, a rozkazy związane z tym programem nie mogą się odwoływać do danych spoza tej granicy.

Przykładami systemów wbudowanych, które wykorzystują Cortex-R, są samochodowe układy hamulcowe, kontrolery pamięci masowej oraz urządzenia sieciowe i drukujące.

CORTEX-M. Procesory z serii Cortex-M zostały opracowane głównie z myślą o mikrokontrolerach, które wymagają szybkiego, wysoce deterministycznego zarządzania przerwaniami oraz jednocześnie niezwykle małej liczby bramek i możliwie najniższego zużycia energii. Podobnie jak w przypadku serii Cortex-R, architektura Cortex-M ma MPU, ale nie ma MMU. Cortex-M wykorzystuje tylko listy rozkazów Thumb-2. Zastosowania Cortex-M obejmują urządzenia IoT, bezprzewodowe sieci czujników i elementów wykonawczych stosowanych w fabrykach i innych przedsiębiorstwach, elektronikę samochodową i tym podobne.

Obecnie istnieje siedem wersji serii Cortex-M:

• Cortex-M0: Zaprojektowany dla aplikacji 8- i 16-bitowych. Główny nacisk został położony na niski koszt, bardzo niski pobór mocy oraz prostotę. Jest zoptymalizowany pod kątem matryc krzemowych o małych rozmiarach (od 12 tysięcy bramek) i jest używany w najtańszych układach.

• Cortex-M0+: Ulepszona wersja M0, która jest bardziej energooszczędna.

• Cortex-M3: Zaprojektowany dla aplikacji 16- i 32-bitowych. Duży nacisk został położony na wydajność i energooszczędność. Ma również wszechstronne funkcje debugowania i śledzenia umożliwiające programistom szybkie tworzenie aplikacji.

• Cortex-M4: Model ten zapewnia wszystkie funkcjonalności Cortex-M3 wraz z dodatkowymi rozkazami do obsługi zadań przetwarzania sygnału cyfrowego.

• Cortex-M7: Zapewnia wyższą wydajność niż M4. Nadal jest to przede wszystkim maszyna 32-bitowa, jednak wykorzystuje 64-bitowe magistrale rozkazów i danych.

• Cortex-M23: Model podobny do modelu M0, dodatkowo zawiera rozkazy dzielenia liczb całkowitych oraz pewne funkcjonalności zabezpieczające.

• Cortex-M33: Jest to model podobny do modelu M4, dodatkowo zawiera kilka funkcjonalności zabezpieczających.

W dalszej części jako przykładowego wbudowanego procesora systemowego użyjemy przede wszystkim ARM Cortex-M3. Ze wszystkich modeli ARM jest to model, który najlepiej nadaje się do zastosowania w mikrokontrolerach ogólnego przeznaczenia i jest używany przez różnych producentów produktów mikrokontrolerowych. Pierwsze urządzenia, w których wykorzystano mikrokontroler oparty na procesorze Cortex-M3, takie jak pamięci flash, pamięci SRAM i liczne urządzenia peryferyjne, oferowane są w konkurencyjnej cenie zaledwie 1 USD.

Na rysunku 1.16 przedstawiono schemat blokowy mikrokontrolera EFM32 firmy Silicon Labs, szczegóły procesora Cortex-M3 oraz elementy rdzenia. W dalszej części omówimy po kolei każdy z tych poziomów.

Rysunek 1.16. Typowy układ mikrokontrolera oparty na Cortex-M3

Rdzeń Cortex-M3 wykorzystuje oddzielne magistrale dla rozkazów i danych. Taki układ jest czasami określany jako architektura Harvarda, w przeciwieństwie do architektury von Neumanna, która do przesyłania zarówno rozkazów, jak i danych wykorzystuje te same magistrale sygnałowe oraz pamięć.

Dzięki możliwości jednoczesnego odczytu rozkazów i danych z pamięci procesor Cortex-M3 może wykonywać wiele operacji równolegle, przyspieszając tym samym działanie aplikacji. Rdzeń zawiera dekoder rozkazów Thumb, zaawansowaną jednostkę ALU ze sprzętową obsługą mnożenia i dzielenia, układ logiczny sterowania oraz interfejsy do innych komponentów procesora, a w szczególności interfejs zagnieżdżonego kontrolera przerwań wektorowych (NVIC, ang. nested vector interrupt controller) oraz moduł ETM (ang. embedded trace macrocell).

Rdzeń jest częścią modułu zwanego procesorem Cortex-M3. Należy jednak zauważyć, że termin ten może być nieco mylący, ponieważ zazwyczaj w literaturze określenia rdzeń i procesor są traktowane jako równoważne. Oprócz rdzenia procesor zawiera także następujące elementy:

• NVIC: Zapewnia procesorowi konfigurowalną obsługę przerwań. Ułatwia obsługę wyjątków i przerwań o małym opóźnieniu oraz kontroluje zarządzanie energią.

• ETM: Opcjonalny komponent debugowania, który umożliwia odtworzenie sposobu wykonania programu. Moduł ETM został zaprojektowany jako szybkie narzędzie do debugowania o niskim poborze mocy, które obsługuje tylko śledzenie rozkazów.

• Port dostępu debugowania (DAP): Zapewnia interfejs zewnętrznego dostępu do debugowania procesora.

• Układ logiczny debugowania: Podstawowe funkcje debugowania obejmują: zatrzymanie procesora, single-step, dostęp do rejestru rdzeni procesora, nieograniczoną liczbę punktów przerwań oprogramowania i pełny dostęp do pamięci systemowej.

• Interfejs ICode: Pobiera rozkazy z obszaru pamięci, w której przechowywany jest kod.

• SRAM i interfejs peryferyjny: Interfejs odczytu/zapisu do pamięci danych i urządzeń peryferyjnych.

• Macierz magistrali: Łączy interfejsy rdzenia i debugowania z zewnętrznymi magistralami mikrokontrolera.

• Jednostka ochrony pamięci: Chroni krytyczne dane używane przez system operacyjny przed aplikacjami użytkowymi, oddzielając wykonywane zadania przez blokowanie dostępu do wzajemnych danych, wyłączając dostęp do obszarów pamięci, umożliwiając zdefiniowanie obszarów pamięci jako tylko do odczytu oraz wykrywając nieoczekiwany dostęp do pamięci, który może potencjalnie uszkodzić system.

W górnej części rysunku 1.16 przedstawiono schemat blokowy typowego mikrokontrolera zbudowanego na podstawie Cortex-M3, w tym przypadku mikrokontrolera EFM32. Mikrokontroler ten jest wykorzystywany w szerokiej gamie urządzeń, w tym do pomiaru zużycia energii, gazu i wody, w systemach alarmowych i ochrony, w urządzeniach automatyki przemysłowej, w urządzeniach automatyki domowej, w inteligentnych akcesoriach oraz w urządzeniach branży zdrowotnej i fitness. Krzemowy mikroukład składa się z 10 głównych obszarów:

• Rdzeń i pamięć: Obejmuje procesor Cortex-M3, statyczną pamięć danych RAM (SRAM)[10] oraz pamięć flash[11] do przechowywania rozkazów programu i niezmiennych danych aplikacji. Pamięć flash jest nieulotna (dane nie są tracone po wyłączeniu zasilania) i dlatego idealnie nadaje się do tego celu. W pamięci SRAM przechowywane są dane zmienne. Obszar ten zawiera również interfejs debugowania, który ułatwia bezpośrednie przeprogramowanie i aktualizację systemu.

• Równoległe porty wejścia/wyjścia: Konfigurowalne dla różnego rodzaju równoległych schematów wejścia/wyjścia.

• Interfejsy szeregowe: Obsługują różne schematy szeregowych wejść/wyjść.

• Interfejsy analogowe: Analogowo-cyfrowy i cyfrowo-analogowy układ logiczny do obsługi czujników i elementów wykonawczych.

• Liczniki czasu i wyzwalacze: Są wykorzystywane do śledzenia przebiegów czasowych i zliczania zdarzeń, generowania przebiegów wyjściowych i wyzwalania zaplanowanych działań w innych urządzeniach peryferyjnych.

• Zarządzanie zegarem: Kontroluje zegary i oscylatory w mikroukładzie. Wykorzystywanych jest wiele zegarów i oscylatorów w celu zminimalizowania zużycia energii i zapewnienia krótkich czasów uruchamiania.

• Zarządzanie energią: Zarządza różnymi energooszczędnymi trybami działania procesora i urządzeń peryferyjnych, umożliwiając tym samym zarządzanie zapotrzebowaniem na energię w czasie rzeczywistym w celu minimalizowania zużycia energii.

• Zabezpieczenia: Mikroukład zawiera sprzętową implementację Advanced Encryption Standard (AES).

• Magistrala 32-bitowa: Łączy wszystkie komponenty w mikroukładzie.

• Magistrala do podłączania urządzeń peryferyjnych: Sieć, która pozwala różnym modułom peryferyjnym komunikować się bezpośrednio ze sobą bez angażowania procesora. Obsługuje krytyczne dla taktowania operacje i zmniejsza obciążenie oprogramowania.

Porównując rysunek 1.16 z rysunkiem 1.2, można zauważyć wiele podobieństw oraz taką samą ogólną strukturę hierarchiczną. Należy jednak zauważyć, że najwyższym poziomem systemu komputerowego opartego na mikrokontrolerze jest pojedynczy układ scalony, podczas gdy w przypadku komputera wielordzeniowego najwyższym poziomem jest płyta główna zawierająca pewną liczbę mikroukładów. Kolejną istotną różnicą jest brak pamięci podręcznej, która nie występuje w procesorze Cortex-M3 i w całym mikrokontrolerze, co jest istotne, jeśli kod lub dane znajdują się w pamięci zewnętrznej. Pomimo że liczba cykli odczytu rozkazów lub danych różni się w zależności od trafienia lub chybienia w pamięci podręcznej, to jednak pamięć podręczna znacznie poprawia wydajność w przypadku korzystania z pamięci zewnętrznej. W przypadku mikrokontrolera nie jest to wymagane.

1.8. Podstawowe pojęcia, pytania sprawdzające i zadania

Podstawowe pojęcia

architektura komputerowa

architektura listy rozkazów (ISA)

ARM

bramka

Intel x86

internet rzeczy (IoT)

jednostka arytmetyczno-logiczna (ALU)

jednostka centralna (CPU)

jednostka ochrony pamięci (MPU)

jednostka sterująca

jednostka zarządzania pamięcią (MMU)

komórka pamięci

magistrala systemowa

mikroelektronika

mikrokontroler

mikroprocesor

mikroukład

moduł wieloukładowy (MCM)

organizacja komputerowa

pamięć główna

pamięć półprzewodnikowa

płyta główna

płytka drukowana

połączenie systemowe

półprzewodnik

procesor

procesor aplikacyjny

procesor dedykowany

procesor wielordzeniowy

rdzeń

rejestry

system głęboko wbudowany

system wbudowany

tranzystor

układ scalony

wejście/wyjście (we-wy)

wielordzeniowy

Pytania sprawdzające

1.1. Jaka jest, ogólnie rzecz biorąc, różnica między organizacją komputera a architekturą komputera?

1.2. Jak, ogólnie rzecz biorąc, rozróżnia się strukturę komputera od funkcji komputera?

1.3. Jakie cztery główne zadania może spełniać komputer?

1.4. Wymień i krótko zdefiniuj główne elementy konstrukcyjne komputera.

1.5. Wymień i krótko zdefiniuj główne elementy konstrukcyjne procesora.

1.6. Wyjaśnij, co to jest komputer z programem przechowywanym?

1.7. Wyjaśnij prawo Moore’a.

1.8. Jaka jest kluczowa cecha wyróżniająca mikroprocesor?

Zadania

1.1. Napisz program IAS, który będzie obliczał wynik następującego równania:

Przyjmij, że obliczenie nie skutkuje przepełnieniem arytmetycznym oraz że X, Y i N są dodatnimi liczbami całkowitymi, a N ≥ 1. Uwaga: IAS nie wykorzystywał języka asemblera tylko język maszynowy.

a. Podczas pisania programu IAS użyj równania: .

b. Zrób to w trudniejszy sposób, bez używania równania z punktu (a).

1.2 a. Jak w przypadku IAS wyglądałaby instrukcja kodu maszynowego ładująca zawartość pamięci o adresie 2 do akumulatora?

b. Ile odwołań do pamięci musi zrobić procesor, aby wykonać ten rozkaz podczas cyklu rozkazu?

1.3. Dla komputera IAS opisz proces, który musi podjąć procesor, by odczytać wartość z pamięci i zapisać wartość do pamięci w kategoriach tego, co jest umieszczane w MAR, MBR, magistrali adresowej, magistrali danych i magistrali sterującej.

1.4. Zakładając zawartość pamięci komputera IAS pokazaną poniżej,

Adres

Zawartość pamięci

08A

010FA210FB

08B

010FA0F08D

08C

020FA210FB

napisz kod języka asemblera dla programu, zaczynając od adresu 08A. Wyjaśnij, co robi ten program.

1.5. Na rysunku 1.6 podaj szerokość każdej ścieżki danych w bitach (np. między AC i ALU).

1.6. W modelach 65 i 75 rodziny IBM 360 adresy są rozłożone w dwóch oddzielnych jednostkach pamięci głównej (np. wszystkie słowa o numerach parzystych znajdują się w jednej jednostce, a wszystkie słowa o numerach nieparzystych w drugiej). Jaka mogła być intencja takiego rozwiązania?

1.7. Względna wydajność modelu 75 rodziny IBM 360 jest 50 razy większa niż modelu 30, jednak czas cyklu rozkazów jest tylko 5 razy krótszy. Jak wytłumaczysz tę rozbieżność?

1.8. Podczas przeglądania sklepu komputerowego Billy’ego Boba słyszysz klienta, który pyta Billy’ego Boba, jaki najszybszy komputer można kupić w tym sklepie. Billy Bob odpowiada: „Widzę, że właśnie patrzysz na nasze komputery Macintosh. Najszybszy komputer Mac, jaki mamy, działa z taktowaniem zegara 1,2 GHz. Jeśli jednak naprawdę chcesz mieć najszybszą maszynę, to powinieneś zamiast niego kupić ten z procesorem Intel Pentium IV 2,4 GHz”. Czy Billy Bob ma rację? Co byś powiedział temu klientowi, aby mu pomóc?

1.9. ENIAC, prekursor komputera ISA, był maszyną dziesiętną, w której każdy rejestr był reprezentowany przez pierścień 10 lamp próżniowych. W dowolnym momencie tylko jedna lampa próżniowa była włączona, co reprezentowało jedną z 10 cyfr układu dziesiętnego. Zakładając, że ENIAC mógł mieć jednocześnie wiele włączonych i wyłączonych lamp próżniowych, wyjaśnij, dlaczego taka reprezentacja jest „marnotrawna” i jaki zakres wartości całkowitych można przedstawić, wykorzystując 10 lamp próżniowych?

1.10. Dla każdego z poniższych przykładów ustal, czy jest to system wbudowany, wyjaśniając, dlaczego nim jest lub nie jest.

a. Czy programy, które są przeznaczone do rozwiązywania zagadnień fizycznych i/lub sprzętowych, są wbudowane? Na przykład program, który wykorzystuje metodę elementów skończonych do przewidywania przepływu płynu wokół skrzydła samolotu?

b. Czy wewnętrzny mikroprocesor sterujący napędem dysku jest przykładem systemu wbudowanego?

c. Sterowniki wejścia/wyjścia sterują sprzętem, a zatem czy obecność sterownika wejścia/wyjścia oznacza, że komputer obsługujący sterownik jest wbudowany?

d. Czy PDA (Personal Digital Assistant) jest systemem wbudowanym?

e. Czy mikroprocesor sterujący telefonem komórkowym jest systemem wbudowanym?

f. Czy komputery w dużym radarze fazowym można uznać za wbudowane? Radary te to 10-piętrowe budynki z jedną do trzech promieniujących powierzchni o średnicy 100 stóp, które są umieszczone na pochyłych ścianach budynku.

g. Czy tradycyjny system zarządzania lotem (FMS, ang. flight management system) zintegrowany z kokpitem samolotu można uznać za wbudowany?

h. Czy komputery w symulatorze (HIL, ang. hardware-in-the-loop) można uznać za wbudowane?

i. Czy komputer sterujący rozrusznikiem serca można uznać za wbudowany?

j. Czy komputer sterujący wtryskiem paliwa w silniku samochodowym można uznać za wbudowany?

Przypisy

[1] Rozdziały 13–21 znajdują się w tomie II.

[2] 1 kB = 1 kilobajt = 1024 bajtów. Przedrostki numeryczne zostały wyjaśnione w dokumencie w zakładce „OtherUseful” na stronie ComputerScienceStudent.com.

[3] Raport z 1945 roku dotyczący EDVAC jest dostępny pod adresem box.com/COA11e.

[4] Raport 3A 1954 [GOLD54] opisujący zaimplementowaną maszynę IAS oraz zawierający ostateczną listę rozkazów. Jest dostępny pod adresem box.com/COA11e.

[5] W tej książce, o ile nie zaznaczono inaczej, termin rozkaz odnosi się do rozkazu maszynowego, który jest bezpośrednio interpretowany i wykonywany przez procesor, w przeciwieństwie do instrukcji w językach wysokiego poziomu, jak na przykład Ada lub C++, które przed wykonaniem muszą być najpierw skompilowane do szeregu rozkazów maszynowych.

[6] Nie istnieje uniwersalna definicja słowa. Ogólnie rzecz biorąc, słowo to uporządkowany zestaw bajtów lub bitów, który jest normalną jednostką, w której rozkazy mogą być przechowywane, przesyłane lub obsługiwane w danym komputerze. Zazwyczaj, jeśli procesor ma listę rozkazów o stałej długości, to długość rozkazu jest równa długości słowa.

[7] Zauważ, że oś pionowa jest w skali logarytmicznej. Podstawowe omówienie skali logarytmicznych można znaleźć na witrynie z zasobami dla studentów informatyki na stronie ComputerScienceStudent.com.

[8] Intel określa to jako tick-tock model. Korzystając z tego modelu, firma Intel z powodzeniem wytwarzała technologię krzemową nowej generacji, a także nową mikroarchitekturę procesorów na przemian w ciągu ostatnich kilku lat. Zobacz http://www.intel.com/content/www/us/en/silicon-innovations/intel-tick-tockmodel-general.html.

[9] Firma zrezygnowała z oznaczenia Advanced RISC Machines pod koniec lat 90. ubiegłego wieku. Obecnie jest teraz po prostu znana jako architektura ARM.

[10] Statyczna pamięć RAM (SRAM) to forma pamięci o dostępie swobodnym, która jest używana jako pamięć podręczna. Więcej na ten temat można znaleźć w rozdziale 6.

[11] Pamięć flash to uniwersalna forma pamięci stosowana zarówno w mikrokontrolerach, jak i jako pamięć zewnętrzna. Więcej na ten temat można znaleźć w rozdziale 7.