## 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 ![](https://i.imgur.com/LwQZjpG.png =640x) <small>Rok produkcji 1979. Zestaw instrukcji 32-bit. Architektura wew. 16-bitowa.</small> --- ### Tryb użytkownika ![m68k usermode](https://i.imgur.com/idGPeVU.png =574x) <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` ![](https://i.imgur.com/maoodJK.png =640x) --- ### 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 ![](https://i.imgur.com/cI24bdI.png =640x) <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 ![](https://i.imgur.com/On0d01t.png =500x) --- ### Ramki wyjątków ![](https://i.imgur.com/6fWEoGL.png =640x) --- ### 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 ![amiga-500](https://upload.wikimedia.org/wikipedia/commons/c/c3/Amiga500_system.jpg =640x) --- ### Diagram blokowy Amiga 500 ![a500-bd](https://i.imgur.com/7wL76RG.png =768x) --- ### Promień rastra ![raster-beam](https://i.imgur.com/xPCqfbD.png) 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 ![bitplanes](https://i.imgur.com/0amM3SF.png =768x) <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. ![](https://i.imgur.com/CJEmfuj.png =480x) ![](https://i.imgur.com/gkFPXKl.png =480x) --- ### 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 ![](https://i.imgur.com/CldOuOs.png =600x) --- ### 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}]"}
    528 views
   Owned this note