## Struktura jądra Unix 2021
### Wykład 1: Sprzęt
###### tags: `sju21` `presentation`
---
### Pracownia programistyczna
W trakcie zajęć każdy ma zrobić malutki dyskowy system operacyjny bazowany na FreeRTOS. Jądro załaduje i wykona powłokę, w której będzie można wpisywać polecenia ładowane z nośnika danych.
Do zaprogramowania będą między innymi: sterownik terminala, warstwa plików, wywołania systemowe, itp.
---
### Jaki sprzęt wybrać?
* architektura 32-bit lub 64-bit
* toolchain: `gcc` + `binutils`
* deterministyczny symulator
* możliwość debugowania przy pomocy `gdb`
* prosty do zrozumienia
* dobra dokumentacja
* znajomy dla prowadzącego przedmiot
<small>**Cel:** Niedużym nakładem pracy student powinien zrozumieć sprzęt w trakcie zajęć.</small>
---
### Czego potrzebujemy?
* kilkaset KB pamięci fizycznej
* UART: komunikacja szeregowa
* timer: odmierzanie czasu, wywłaszczanie
* CPU: tryb jądra i użytkownika
* nośnik danych
---
### Co fajnie byłoby mieć?
* zegar czasu rzeczywistego
* karta sieciowa
* ekran, klawiatura, mysz
* CPU: stronicowanie
---
### Kandydaci ?
* _x86_, _arm_: zbyt złożone (dokumentacja :scream:)
* _PC_, _Raspberry_: j.w.
* _Arduino_: zbyt prymitywne
* _RISC-V_: prosty, ale wsparcie `QEmu` :-1:
* _USB_, _SD card_, _Wi-Fi_: zbyt skomplikowane
* _QEmu_ ma problemy z determinizmem
---
### Co chciałbym mieć?
* [Renode](https://renode.io/) jest deterministyczny (!)
* _RISC-V_: prosty, czysty, krótka dokumentacja
* płytka rozwojowa z prostymi peryferiami
* łatwo dostępny prawdziwy sprzęt
* krótka i zwięzła dokumentacja
* możliwa interakcja przy pomocy ekranu
---
### Czemu Amiga? (cz. 1)
1. Symulator: `fs-uae`
- deterministyczny, a nawet _cycle-exact_
- można dopisywać _hyper-calls_
- posiada interfejs do `gdb`
2. Procesor: `m68k`
- wspierany przez `gcc`, `binutils`, `gdb`
- prostszy niż `x86`, ale nie `risc-v`
- ma wszystko czego potrzebujemy
---
### Czemu Amiga? (cz. 2)
3. Sprzęt:
- w latach '80 dużo prostszy niż dziś
- serial, parallel, 6 czasomierzy, RTC
- stacja dyskietek 3½ cala
- dysk twardy IDE (tryb PIO-0)
- karta sieciowa (zgodna z NE2000)
- klawiatura, mysz, joystick
- wyświetlanie grafiki i sprajty
- odgrywanie dźwięku 8-bit
---
## Procesor 68000

<small>Rok produkcji 1979. Zestaw instrukcji 32-bit. Architektura wew. 16-bitowa.</small>
---
### Tryb użytkownika

<small>**Uwaga:** Porządek bajtów w pamięci **Big-Endian**!</small>
---
### Lista instrukcji
* [MC68000 Instructions timing](http://linas.org/mirrors/www.nvg.ntnu.no/2002.09.16/amiga/MC680x0_Sections/mc68000timing.HTML)
* zajmują parzystą liczbę bajtów
* instrukcje podobne do x86-64
(`move`, `lea`, `cmp`, `add`, ...)
* sufiks `.w` (`word`, 16-bit), `.l` (`long`, 32-bit)
* czasami trochę inne mnemoniki
(`call` → `jsr`, `jne` → `bne`, `sal` → `asl`, ...)
* rejestry adresowe są trochę inne niż danych
* rejestr `CCR` zawiera flagi `XNCVZ`
---
### Karta instrukcji z `M68000PRM`

---
### Operandy instrukcji
```=
move.w d3, a0 # a0 := extl(d3);
move.b #10, d1 # d1 := d1 & ~255 | 0x0a;
move.l (sp)+, d3 # d3 := MEM[sp]; sp += 4;
move.w 4(a0,d3.l), d0 # d0 := d0 & ~65535 | MEM[a0+d3+4];
move.l label1, d2 # d2 := MEM[label1]
move.w label2(PC), d3 # d3 := MEM[PC+label2]
# sp := sp - 12;
# MEM[sp] := d2, MEM[sp+4] := d3, MEM[sp+8] := a1
movem.l d2-d3/a1,-(sp)
```
<small>**Uwaga:** Nie wszystkie instrukcje akceptują wszystkie rodzaje operandów!</small>
<small>**Ważne:** Wskaźnik stosu i licznik instrukcji są zawsze parzyste!</small>
---
### Rejestr stanu procesora

<small>Interesują nas wyłącznie bity: $S$, $I_0$, $I_1$, $I_2$</small>
---
### Tryb uprzywilejowany
* Osobny rejestr stosu użytkownika i nadzorcy.
* Kiedy przyjdzie przerwanie albo zdarzy się wyjątek przetwarzania instrukcji, procesor odkłada na stos nadzorcy ramkę w określonym formacie.
* Uprzywilejowany `VBR` (ang. _Vector Base Register_) wyznacza początek tablicy wskaźników na procedury obsługi, a numer wyjątku / przerwania wyznacza indeks.
---
### Wektor wyjątków

---
### Ramki wyjątków

---
### Przerwania zewnętrzne
* Procesor odkłada na stos jądra ramkę z `PC` i `SR`,
a `RTE` (ang. _return from exception_) ściąga.
* Programista musi zachować / odtworzyć rejestry.
* Mają priorytety $1..7$ i mogą się zagnieżdżać.
* Jeśli $SR.I_{2..0}=m$, to przerwania o numerze $\leq m$ są zamaskowane.
* Przed rozpoczęciem obsługi przerwania $n$, procesor ustala $SR.I_{2..0}$ na $n$.
---
### Pułapki i wyjątki
* Przed rozpoczęciem obsługi procesor **nie zmienia** bitów $SR.I_{2..0}$.
* W zależności od informacji skojarzonej z wyjątkiem inny format ramki stosu. Na podstawie jej zawartości jądro identyfikuje przyczynę usterki.
* Do realizacji wywołań systemowych służy instrukcja `trap #n`, gdzie $n = 0..15$.
<small>**Uwaga!** Próba przeczytania słowa spod nieparzystego adresu kończy się _Address Error_.</small>
---
### ABI i konwencja wołania
* Wszystkie argumenty przekazujemy przez stos.
* Rejestry _callee-saved_ to `d2-d7/a2-a7`.
* Rejestry tymczasowe to `d0-d1/a0-a1`.
* Wynik jest zwracany przez `d0`.
<small>**Komentarz:** Pewne odmiany ABI dopuszczają, by przekazywać część argumentów przez rejestry tymczasowe. </small>
---
### Co pominąłem?
* **Floating Point Unit**: nie przyda się nam.
* **Memory Management Unit** i format tablicy stron.
* Rozszerzenia oferowane przez następców 68000
tj. 68010, 68020, 68030, 68040.
* Omówienie instrukcji uprzywilejowanych.
---
## Amiga

---
### Diagram blokowy Amiga 500

---
### Promień rastra

Wyświetlanie na kineskopie. Wiązka elektronów skanuje luminofor. Odświeżanie 50Hz dla [sygnału PAL](http://martin.hinner.info/vga/pal.html).
<small>Źródło: [Classic Graphics Primitives](https://wiki.amigaos.net/wiki/Classic_Graphics_Primitives)</small>
---
### DMA
Układ $Agnus$ ma dostęp tylko do pamięci $CHIP$.
Zawiera w sobie $COPPER$ i $BLITTER$.
Zajmuje się transferem:
- danych bitplanów (max. 6)
- danych duszków (ang. _sprite_) (max. 8)
- instrukcji Copper'a (co 8 pikseli rastra)
- danych PCM kanałów dźwiękowych 4 x 8-bit
- ścieżek dyskowych (ze stacji dyskietek)
<small>Kontrolowane przez rejestr [DMACON](http://amiga-dev.wikidot.com/hardware:dmaconr).</small>
---
### Organizacja bitplanów

<small>Rejestry kolorów przechowują RGB, po 4 bity na składową.</small>
---
### BLITTER
Realizuje dowolną funkcję logiczną $f(a,b,c)$
(podaną w DNF) na słowach 16-bitowych.
Potrafi rysować linie i wypełniać obszary.


---
### COPPER
Umożliwia reprogramowanie układów specjalizowanych
za pomocą listy prostych [instrukcji](http://amiga-dev.wikidot.com/hardware:copins):
- `MOVE` zapisuje wartość do rejestru układów specjalizowanych
- `WAIT` czeka na określoną pozycję promienia rastra
- `SKIP` pomija następną, jeśli przekroczono pozycję
Często stosowany do realizacju efektów specjalnych np. split-screen, wymiana kolorów palety.
<small>**Uwaga!** Instrukcje z listy zaczynają się wykonywać automatycznie z początkiem rastra.</small>
---
### Mapa pamięci
```
$000000 - $07ffff 512 kB chip RAM
$080000 - $0fffff 512 kB extended chip RAM ("Big/Fat Agnus")
$100000 - $1fffff 1 MB extended chip RAM ("ECS Agnus")
$200000 - $9fffff 8 MB AUTOCONFIG space ("fast RAM")
$a00000 - $beffff reserved
$bfd000 - $bfdf00 8520-A
$bfe001 - $bfef01 8520-B
$c00000 - $d7ffff 1.5 MB internal expansion "pseudo fast RAM"
$d80000 - $dbffff 256k internal explansion "pseudo fast RAM"
$dc0000 - $dcffff real time clock
$dff000 - $dfffff custom chip registers
$e00000 - $e7ffff reserved
$e80000 - $efffff temp. AUTOCONFIG space
$f00000 - $fbffff 256k ROM (since OS version >= 2.0)
$fc0000 - $ffffff 256k ROM
```
<small>Pełną wersję mapy pamięci można znaleźć [tu](https://www.amigacoding.com/index.php/Amiga_memory_map).</small>
---
#### Przerwania układów specjalizowanych

---
### Przerwania (c.d.)
Odwzorowane w priorytety przerwań procesora.
Pod jedno przerwanie procesora podpiętych
wiele przerwań sprzętowych.
* Włączane / wyłączane przez rejestr [INTENA](http://amiga-dev.wikidot.com/hardware:intenar)
* Po obsłużeniu przerwania należy zgasić
bit zgłoszenia w [INTREQ](http://amiga-dev.wikidot.com/hardware:intreqr)
* Można wywołać sztucznie poprzez zapis
do `INTREQ` (ang. _software interrupt_)
---
### Co pominąłem?
* Organizacja sprajtów w pamięci
* Komunikacja przez port szeregowy i równoległy
* Czasomierze układów CIA
* Odczytywanie zdarzeń z klawiatury
* Odczytywanie pozycji wskaźnika myszy
* Fizyczna organizacja danych na dyskietce
* Obsługa stacji dysków
{"metaMigratedAt":"2023-06-15T20:11:28.783Z","metaMigratedFrom":"YAML","title":"SJU21 Wykład 1","breaks":true,"slideOptions":"{\"theme\":\"simple\",\"transition\":\"fade\"}","contributors":"[{\"id\":\"29ff1337-0f63-4180-ac33-8fbf82b5226e\",\"add\":11805,\"del\":2383}]"}