| 26 |
\and% |
\and% |
| 27 |
{\large Tomasz Poradowski} % |
{\large Tomasz Poradowski} % |
| 28 |
{\normalsize {\tt \(<\)batonik@batonik.net\(>\)}}} |
{\normalsize {\tt \(<\)batonik@batonik.net\(>\)}}} |
| 29 |
\title{{\Large Dokumentacja projektu} \\ \vspace{2mm} {\Huge SmArc} } |
\title{{\Large Dokumentacja projektu} \\ \vspace{2mm} {\Huge SmArc}} |
| 30 |
|
|
| 31 |
\date{\sf Politechnika Wrocławska, Wrocław, (c) 2002-2003} |
|
| 32 |
|
\date{ {\small {\tt http://savannah.gnu.org/projects/SmArc}} \\\vspace{1mm} |
| 33 |
|
{\sf Politechnika Wrocławska, Wrocław, (c) 2002-2003 }} |
| 34 |
\maketitle |
\maketitle |
| 35 |
|
|
| 36 |
\newcommand{\spasm}{{\it spasm}} |
\newcommand{\spasm}{{\it spasm}} |
| 39 |
\newcommand{\smarcgui}{{\it smarcgui}} |
\newcommand{\smarcgui}{{\it smarcgui}} |
| 40 |
\newcommand{\SmArc}{{\bf SmArc}} |
\newcommand{\SmArc}{{\bf SmArc}} |
| 41 |
\newcommand{\SmArcAs}{{\bf SmArcAs}} |
\newcommand{\SmArcAs}{{\bf SmArcAs}} |
| 42 |
|
\newcommand{\SPARC}{{\bf SPARCv8}} |
| 43 |
|
|
| 44 |
\section{Wstęp} |
\section{Wstęp} |
| 45 |
\label{sec:wstep} |
\label{sec:wstep} |
| 46 |
|
|
| 47 |
Wirtualna maszyna \SmArc\ powstała jako projekt akademicki, mający na |
Wirtualna maszyna \SmArc\ powstała jako projekt akademicki, mający na |
| 48 |
celu bliższe poznanie architektury oraz sposobu działania procesora |
celu bliższe poznanie architektury oraz sposobu działania procesora |
| 49 |
SPARC. \SmArc\cite{komorowski} (od {\it Small SPARC}) zawiera jego |
\SPARC. \SmArc\cite{komorowski} (od {\it Small SPARC}) zawiera jego |
| 50 |
wersję uproszczoną, jednakże wiernie oddaje ona realia i większość |
wersję uproszczoną, jednakże wiernie oddaje ona realia i większość |
| 51 |
aspektów projektowych oraz technologicznych zastosowanych w oryginale |
aspektów projektowych oraz technologicznych zastosowanych w oryginale |
| 52 |
(więcej informacji w specyfikacji SPARCv8\cite{SPARCv8}). |
(więcej informacji w specyfikacji \SPARC\cite{SPARCv8}). |
| 53 |
|
|
| 54 |
|
|
| 55 |
|
|
| 56 |
\section{Elementy \SmArc} |
\section{Elementy \SmArc} |
| 60 |
znajduje się w~dalszej części): |
znajduje się w~dalszej części): |
| 61 |
|
|
| 62 |
\begin{itemize} |
\begin{itemize} |
| 63 |
\item \vmachine\ - wirtulana maszyna oparta na uproszczonej wersji procesora |
\item \vmachine\ - wirtualna maszyna oparta na uproszczonej wersji procesora |
| 64 |
SPARC |
\SPARC |
| 65 |
\item \spasm\ - asembler programów napisanych w języku \SmArcAs\ (uproszczonej |
\item \spasm\ - asembler programów napisanych w języku \SmArcAs\ (uproszczonej |
| 66 |
wersji asemblera SPARC) |
wersji asemblera \SPARC) |
| 67 |
\item \despasm\ - deasembler plików wykonywalnych zapisanych w formacie maszyny |
\item \despasm\ - deasembler plików wykonywalnych zapisanych w formacie maszyny |
| 68 |
wirtualnej \SmArc |
wirtualnej \SmArc |
| 69 |
\item \smarcgui\ - interfejs graficzny wirtualnej maszyny \SmArc |
\item \smarcgui\ - interfejs graficzny wirtualnej maszyny \SmArc |
| 70 |
\item {\it loader} - moduł służacy do wczytania plików wykonywalnych \SmArc |
\item {\it loader} - moduł służący do wczytania plików wykonywalnych \SmArc |
| 71 |
\item {\it examples} - przykładowe programy źródłowe w języku \SmArcAs |
\item {\it examples} - przykładowe programy źródłowe w języku \SmArcAs |
| 72 |
\end{itemize} |
\end{itemize} |
| 73 |
|
|
| 85 |
\label{sec:elementy:vmachine} |
\label{sec:elementy:vmachine} |
| 86 |
|
|
| 87 |
\vmachine\ jest głównym modułem projektu \SmArc. Jest to uproszczony |
\vmachine\ jest głównym modułem projektu \SmArc. Jest to uproszczony |
| 88 |
model procesora SPARC o klasycznej strukturze potoku 5-stopniowego. |
model procesora \SPARC\ o klasycznej strukturze potoku 5-stopniowego. |
| 89 |
Symuluje wykonywanie programów z~dokładnością do mikrooperacji |
Symuluje wykonywanie programów z~dokładnością do mikrooperacji |
| 90 |
wykonywanych w jednym cyklu zegara. \vmachine\ umożliwia zaobserwować |
wykonywanych w jednym cyklu zegara. \vmachine\ umożliwia zaobserwować |
| 91 |
przepływ danych we wewnętrznych rejestrach procesora, w szczególności |
przepływ danych we wewnętrznych rejestrach procesora, w szczególności |
| 107 |
\label{sec:elementy:spasm} |
\label{sec:elementy:spasm} |
| 108 |
|
|
| 109 |
Program \spasm\ służy do tłumaczenia plików źródłowych napisanych w |
Program \spasm\ służy do tłumaczenia plików źródłowych napisanych w |
| 110 |
języku \SmArcAs\ (uproszczonej wersji asemblera SPARC) do kodu wykonywalnego |
języku \SmArcAs\ (uproszczonej wersji asemblera \SPARC) do kodu wykonywalnego |
| 111 |
(binarnego) w formacie maszyny wirtualnej \SmArc. \spasm\ jest uruchamiany |
(binarnego) w formacie maszyny wirtualnej \SmArc. \spasm\ jest uruchamiany |
| 112 |
z linii poleceń: |
z linii poleceń: |
| 113 |
|
|
| 230 |
\label{sec:elementy:example} |
\label{sec:elementy:example} |
| 231 |
|
|
| 232 |
W katalogu {\it examples} zawarte zostały poglądowe programy mające na |
W katalogu {\it examples} zawarte zostały poglądowe programy mające na |
| 233 |
celu pokazanie jednej lub więcej właściwości procesora SPARC. Niektóre z nich |
celu pokazanie jednej lub więcej właściwości procesora \SPARC. Niektóre z nich |
| 234 |
to zwykłe, typowe programy testowe. |
to zwykłe, typowe programy testowe. |
| 235 |
|
|
| 236 |
\begin{itemize} |
\begin{itemize} |
| 237 |
\item addloop.asm - pętla wykonywana zadaną ilość razy |
\item addloop.asm - pętla wykonywana zadaną ilość razy |
| 238 |
\item arith.asm - instrukcje arytmetyczne |
\item arith.asm - instrukcje arytmetyczne |
| 239 |
\item forward.asm - demonstracja {\it forwardingu} w procesorze SPARC |
\item forward.asm - demonstracja {\it forwardingu} w procesorze \SPARC |
| 240 |
\item load.asm - odczyt i zapis z/do pamięci danych |
\item load.asm - odczyt i zapis z/do pamięci danych |
| 241 |
\item logic.asm - operacje logiczne na rejestrach |
\item logic.asm - operacje logiczne na rejestrach |
| 242 |
\item loop.asm - instrukcje branch |
\item loop.asm - instrukcje branch |
| 243 |
\item memcpy.asm - kopiowanie danych |
\item memcpy.asm - kopiowanie danych |
| 244 |
\item procedure.asm - instrukcja call wywołanie fragmentu programu (procedury) |
\item procedure.asm - instrukcja call wywołanie fragmentu programu (procedury) |
| 245 |
\item stall.asm - demonstracja wystąpienia {\it stall} w procesorze SPARC |
\item stall.asm - demonstracja wystąpienia {\it stall} w procesorze \SPARC |
| 246 |
\end{itemize} |
\end{itemize} |
| 247 |
|
|
| 248 |
|
|
| 269 |
\item {\bf WB} ({\it Write Back}) - zapis wyniku w rejestrach programowych |
\item {\bf WB} ({\it Write Back}) - zapis wyniku w rejestrach programowych |
| 270 |
\end{itemize} |
\end{itemize} |
| 271 |
|
|
| 272 |
Każdy stopień potoku jest wyraźnie wyodrębiony. Fazy komunikują się |
Każdy stopień potoku jest wyraźnie wyodrębniony. Fazy komunikują się |
| 273 |
pomiędzy sobą za pomocą dwutaktowych (master-slave) rejestrów wewnętrzych. |
pomiędzy sobą za pomocą dwutaktowych (master-slave) rejestrów wewnętrznych. |
| 274 |
\vmachine\ pozwala zaobserwować przepływ danych pomiędzy |
\vmachine\ pozwala zaobserwować przepływ danych pomiędzy |
| 275 |
fazami udostępniając wartości poniższych rejestrów. |
fazami udostępniając wartości poniższych rejestrów. |
| 276 |
|
|
| 286 |
|
|
| 287 |
\subsubsection{Założenia \SmArc\ i vmachine} |
\subsubsection{Założenia \SmArc\ i vmachine} |
| 288 |
|
|
| 289 |
Architektura \SmArc\cite{komorowski} w stosunku architektury SPARC została |
Architektura \SmArc\cite{komorowski} w stosunku architektury \SPARC\ została |
| 290 |
w celach dydaktycznych uproszczona. Zrezygnowano z implementacji |
w celach dydaktycznych uproszczona. Zrezygnowano z implementacji |
| 291 |
poniższych: |
poniższych: |
| 292 |
|
|
| 297 |
\item wewnętrzne rejestry procesora {\bf Y, WIM, TBR}, częściowo {\bf PSR} |
\item wewnętrzne rejestry procesora {\bf Y, WIM, TBR}, częściowo {\bf PSR} |
| 298 |
\end{itemize} |
\end{itemize} |
| 299 |
|
|
| 300 |
W stosunku do specyfikacji SPARCv8\cite{SPARCv8} do listy instrukcji |
W stosunku do specyfikacji \SPARC\cite{SPARCv8} do listy instrukcji |
| 301 |
architektury \SmArc\ nie wchodzą: |
architektury \SmArc\ nie wchodzą: |
| 302 |
|
|
| 303 |
\begin{itemize} |
\begin{itemize} |
| 315 |
|
|
| 316 |
\vmachine\ implementuje wszystkie instrukcje, jakie generuje |
\vmachine\ implementuje wszystkie instrukcje, jakie generuje |
| 317 |
assembler \spasm\ (opis w rozdziale \ref{sec:zalozenia:spasm}). |
assembler \spasm\ (opis w rozdziale \ref{sec:zalozenia:spasm}). |
| 318 |
Instrukcje zrealizowane w wirtualnej maszynie \SmArc\ są zgodne z |
Instrukcje zrealizowane w wirtualnej maszynie \vmachine\ są zgodne z |
| 319 |
opisem zawartym w specyfikacji SPARCv8 \cite{SPARCv8}. |
opisem zawartym w specyfikacji \SPARC\cite{SPARCv8}. |
| 320 |
|
|
| 321 |
|
\vspace{1mm} |
| 322 |
|
|
| 323 |
|
Warto zwrócić uwagę także na pewne różnice (pomijając wymienione |
| 324 |
|
wyżej ograniczenia) pomiędzy specyfikacjami \SPARC\cite{SPARCv8} |
| 325 |
|
a \SmArc\cite{komorowski}. Podczas realizacji projektu postanowiliśmy |
| 326 |
|
w tych przypadkach zastosować się do specyfikacji \SPARC. |
| 327 |
|
\begin{itemize} |
| 328 |
|
\item w architekturze \SmArc\ odwołania do pamięci o wielkości bajta/półsłowa |
| 329 |
|
odnoszą się do najmniej znaczącego bajta/półsłowa danego słowa, |
| 330 |
|
natomiast w architekturze \SPARC\ można odwołać się do |
| 331 |
|
dowolnego bajta/półsłowa. Moduł \vmachine\ stosuje się |
| 332 |
|
do drugiej specyfikacji. |
| 333 |
|
\item w architekturze \SmArc\ rozkazy przesunięć bitowych mają składnie: |
| 334 |
|
\begin{center} |
| 335 |
|
{\it shiftop}\verb! r[src1], imm13, r[dst]! |
| 336 |
|
\end{center} |
| 337 |
|
gdzie: |
| 338 |
|
\[ R[dst]\, \leftarrow\, imm13\;\; \mathit{shiftop}\;\; R[src1] \] |
| 339 |
|
Natomiast w specyfikacji \SPARC: |
| 340 |
|
\begin{center} |
| 341 |
|
{\it shiftop}\verb! r[src1], r[src2]/imm13, r[dst]! |
| 342 |
|
\end{center} |
| 343 |
|
gdzie: |
| 344 |
|
\[ R[dst]\, \leftarrow\, R[src1]\;\; \mathit{shiftop}\;\; R[src2]/imm13 \] |
| 345 |
|
Różnica polega na zamianie znaczenia poszczególnych argumentów |
| 346 |
|
źródłowych oraz na zezwoleniu na użycie rejestru w drugim |
| 347 |
|
argumencie. Moduł \vmachine\ stosuje drugą konwencję. |
| 348 |
|
\end{itemize} |
| 349 |
|
|
| 350 |
|
\vspace{1mm} |
| 351 |
|
|
| 352 |
\noindent Inne założenia symulatora \vmachine: |
\noindent Inne założenia symulatora \vmachine: |
| 353 |
\begin{itemize} |
\begin{itemize} |
| 354 |
\item 32 okien rejestrów, czyli w sumie 520 |
\item 32 okien rejestrów, czyli w sumie 520 |
| 355 |
\item separacja pamięć na dane i instrukcje. Obie posiadają osobne |
\item separacja pamięć na dane i instrukcje (Harward). |
| 356 |
przestrznie adresowe. Pamięć instrukcji |
Obie posiadają osobne przestrzenie adresowe. Pamięć instrukcji |
| 357 |
jest tylko do odczytu (poprzez rejestr {\bf PC}), natomiast |
jest tylko do odczytu (poprzez rejestr {\bf PC}), natomiast |
| 358 |
dostęp danych jest poprzez instrukcje typu {\it load} i {\it store}. |
dostęp danych jest poprzez instrukcje typu {\it load} |
| 359 |
|
i {\it store}. |
| 360 |
\item odwołania do pamięci są zawsze trafione (nie obserwujemy procesu |
\item odwołania do pamięci są zawsze trafione (nie obserwujemy procesu |
| 361 |
zapełniania pamięci cache i związanym z tym wstrzymaniem potoku) |
zapełniania pamięci cache i związanym z tym wstrzymaniem potoku) |
| 362 |
\item 256Kb pamięci danych |
\item 256Kb pamięci danych oraz 256Kb pamięci instrukcji |
| 363 |
\item 256Kb pamięci instrukcji |
\item słowo rozkazowe o wartości 0 zatrzymuje symulator |
|
\item słowo rozkazowe o kodzie o wartości 0 zatrzymuje symulator |
|
| 364 |
(po zakończeniu działania instrukcji znajdujących się już w potoku) |
(po zakończeniu działania instrukcji znajdujących się już w potoku) |
| 365 |
\end{itemize} |
\end{itemize} |
| 366 |
|
|
| 454 |
|
|
| 455 |
Dokładniejsze informacje dotyczące składni, formatu słów |
Dokładniejsze informacje dotyczące składni, formatu słów |
| 456 |
rozkazowych i kodowania rozkazów można znaleźć w specyfikacji |
rozkazowych i kodowania rozkazów można znaleźć w specyfikacji |
| 457 |
SPARCv8 \cite{SPARCv8}. Tam również znajdują się rozkazy procesora |
\SPARC\cite{SPARCv8}. Tam również znajdują się rozkazy procesora |
| 458 |
SPARC, których implementacja \SmArc\ nie obejmuje (inne rozkazy |
\SPARC, których implementacja \SmArc\ nie obejmuje (inne rozkazy |
| 459 |
arytmetyczne, rozkazy korzystające z koprocesora, itp.) |
arytmetyczne, rozkazy korzystające z koprocesora, itp.) |
| 460 |
|
|
| 461 |
|
|
| 535 |
\item małe i duże litery są rozróżniane za wyjątkiem nazw symboli specjalnych, |
\item małe i duże litery są rozróżniane za wyjątkiem nazw symboli specjalnych, |
| 536 |
\item rozkazy są pisane wyłącznie małymi literami, |
\item rozkazy są pisane wyłącznie małymi literami, |
| 537 |
\item symbole specjalne zaczynają się od znaku procentu ({\tt \%}) |
\item symbole specjalne zaczynają się od znaku procentu ({\tt \%}) |
| 538 |
\item etykiety i nazwy zaczynaja się od litery; po etykiecie musi być |
\item etykiety i nazwy zaczynają się od litery; po etykiecie musi być |
| 539 |
dwukropek (:). |
dwukropek (:). |
| 540 |
\item liczby mogą być w zapisie dziesiętnym lub szesnastkowym; w zapisie |
\item liczby mogą być w zapisie dziesiętnym lub szesnastkowym; w zapisie |
| 541 |
szesnastkowym liczby muszą być poprzedzone znakiem zera i litery 'x' |
szesnastkowym liczby muszą być poprzedzone znakiem zera i litery 'x' |
| 612 |
\item gtk-devel, glade-devel |
\item gtk-devel, glade-devel |
| 613 |
\end{itemize} |
\end{itemize} |
| 614 |
|
|
| 615 |
Procedurę budowania \SmArc\ można wykonać na przykład w poniższy sposób: |
|
| 616 |
|
\noindent Procedurę budowania \SmArc\ można wykonać |
| 617 |
|
na przykład w poniższy sposób: |
| 618 |
|
|
| 619 |
\begin{verbatim} |
\begin{verbatim} |
| 620 |
$ tar xzf smarc-XX.tar.gz |
$ tar xzf smarc-XX.tar.gz |