Celem przedmiotu jest wprowadzenie słuchaczy do budowy i zasad działania komputerów z punktu widzenia programisty. Studenci nabędą wiedzy z zakresu programowania niskopoziomowego. Po zakończeniu przedmiotu będą rozumieć:
* reprezentację programów i danych na dysku i w pamięci komputera,
* wpływ architektury komputera na wydajność aplikacji,
* mechanizmy sprzętowe używane do implementacji systemów operacyjnych,
* jak unikać pisania programów podatnych na ataki.
##### Program
1. Reprezentacja danych
* reprezentacja danych w pamięci komputera
* arytmetyka na liczbach binarnych w systemie uzupełnień do dwóch
* arytmetyka na liczbach zmiennopozycyjnych standardu IEEE754
* problemy wynikające z ograniczeń reprezentacji maszynowych typów numerycznych
2. Programowanie niskopoziomowe
* reprezentacja pośrednia programów (kod trójadresowy, graf przepływu sterowania)
* translacja konstrukcji języka C do asemblera procesorów x86-64 (wyrażenia, instrukcje sterujące, typy rekordowe i tablicowe)
* konwencja wołania procedur i organizacja stosu wywołań (ABI)
3. Konsolidacja i ładowanie
* proces kompilacji, konsolidacji i ładowania programów (sekcje, relokacje, układ pamięci)
* reprezentacja programów – format plików ELF
* biblioteki i konsolidator dynamiczny (ld.so)
4. Podatności programów na ataki
* błąd przepełnienia stosu
* wykorzystywanie podatności (wstrzykiwanie kodu, programowanie zorientowane na powroty)
* sprzętowe i programowe techniki zapobiegania podatnościom (ASLR, W^X)
5. Pamięć masowa i operacyjna
* hierarchia pamięci i lokalność dostępów
* organizacja pamięci operacyjnej (czasu dostępu, protokół DDR)
* dyski magnetyczne (multi-zone recording, buforowanie)
* dyski półprzewodnikowe (odśmiecanie bloków)
* komunikacja procesora z urządzeniami peryferyjnymi (przerwania, MMIO, DMA)
6. Pamięć podręczna
* organizacja pamięci podręcznej (zbiór, blok, znacznik, bity dodatkowe)
* polityka wymiany bloków (LRU)
* polityka zapisu (write-back, write-through)
* analiza i optymalizacja programów pod kątem lokalności dostępów
7. Translacja adresów i pamięć wirtualna
* motywacja: zarządzanie pamięcią, izolacja, leniwe sprowadzanie danych
* przestrzeń adresowa i mechanizm translacji adresów
* zbiór roboczy i rezydentny, błąd strony
* hierarchiczna reprezentacja tablicy stron
* przyspieszanie procesu translacji dzięki TLB
* przełączanie przestrzeni adresowych
* problemy na styku translacji adresów i pamięci podręcznej (homonimy i synonimy)
8. Wpływ mikroarchitektury procesora na wydajność programów
* przetwarzanie superskalarne (procesory Out-of-Order, spekulacja)
* modelowanie obliczeń grafem przepływu danych
* przewidywanie skoków (BHT i BTAC)
##### Zajęcia
Większość zajęć do przedmiotu będzie prowadzona w postaci ćwiczeń z deklaracjami. Pozostałe to pracownie programistyczne:
* programowanie w asemblerze x86-64
* odpluskwianie programów z użyciem [gdb](https://www.gnu.org/software/gdb/)
* przeprowadzanie ataków na podatne oprogramowanie
* optymalizacja programów w języku C
##### Zmiana od roku akademickiego 2021/2022
**W związku ze zmianą wymiaru godzinowego, od roku 2021/2022 zmienia się liczba punktów ECTS z 6 do 8.**