# Notatki SO
## Wykład 1
Procesor może w różny sposób adresować, od nas zależy jaki tryb adresowania na Systemie Operacyjnym wybierzemy
Procesor jest skomunikowany z pamiecia za pomoca 2 magistral - linii adresowych i linii danych, sa tez linie sygnalowe (control bus)
Wazna jest szerokosc magistrali adresowej
Skad wiadomo ile linii adresowych udostępnia nam procesor? - Nie ma stałej liczby, procesor mówi nam o tym, instrukcja CPUID informuje nas o tym.
MAXPHYADDR - ile pamieci jestesmy fizycznie w stanie zaadresować - to jest ważne dla twórcy systemu operacyjnego
To, że mamy magistrale adresową 32-bit nie znaczy, że musi zostać ograniczona do 4GB. Zależy to od wysiłku programisty
Dlaczego można adresować wiecej pamięci niż procesor ma adresów liniowych - odpowiedzialna jest za to abstrakcja, odpowiadają za to adresy logiczny i liniowy
### Adresy
Adres fizyczny - adres wskazujący na położenie komórki w przestrzeni pamięci na kości RAM, musi wskazywać na istniejącą komórkę
Adres liniowy - adres w procesie, przestrzen adresowa danego procesu w warstwie abstrakcji
Procesor musi umożliwiać zamienianie adresu liniowego na adres fizyczny
Rejestry 16-bitowe, a adres jest 20-bitowy, do tego sluży mechanizm adresu logicznego
Adres logiczny - reprezentacja adresu liniowego przy pomocy identyfikatorow dostepnych w procesorze np. selektora i offsetu
Rejestr segmentowy - selektor
Zlozenie selektora i jakiegos innego rejestru np EIP daje adres logiczny
Złożenie dwóch rejestrów daje nam adres logiczny
EIP - przesunięcie w danym segmencie
Złożenie adresu efektywnego i selektora daje adres logiczny
Jest mechanizm translacji na adres liniowy a potem na fizyczny
### Tryby pracy procesora
Tryb rzeczywisty - używa segmentacji
Odpala sie w trybie 16-bitowym
Jeśli jest UEFI - odpala sie w trybie chronionym 32-bitowym
Tryb chroniony - wymaga segmentacji, umożliwia stronicowanie
W 16-bit segmentacja poprzez rejestr segmentowy, umożliwiało uruchamianie kilku procesów na raz, ale nie dzialalo ze wzgledu na podkradanie pamieci innych procesow
Za pomoca tych 2 selektroow jestesmy w stanie podzielic pamiec na segmenty tak, aby kazdy proces mial swoja przestrzen adresowa w pamieci
Przez to, że w trybie rzeczywistym możliwe bylo grzebanie w przestrzeni adresowej innego procesu stworzono tryb chroniony
Procesor pilnuje tego, czy jeden proces nie narusza pamieci drugiego procesu ( fizycznej )
Oprocz segmentow pamieci i trybow adresowania istnieje mapa pamięci, jest zwiazana z kazdym oprogramowaniem, ktore istnieje w systemie - trzeba ja utworzyc, jest to przewodnik po obszarach, ze uzytkownik nie powinien z czegos korzystac zapisywac, czyli np ze jest tablica wektorow przerwan
W UEFI mozna nadpisywac funkcje systemowe, wiec trzeba powiedziec ze tam jest UEFI, bo inaczej cos sie popsuje
Wady trybu rzeczywistego:
- modyfikowanie adresow systemowych
- zdolnosc sterownikow do przejmowania informacji
- manipulowanie strukturami danych systemowych do ukrycia procesu
- modyfikowanie programow w celu zmiany przeplywu sterowania
### Tryb chroniony z segmentacją
GDT - Global Descriptor Table, zawiera deskryptory segmentu
Wystepowanie tablicy GDT definiuje rejestr segmentowy GDTR, tablica wystepuje w pamieci fizycznej
W rejestrze GDTR jest adres liniowy
## Wykład 2
GDT - posiada 8096 wpisow zdefiniowanych 13 bitowym selektorem, kolejne bity to privilage level i GDT/LDT
selektor wskazuje na ktory wpis w tablicy GDT wskazujemy
Segment descriptor jest 64-bitowym wpisem w tablicy GDT - 8 bajtow
Segment descriptor jest rozbity na adres bazowy, czyli to co dodaje sie do EIP i na segment limit, ktory okresla maksymalny rozmiar segmentu
Musi byc mapa zajetosci pamieci - informacja ktore obszary sa wolne a ktore zajete
Programista dostarcza obsluge wyjatkow
W momencie kiedy odwoluje sie do nie swojego segmentu w pamieci jakis program nalezy wywolac wyjatek i wlasnie programista go definiuje
Tryb chroniony - chronimy zasoby systemowe, sa poziomy uprzywilejowania tryb uzytkownika i systemowy
W jaki sposob systemy omijaja obowiazkowa segmentacje? Wszystkie limity w segmencie uzytkownika i kodu pokrywaja caly pamiec wiec z dowolnego miejsca mamy szanse wejsc w dowolna pamiec
W 32-bit procesorach w momencie restartu tryb podstawowy w ktorym startujemy jest 16-bitowy
Tworca systemu operacyjnego - funkcja loadera systemu jest przelaczenie z 16-bit na 32-bit, musi wtedy zbudowac tablice GDT, ustawic rejestr GDTR i dokonac przelaczenia na tryb chroniony
W 64-bit trybem natywnym jest tryb 32-bit i tablica GDT jest pod adresem 0
Czemu nie chcemy korzystac z segmentacji?
Przy uruchamianiu wielu zadan dochodzi do fragmentacji pamieci - 2GB wolnego miejsca w pamieci fizycznej i nie mozna uruchomic nic nowego, bo przerwy miedzy kolejnymi segmentami sa zbyt male i nie wystarczaja - co druga komorka jest zajeta - polowa zajeta a druga polowa niewykorzystana
Co zrobic zeby wyeliminowac fragmentacje?
1. Zapuscic proces porzadkujacy, scalanie segmentow obok siebie - trudne
2. Stronicowanie
Istnieja rejestry, do ktorych uzytkownik nie ma dostepu - rejestry sterujace m.in CR3 - control register 3, CR2 - w przypadku Page Fault informacja o adresie liniowym w procesie ktory ten blad spowodowal, CR0 - zawiera informacje - wlaczenie stronicowania, ma bit WP - czy mozna zapisywac do stron czy nie i ma bit PE przelaczajacy na tryb chroniony, ale dopiero wtedy kiedy wszystkie struktury sa ustawione, bit PG umozliwia wlaczenie PAGING - stronicowania
## Tryb chroniony z segmentacja i stronicowaniem
Podzielić coś na co bedzie wskazywal segment na pewne obszary o stałym obszarze
Powstaje tu rozgraniczenie adresu fizycznego i liniowego

CR3 - adres bazowy - 20 pierwszych bitow + same 0 do konca
Tam pod tym adresem jest katalog stron
Katalog stron ma wielkosc 4kb - 2^10 * 4
Zawiera ona 32-bitowe wpisy - 4 bajty, ktore opisuja tablice stron
Z PDE odczytujemy 20 bitow pierwszych i ona wskazuje na tablice stron
Adres bazowy strony to pierwsze 20 bitow - dodajemy do niego offset i mamy adres fizyczny
W przestrzeni adresow fizycznych kolejne strony nalezace do danego segmentu nie musza wystepowac po sobie, wystarczy zmienic wpis w katalogu stron
Do kazdego procesu jest przypisany inny CR3 przez co te pamieci sie nie klaszują
## Wykład 3
PFN - number ramki strony - obszar w pamieci fizycznej przydzielony gdzie strona moze rezydowac
Katalog ramek stron - przechowuje info ktore szufladki sa zajete a ktore nie
System operacyjny - ktore ramki stron sa wolne, z katalogu szuka pierwsza wolna szufladke i dokonuje wpisu w katalogu i tablicy stron
Czesc stron nie jest w pamieci fizycznej, ale rezyduje na dysku - jest przedluzana o pamiec dyskowa, bo nie zawsze starczy miejsca w pamieci fizycznej
Na dysku istnieje plik wymiany - jest tam kod zrodlowy naszego procesu, jest to zablokowane, nie da sie ich modyfikowac, jesli uzytkownik bedzie chcial uzyskac dostep do strony jest robiony "swap" - wyszukanie szuflady, ktora najdawniej byla uzytkowana, to co w niej bylo idzie do archiwum, a to co ma byc dostepne teraz jest przenoszone do tej szuflady
Bit P - czy strona jest w pamieci
Bit U/S - czy zawiera dane uzytkownika czy dane systemowe
Bit A - czy strona byla uzytkowana, co jakis czas zmienia bit na 0, kiedy nie byla dlugo uzytkowana, robi to system operacyjny
Dla zagospodarowania wiekszej pamieci niz 4GB powstal mechanizm PAE

Na plycie glownej zostala poszerzona magistrala adresowa i zostal zwiekszony rejestr CR3 - maksymalna adresacja 52-bitowa
Dodano tablice wskaznikow na katalog stron
Rozmiar strony dalej wynosi 4kb
### Dla procesorow 64-bitowych:
Adres liniowy moze byc 64-bitowy
Dodano page map - PML 4

Narazie uzywa sie 48 bitow, koncowe bity sa albo zerowane albo ignorowane, powinny byc ustawione na 1
Tablica GDT jest identyczna dla wszystkich procesow
Czy istnieje mozliwosc ze strona w ksiazce A i B jest taka sama i czy mozna udawac ze jest ona dostepna dla 1 i 2 procesu jednoczesnie - tak
W odpowiednich tablicach dla 1 i 2 procesu
Programista ma dostep do 2GB pamieci, poniewaz przestrzen liniowa jest podzielona na 2 pule - przestrzen uzytkownika i przestrzen systemu - kernela
Kazdy proces w 32-bit ma swoje wlasne 4GB pamieci w tym 2GB sa wspoldzielona przestrzenia kernela a 2GB jest przestrzenia na dane
W momencie loadera systemu za pomoca bcdedita 3gb mozemy zmienic podzial 3gb dla usera 1gb dla kernela
Dziala to tak samo na windowsie i linuxie
W przestrzeni kernela jest jadro systemu operacyjnego
Pod adresem C sa umieszczane tablice procesow
Sa pewne strony w systemie ktore nie moga byc stronicowane (zrzucone na dysk)
Sa czesci wspolne wiec np. nie mozna zrzucac Boot Driverow, HAL itp.
Przy tworzeniu katalogow stron i tablic stron polowa katalogow stron jest wypelniona ta sama wartoscia dla wszystkich procesow
## Wyklad 4
### Poziomy ochrony
W procesorach intela sa 4 poziomy uprzywilejowania
Przy wywolaniu funkcji systemowych:
Callgate - punkt w systemie ktory upowaznia przejscie z 1 poziomu uprzywilejowania na 2
Aktualnie uzywa sie raczej poziomu 0 i 3, posrodkowe poziomy nie sa wazne
W tablicy GDT oprocz opisu segmentow nalezacych do procesu znajduja sie deskrybtory opisujace call gaty
Deskryptory sa upubliczniane przez tworce systemu operacyjnego - mowi jednoznacznie pod selektorem X jest deskryptor bramy, czyli trzeba w rejestrze segmentowym podac wartosc X
Przy odwolaniu nastepuje sprawdzenie co chcemy z tym zrobic
W bramie odczytywany jest nowy segment selektor, wskazujacy na opis segmentu gdzie jest kod bazowy, a z offsetu przesuwam sie w kodzie bazowym

Przez call gata nasz kod dostanie nizszy/wyzszy poziom uprzywilejowania
Na stosie odklada sie parametry - jesli sie odlozy wiecej lub mniej - w funkcji jest okreslone ile parametrow musi byc, jezeli bedzie inaczej to wyrzuci wyjatek
Jest stos uzytkownika i stos systemowy - nie mozna nic podmieniac w trakcie wykonywania funkcji
Deskryptory bram sa po to zeby kod uzytkownika nie mogl modyfikowac kodu jądra systemu - problem to udostępnienie funkcji systemowych np. (READ/WRITE) uzytkownikowi - powinien nad tym panować system operacyjny - po to są poziomy dostępu
Call Gate - deskryptor zawierający wskaźnik na deskryptor w tablicy GDT
Offset - gdzie w segmencie kodu jest procedura odpowiadajaca za czynnosc, ktora chcemy wykonac
### Przerwania
Bylo mowione ze tablica wektorow przerwan jest w pamieci 0 - tutaj nie wiadomo gdzie ona wystepuje i nazywa sie tablica deskryptorow przerwan - od tego jest rejestr IDTR, w IDT jest Interrupt Gate, ma wielkosc 256 wektorow
Wszystkie przerwania trafiaja w jedno miejsce - wrapper
Tutaj jest przerwanie 2E, ktory jest unikalnym wejsciem dla wszystkich funkcji systemowych - wrapper rozpoznaje co jest w EAX i kieruje do kodu systemowego
Mechanizm przelaczania zadan - zmienianie zawartosci rejestrow - uruchomiony na zasadzie funkcji systemowej - ktore zadanie ma byc aktualnie wykonywane, a to aktualne gdzie ma byc przechowane - gdzie rejestry, od systemu operacyjnego miejsce przelaczenia, a funkcje systemowe to robia - procesor
W tablicy deskryptorow jest deskryptor opisu zadania, zawiera wskazania na to gdzie zadanie ma rejestry, gdzie przechowywac
Na aktualne zadanie jest rejestr Task Register
Napisanie systemu polega na tym, jak dziala procesor i jakie struktury musze mu dostarczyc zeby dzialal dobrze
Bramki wywołań i bramki przerwań to oba typy bramek w systemie operacyjnym komputera, które są używane do obsługi przerwań. Główną różnicą między nimi jest sposób obsługi przerwań. Bramka wywołania służy do przekazywania sterowania do określonej lokalizacji w pamięci, zwykle w celu uruchomienia podprogramu lub wywołania funkcji. Z drugiej strony bramka przerwania służy do przekazywania sterowania do procedury obsługi przerwania, gdy wystąpi przerwanie. Bramka przerwań służy do przerwania sprzętowego, a bramka wywołania służy do przerwania programowego.
Tworzenie nowego procesu to generowanie nowego rejestru CR3, generowanie tablic - czyli opisanie 4GB pamieci liniowej - musimy to zrobic sami jako tworcy systemu operacyjnego i podzielic na 2GB/2GB
Na poczatku te tablice moge byc puste - one sie uzupelniaja wraz z wywolywaniem funkcji
CR2 - adres gdzie w procesie wystapil blad - adres liniowy i gdzie dalej kontynuowac program po page swapie
Stronicowanie jest wazne pod katem wydajnosci
Z privilege level korzysta sie w przerwaniach i funkcjach systemowych
Jak zabezpieczyc kod systemowy - skad wiadomo ze dana strona nalezy do kodu systemowego - mechanizm sprowadza sie do bitu U - User/Supervisor - w tablicach i katalogach stron jest ustawiany na bit 1
Trzeba rozpatrywac system operacyjny w formie wartsw

### Oprogramowanie układowe
BIOS - oprogramowanie ktore umozliwia komunikacje miedzy sprzetem a systemem operacyjnym - jest to oprogramowanie ukladowe
Procesor musial byc ustawiony w tryb 16-bitowy

## Wyklad 5
Caly konczy sie - rolą jest załadowanie rekordu ladujacego MBR pod pewien stały adres - odczytanie z dysku jakis sektor i dane ktore na dysku sa umieszczone znajda sie pod adresem 7C00
Rekord ladujacy powinien zaladowac prawidlowy system operacyjny i potem konkretna czesc systemu to jest loader systemu operacyjnego - loader tworzy tablice gdt i przechodzi na tryb chroniony
BIOS pelni 4 funkcje:
- test komponentow
- obsluga dyskow twardych
- wywolywanie funkcji w interfejsach
Po co UEFI:
- Wyeliminowanie Biosu
- Uruchamianie systemu w trybie 32-bit
W efi w konsoli trzeba wybrac loader systemowy, tworzymy plik poza systemem o nazwie i wgrywamy go w okreslona lokalizacje w przeciwienstwie do BIOS, ktory system w ktorej kolejnosci i w opraciu o jaki loader systemowy jest generowany
UEFI definiuje sposob wytwarzania aplikacji
OVMF - open virtual machine format - zastosowanie pakietu pozwala na wytwarzanie UEFI ktore jest dodawane jako modul do maszyn wirtualnych
### Start UEFI
Jest efi shell
Startuje w trybie chronionym 32-bit, jest wlaczona segmentacja bez stronicowania, do momentu zaladowania loadera systemowego

Jesli chcemy wlaczyc stronicowanie to loader to robi
1. Faza - test komponentow
2. Inicjalizacja urządzeń dołączonych do płyty głównej
Jezeli urzadzenie jest zainstalowane to ma sloty danych i jaki jest producent urzadzenia PCI
UEFI bedzie wiedzialo z jakim sprzetem ma do czynienia
3. Sa ladowane sterowniki dla zainstalowanych urzadzen
Jesli urzadzenie nie ma sterownika to nie jest oblsugiwane
Jezeli dane bylyby na dyskach innych niz FAT to UEFI nie ma takiego sterownika do odczytywania z nich danych
4. Proba odczytu danych - loaderow, tablicy GPT, jesli sie uda to nasz plik .efi zostanie zaladowany do pamieci i powinien sie zaczac wykonywac
W innym przypadku przechodzimy do fazy przechodzenia do UEFI, bo nie odnaleziono zadnego z urzadzen masowych i pliku .efi - otwierany jest EFI shell
Nie mozna tu wgrywac dowolnego softwaru - wszystkie fazy moga byc oparte o schemat zabezpieczen - secure boot - nie mozemy zmienic lancucha, kazdy ladowany element jest podpisywany i nastepuje weryfikacja przez element laduajcy
Jesli bysmy uruchomili loader systemowy i probowali go wgrac to nie mamy mozliwosci dostania sie bo nie mamy mozliwosci zainstalowania oprogramowania
Jezeli zmienimy w istniejacym to nie zostanie zaladowane bo zostanie wykryta zla suma kontrolna
Secure boot jest czesto w telefonach komorkowych
Kazdy element firmware laduje do pamieci, po zaladowaniu do pamieci sprawdza jego sume kontrolna w oparciu o funkcje skrotu
Jesli sie nie bedzie zgadzac to nie pozwoli na dalszy start, w momencie proby wymiany go przez funkcje UEFI, to w momencie wgrania przed wymiana nastepuje sprawdzenie funkjci skrotu
Ten lancuch sprawdzajacy to secure boot, nie mozna podmienic pliku bez podpisania go przez wlasciciela/tworce, nie mozna podmienic przez nieautoryzowane oprogramowanie ladujace

Po uruchomieniu UEFI dostajemy wskaznik na tablice UEFI i dostajemy potem wskazniki na funkcje systemowe i UEFI BOOT Service Table
Przed bootowaniem mamy kontrole nad wszystkimi tablicami, w momencie kiedy przejmuje kontrole system operacyjny to tracimy kontrole nad tablica z uslugami bootowania, zeby zwolnic pamiec, jezeli przejdziemy ze stronicowaniem, adresy moga umknac (UEFI jest odpalany w 32-bit bez stronicowania) i te uslugi ktore sa wbudowane
W momencie kiedy przekazujemy informacje do swojego SO to system powinien miec swoje funkcje systemowe a nie polegac na tymco dalo UEFI
DLatego sa zwlaniane, bo to niebezpeiczne, nie wiadomo co wymyslil programista, sam to musi obsluzyc
Wszystko co mamy w UEFI jest oparte o uchwyty. Uchwyt jest skrocona reprezentacja pewnej struktury. Kazda zmienna jest identyfikowana za pomoca GUID 128-bit
Kazdy inny dysk/partycja ma inny GUID, po to zeby w latwy sposob identyfikowac uslugi i nie pomylic sie w ich wyznaczaniu
Istnieje baza danych uchwytow i bedzie mialo swoj nr GUID
Protokoly - opisuja wszystko w typie inta, sterownik - plik, ktory ma okreslona strukture i podstawowa struktura jest operowanie funkcji do obslugi danego urzadzenia/obiektu
Protokol do obslugi danej partycji - oferuje logike odczytu z danej partycji
Obslugiwanie protokolow jest trudne jest GNU UEFI, ale ciagle trzeba sie w tym grzebac
### Urzadzenia pamieci masowej
Struktura dysku musi byc podzielona na 2 obszary - czesc podzielona na metadane(informacje gdzie sa dane) oraz jego rzeczywiste dane
SO traktuje plik jako bajty, tworca i uzytkownik musza okreslic jak to odebrac
Musza istniec scisle sprecyzowane metadane
System plikow - sposob sformatowania metadanych i nadania im okreslonego polozenia na dysku
Na dysku oprocz bajtow opisujacych plik znajduja sie dane o obszarach gdzie znajduja sie pliki, metadane o systemie plikow, metadane o partycjach
W momencie keidy chcemy powiekszyc plik o jakies dane - definiuje sie wieksze bloki - te miejsce niewykorzystane w blocku to slack
Partycja – rodzaj woluminu, wydzielony logiczny obszar dysku twardego, który może być sformatowany przez system operacyjny w odpowiednim systemie plików.

Dane przesylane sa w okreslona czestotliwoscia, a biegnace obok siebie sciezki powoduja zaklocenia
Po zmianie na szeregowosc przyspieszylo przesylanie danych
ATA - wazne okreslenie
Ata oprocz komend defiuniuje w jaki sposob sie komunikuje, definiuje za pomoca pewnych liczb numery portow pod ktorymi mozemy z danym dyskiem sie komunikowac
Komunikacja z dyskiem jest za pomoca in, out
Dane moga byc przesylane w dwoch trybach:
- PIO(I/O) - do 20 MB/s
- DMA(Direct)- do 150 MB/s

## Wykład 6
Zeby wykonac operacje zapisu trzeba znac:
- numer dysku
- numer glowicy
- numer sciezki
- numer sektora
Taki tryb jest nazywany CHS
W HDD marnotractwo miejsca - blizsze pierscienie mialy mniej miejsca niz te dalsze, trzeba bylo liczyc predkosci wiec bylo to slabe rozwiazanie
W zamian tego wprowadzono LBA - logical block addressing - nadanie kazdemu sektorowi logicznego numeru

Advanced Host Controller Interface – specyfikacja określająca programowanie kontrolerów Serial ATA, jednak nie definiująca samej implementacji.
Sektor ma 512 bajtow - logiczny adres musi zostac wyrazony na LBA28 lub LBA48
### Schematy partycjonowania
LBA jest numerowane od 0
MBR jest numerowany od 1
Podstawowe informacje o strukturze dysku, w tym polkozenia partycji w systemach z BIOS sa w rekordzie ladujacym MBR, ktory jest na dysku w sektorze 1 glowica 0 cylinder 0
Rekord MBR zawiera zawiera program , ktorego ladowanie rozpoczyna wczytanie wlasciwego systemu operacyjnego. Jego rozmiar jest ograniczony do 446B
Informacje o utworzonych dyskach sa przechowywane w 64-bajtowej tablicy partycji, ktora jest umieszczona pod adresem 1BEH za kodem bootloadera.
MBC - sa ladowane do pamieci pod scisle okreslony adres - bios wykrywajac dyski odnajduje sektor zerowy i laduje go do pamieci - przekazuje sterowanie do tego kodu MBC ktory znajduje sie w sektorze 0
Nastepnie w MBR sa 64-bitowe (4 wpisy 16bit) - tablica partycji pod adresem 1BE
Nastepnie 2 znaczki - rekord ladujacy
Po MBR bedzie ladowany VBR - rekord ladujacy partycji Volume Boot Record
JAK BEDZIE CZAS TRZEBA OBEJRZEC JESZCZE WYKLAD 6 O LBA PIERWSZA CZESC
MBR - metadane opisujace dysk, potem sa metadane opisujace partycje

VBR - rekord ladujacy partycji
Dane BPB - wskazuja co dalej z ta partycja bedziemy robic

4 podstawowe partycje to za malo dla wymagan
Stworzono partycje rozszerzone
W tablicy partycji mozemy za pomoca danego adresu zaznaczyc ze dana partycje tworzymy w inny sposob np dla windowsa
Sluzy ona do tego zeby podzielic ja na dalsze partycje w sposob lancuchowy
Nie ma w tym rekordu ladujacego jest tu sama tablica partycji i jest sa w niej tylko 1 lub 2 wpisy
Slaboscia systemu MBR jest podatnosc na awarie np zaprzestanie ciaglosci dyskow - wtedy kazdy dalszy tez nie dziala poprawnie oraz przy malych dyskach partycja nie moze miec wiecej niz 2TB
Wymyslono nowy schemat partycjonowania - schemat partycji EFI
EFI definiuje GPT - GUID partition table oparta o identyfikatory GUID
MBR - LBA 0 jest protected - nie mozna ruszac - wysoki poziom polozony na bezpieczenstwo
Nie ma tu partycji rozszerzonej - ma to miejsce w naglowku GPT mozemy tworzyc ile chcemy
128 bitow na GUID dysku
### FAT/NFTS/EXT
Na partycji musimy ulokować pliki, ich lokowanie musi miec okreslona strukture - system plikow, umieszczenie metadanych o plikach i samych danych plikowych na partycjach
3 metody przydzialu miejsca na dysku:
- ciagla - kolejne bajty - informacja o 1 bajcie i dlugosci
- listowa
- indeksowa
listowo-indeksowa - NFTS
listowa - FAT
indekowa - EXT
W komorkach jest system ciagly np. karty SIM
## Wyklad 7
Zawsze zapisujemy co najmniej jeden sektor w czasie zapisywania danych - nigdy bajty
Listowa - zapamietujemy ze plik znajduje sie w sektorze X
Powinnismy miec 2 elementy:
- tablica bitowa ktora mowi o tym czy dany sektor jest wolny czy jest zajety
- potem mamy w danym sektorze czesci plikow i kolejny wskaznik wskazuje ze dalsza czesc pliku jest w innym sektorze
- Jest symbol koncowy np. 0
- Sa polaczenia listowe
Lista powiazan jest zapisana w formie metadanych
W sektorze zarezerwowanym i katalogu glownym rozsianym po calym dysku w FAT16
Klaster - zbior ciaglych sektorow - opisany jest ile sektorow na klaster na partycji
Kiedy potrzeba wiecej ilosci sektorow w klastrze - wtedy kiedy bedziemy przechowywac duze pliki - bo wtedy wiemy ze beda one przechowywane obok siebie
Liczba kopii fat - liczba tablic
Powyzsze dane sa w BPB
Tablica FAT zawiera indeksy
Wpis w tablicy fat gdzie szukac lancucha, numer klastra na dysku gdzie jest zawartosc katalogu, indeks w tablicy fat - w rekordzie plikowym
Wady i zalety FATu:
- Zalety:
- prosty w implementacji
- Wady:
- podatnosc na awarie - kiedy zrobimy cos z tablica fat - wszystko sie psuje
- maly maksymalnie rozmiar pliku - 4GB
- Brak uzywania drugiej tablicy - kopii tablicy FAT
- Jedyny ktory mozna uzywac w EFI, dlatego bo jest prosty
- Przez to ze za male byly mozliwosci wielkosci dysku utworzono FAT 32 i extfat
- Mozna zablokowac dostep do pliku poprzez utworzenie pliku o dlugiej nazwie co wykorzysta cala pamiec z katalogu glownego
- Efektywnosc
## Wyklad 8
Ext - blok = klaster z FAT
I-wezel - miejsce na opis pliku - indeks
Ze wzgledu ze glowica porusza sie nad sciezka - dba sie o to zeby pliki zajmowaly jak najwieksza liczbe ciaglych blokow/sektorow po sobie - nie tracimy czasu na inne bloki

Podjeto probe zminimalizowania awarii systemu -
DO DOPISANIA
---
Czesc 2
## Wyklad 9
Sposob wytwarzania plikow bazuje na bibliotekach - mozemy wytworzyc rozne obrazy
Jadro zapisywane jest ( 1 jego czesc ) - bazowy kernel - obraz - cos co jest ladowane w sposob bezposredni
Ladowanie programow do pamieci:
- Ładowanie bezwzgledne - umieszczanie zmiennej pod adresem ktory sobie wyznaczymy z palca, adresy sa znane na etapie kompilacji - przyklad to MBR
- Ładowanie relokowane - ladowany jest do pamieci nasz kod i format .exe jest uzupelniany o naglowek (przez kompilator) w ktorym sa miejsce mowiace ktore miejsca w rozkazach/danych system operacyjny ma skorygowac, dziala ze stronicowaniem - nie musi byc w pamieci fizycznej pod takim adresem
- Ładowanie dynamiczne - teraz sie to stosuje, plik ktory mamy na dysku, system operacyjny dostajac poelcenie zeby program wykonac najpierw w pamieci probuje zaalokowac pewne struktury, handler to indeks tablicy otwartych plikow, taki plik tez posiada indeks. W pliku zrodlowym sa naglowki - jest m.in. wielkosc segmentu stosu. Informacje o alokacjach, pliku zrodlowym uzupelniane sa przez fragment zwiazany z naszym plikiem - blok kontrolny procesu. Opisuje lokacje kolejnych segmentow, wszelkie info zwiazane z naszym plikiem. Po przydzieleniu pamieci nastepuje ladowanie - przepisywanie blokow dyskowych do pamieci, dane niezainicjalizowane sa tworzone stosy na podstawie alokacji, po alokacji uzupelniane sa wpisy w rejestrach. Wtedy mozna wykonac program
Loader czyta cos z dysku - program wynikowy - strumien bajtow (instrukcje, dane) - bazuja na danych
Trzeba ustalic adresy danych gdzie one sa
Nie wiemy gdzie nasz program zostanie zaladowany, przyjmuje sie pewne sposoby adresowania
Pliki zaczynaja sie od magic number - 2/4 bajty po tym rozpoznajemy rodzaje plikow
Sa 2 etapy otwierania pliku - kompilacja - jest tworzony plik obj - jest to format OMF ( wczesniejsze wersje ), dla formatow 16-bitowych, aktualnie jest COFF ( w linuxie wczesniej, windows aktualnie ) dla formatow PE i ELF
Nie mozemy crossowac 16,32,64bit
COFF opisuje zarowno pliki posrednie jak i pliki wykonywalne jak i pliki biblioteczne, jestesmy w stanie opisac plik w 3 postaciach, mozna ich funkcje uzyc do linkowania, przygotowac plik wykonywalny, albo uzywac jako biblioteke ( nie stosuje sie takiego podejscia )
Struktura pliku obiektowego:
- header, co w nim jest kiedy zostal utworzony itp, ogolne informacje
- sekcje - .data/.kod tlumaczenie i zapisywanie do oddzielnego miejsca w pliku
- kod wykonywalny, kiedy pojawia sie sekcja wykonywalna
- opis relokacji
Na etapie linkowania kompilator musi wskazac dla linkera i co trzeba skorygowac
- symbole - opis zmiennych globalnych ktore sa eksportowane na zewnatrz modulu - .public w asemblerze
- informacje dla debuggera - ta sekcja nie musi wystepowac
Plik posredni sluzy do tego zeby zbudowac i polaczyc kilka modulow w 1 calosc
Format COM: to co tworzy konsolidator - przyklad pliku obrazu - nie jest uzywany - w tym formacie mozna spotkac .bin, albo bez rozszerzenia
Jego rozmiar nie moze przekroczyc 64kb pamieci
Wszystkie segmenty miesci sie w tym obszarze
Poczatkowe 256 bajtow to PCB - sa tam informacje o obrazie - z jakiego pliku zostal zaladowany proces, jak to jest ladowane
Zawartosc jest od 100H - 256 bajt
Rejestry sa ustawione tak, ze wskazuja na poczatek bloku PSP, rejest SP wskazuje koniec segmentu
Segment stosu znajduje sie na koncu segmentu
Problemem bylo nakladanie sie bajtow kodu i zmiennych
Charakterystyczny dla 16-bit nie byl przystosowany do wielozadaniowosci
### a.out
W tym czasie tworzono taki system na Linux - szukano wielozadaniowosci - czy jest mozliwe ze N procesow dzialalo w roznych segmentach danych ale ten sam segment kodu
Potrzebowano rozdzielenia kodu i danych
Trzeba sprawdzic czy jest wspoldzielony segment kodu - jesli nie to jest alokowany nowy obszar i czyta sie dane z pliku
Nastepnie jest alokowany segment na dane i przepisanie danych do tego obszaru
Nastepuje odwzorowanie segmentu stosu i ustawienie rejestrow i skok do poczatku programu
Zaczeto wyrazac rozmiar w N 4kb stronach - zeby latwo wymieniac strony z pliku
Powstawal rownolegle do formatu DOS exe


W DOSIE sekcja to blok - nie ma rozroznienia na sekcje kodu i sekcje danych
W oparciu o tablice relokacji trzeba zmienic wpisana aktualna zawartosc segmentu kodu, trzeba wpisac rejestr segmentowy pod ktorym zostal ulokowany nasz kod
Relokacja - tablica relokacji to wskazniki do miejsc w pliku ktore system operacyjny ma zmodyfikowac pod katem faktcznego polozenia naszego kodu w pamieci
PLIK POMOCNICZY - FORMATY PLIKOW - sposob ladowania - przeczytac
Aktualny format ktory nas dotyka to PE, jest on ulokowany w srodku starego formatu ( MS-DOS Header )
Poczatek jest wspolny, ale chodzilo o to zeby zachowac kompatybilnosc wsteczna
Rola DOS STUBa - umieszczona jest sygnatura PE i wykonywalny program DOS - rozpoznawal jaki jest natywny system na ktorym dzialamy i dla jakiego formatu plik zostal wytworzony - pilnuje zeby plik nie zostal otworzony na niewlasciwym systemie
### Jak dziala plik PE
Jak z pliku exe jest tworzony nasz proces:
1. Parsowanie DOS Header, PE Header, Optional Header
ten format jest przeznaczony na rozne architektury - rozne procesory
.EFI jest w formacie PE
Pole charakterystyki opisuje jaki to jest typ obrazu - przestawia sie bity w zaleznosci od tego czy jest to np. plik dll albo exe
Naglowek opcjonalny moze nie wystapic kiedy mamy pliki obj - w plikach wykonywalnych musi byc
Ma pole image base - adres pod ktorym ma zostac zaladowany nasz plik .exe
Raw - adresy ktore dotycza cos w pliku
RVA - dotyczy pamieci
W pliku PE sa i te informacje i te
File alignment - kazda sekcja bedzie wyrownana do liczby ktora jest w tym naglowku FileAlignment
Sterownik mimo SYS tez jest w formacie PE
W katalogach danych wystepuje sekcja importu
Nasz program nie jest w calosci ladowany do pamieci - jest wrzucony do pliku wymiany czesciowo, nie wszystkie sekcje/strony zostana od razu odwzorowane na pamiec fizyczna - zostana odwzorowane poierwsze strony - adres bazowy i te co zawieraja kod - reszta nie jest potrzebna zeby go uruchomic - do fizycznej zostana zaladowane tylko sekcja obrazu i kodu - potem jak strony beda potrzebne beda ladowane do pamieci fizycznej
Czemu funkcje N-map sa interesujace co do ladowania plikow:
polaczenie funkcji daje uniwersalny sposob na dostep do pliku jako pamieci
Na etapie umieszczania naglowka ladowanowana jest biblioteka kernel32.dll - w pamieci fizycznej rezyduje raz i w tablicach umieszcza sie wskazniki
Proces ladowania programu do pamieci polega na:
1. Zamapowaniu pliku, wlaczenia go do pliku wymiany, zamapowaniu PD, PT
2. Do pamieci fizycznej ladowane sa bloki ktore potrzebne sa do analizy - bloki z naglowkiem i pierwsza strona segmentu sekcji kodu + stos zostanie utworzony
W tym momencie jest gotowy do uruchomienia - wszystkie struktury sa wypelnione i czekamy na sygnal zeby to uruchomic
W jaki sposob ladujemy funkcje z DLL do naszego programem - moga byc polaczone na 3 sposoby:
- biblioteki statyczne - konsolidator, jest kod statyczny i dolacza kod tej funkcji do programu na etapie wytwarzania/konsolidacji
- konsolidacja dynamiczna(LTL) - odwolujemy sie do funkcji printMessage - jest zawarta w bibliotece dynamicznej, jest w jakims pliku zewnetrznym w PE i trzeba to zamapowac - w jaki sposob jest ustalany adres ? - na etapie konsolidacji nie wiemy gdzie jest ta funkcja - jest tablica importu wystepujaca jako 2 w katalogu danych - w momencie kiedy ansz program jest ladowany do pamieci to oprocz naszego programu ladowana jest biblioteka np. DLL - zostanie ustalony adres bazowy i jaki jest punkt wejscia do naszej funkcji getMessage - adres prywatny dla procesu, kopiuje ten adres i zalatwia to loader procesow, kluczem do sukcesu jest ustawienie skoku posredniego jump do komorki - tak jest wywolywana funkcja
- konsolidacja dynamiczna RTL w czasie wykonania, ladujemy biblioteke, ladujemy adres i nastepnie zwalniamy
Wszystkie segmenty ktore wystepuja w naszym programie - section table, opis sekcji zawiera nazwe sekcji, rozmiar wirtualny naszego segmentu, jaki jest adres
W momencie kiedy zostana zaladowane sekcje .text .data do pamieci to wtedy nastepuje interpretacja struktury importu
Wiadomo co zaladowac bo w sekcji importu sa wyszczegolnione wpisy, sa nazwane biblioteki ktore powinny zostac zaladowane
Wiadomo ktora funkcje pobrac bo - jest 20 bajtowy sa rekordy opisujace kolejne funkcje, w pojedynczym rekordzie pole z offsetem + 12 wskazuje na nazwe biblioteki ktora chcemy zaladowac, system szuka po tej nazwie - sa okreslone katalaogi w ktorych on szuka
Przy ladowaniu procesu wchodzimy do sekcji importu, analizowany jest kazdy rekord tej sekcji i zamieniany jest adres wzgledem nazwy/numeru biblioteki. Kazda z tych funkcji jest przesunieta o RVA - adres bazowy pod ktoryta biblioteka zostanie zaladowana
Jezeli biblioteka np. kernel32 zostanie ustawiona pod adresem 00, a przesuniecie funkcji ExitProcess(funkcja w bibliotece) wzgledem poczatku imagebase wynosi 1000 to adres jest 1000 i zostanie wpisany w tej tablicy importow
Po tym sa nastepujace kroki:

Kiedy i w jaki sposob te biblioteki sa ladowane?
Czesc z bibliotek jest zaladowana juz do pamieci razem z procesem z automatu, te biblioteki sa wspoldzielone dla procesow
To odwolanie do biblioteki dostanie sie wtedy kiedy proces bedzie ladowany do pamieci - proces ladowania zostanie wstrzymany na ten moment bo najpierw zostanie zaladowana nasza biblioteka do pamieci, nastepnie po kolei kolejne wszystkie inne
Wirusy przenosza sie przez nasze pliki - musimy doczepic fragment kodu do pamieci liniowej procesu - mozna to zrobic w momencie kiedy laduja sie dane i wtedy wrzucic kod - przepiac segment danych na kod
Zeby wrzucic DLL trzeba dostac sie do entry pointu i wtedy iterowac po bibliotekach i wrzucic ja do tablicy
Mozna wstrzyknac DLL poprzez:
- zmiany wpisu w rejestrze
- ustawienie hooka
- uzycie zdalnych watkow
Modyfikacje tablicy IAT jest potencjalnym zagrozeniem i sprawdzaja to antywirusy

Mowia o tym ktory obszar z przestrzeni adresowej jest wolny lub zajety
Budowa pliku jest taka a nie inna bo tak musi sie mapowac na pamiec liniowa
Format ELF:
- nastepnca formatu a.out
- umozliwia kompilacje skrosna
- wystepuje w trzech odmianach:
pliki wykonywalne, linkowalne i biblioteki
Naglowek opcjonalny ktory wystepuje w PE ktory jest wspolny dla kompilacji i konsolidacji jest rozdzielony w formacie ELF - roznica
Wystepuje jeden naglowek ktory jest wykorzystywany przez plik wykonywalny, a jesli wystepuje w postaci obiektowej lub polskompilowanej to wystepuje naglowek sekcji, pomiedzy naglowkami wystepujea sekcje, wtedy kiedy nastapi plik wykonywalny to naglowek na dole jest pomijany w ELF

Ten na dole dla nieskompilowanych, na gorze dla wykonywalnych
Tablice importow w ELF to Global offset table i procedure linkage table GOT i PLT - umozliwiajace stworzenie kodu niezaleznego od lokacji - cos typu plik importu z PE
Sposob tworzenia jest inny
ROZNICE MIEDZY ELF I PE
Mechanizm rozwiązywania nazw (ang. symbol resolution) jest mechanizmem, który pozwala na uzyskanie adresu w pamięci dla danej nazwy symbolu w pliku wykonywalnym. Oba formaty ELF i PE posiadają mechanizm rozwiązywania nazw, ale różnią się one sposobem, w jaki są one implementowane.
Pliki ELF używają mechanizmu rozwiązywania nazw dynamicznego (ang. dynamic symbol resolution). Mechanizm ten polega na tym, że linker podczas tworzenia pliku wykonywalnego zostawia pewne symbole bez przypisania do konkretnego adresu w pamięci. Adres tych symboli jest określany podczas uruchamiania aplikacji przez dynamiczny linker, który linkuje biblioteki dynamiczne zawierające te symbole.
Pliki PE używają natomiast mechanizmu rozwiązywania nazw statycznego (ang. static symbol resolution). Mechanizm ten polega na tym, że linker podczas tworzenia pliku wykonywalnego przypisuje każdemu symbolowi konkretny adres w pamięci. Adresy te są określone już podczas tworzenia pliku wykonywalnego i nie zmieniają się podczas uruchamiania aplikacji.
Mechanizm rozwiązywania nazw dynamicznego pozwala na większą elastyczność i łatwiejsze debugowanie aplikacji, natomiast mechanizm rozwiązywania nazw statycznego pozwala na lepszą wydajność i bezpieczeństwo.
Innymi różnicami między formatami ELF i PE są:
Pliki ELF mogą mieć rozszerzenie .elf, .bin lub .out, natomiast pliki PE mają rozszerzenie .exe lub .dll
ELF jest formatem, który jest obsługiwany przez większość systemów operacyjnych opartych na Unixie, takich jak Linux, Solaris, AIX i HP-UX, natomiast PE jest formatem, który jest obsługiwany tylko przez systemy operacyjne Windows.
Pliki ELF mają bardziej rozbudowaną strukturę, co pozwala na łatwiejsze debugowanie aplikacji i linkowanie bibliotek dynamicznie, natomiast pliki PE mają bardziej zoptymalizowaną strukturę, co pozwala na lepszą wydajność i bezpieczeństwo.
ELF jest formatem, który pozwala na tworzenie plików wykonywalnych dla różnych architektur procesorów, natomiast PE jest formatem, który jest zoptymalizowany pod kątem architektury procesora x86.
Pliki ELF mogą zawierać sekcje takie jak .text, .data, .bss, .rodata, .rel.text, .rel.data itp., natomiast pliki PE mogą zawierać sekcje takie jak .text, .data, .rdata, .reloc itp.
Jak widać ELF i PE to dwa różne formaty plików wykonywalnych, które różnią się pod względem struktury, celów, zastosowań oraz systemów operacyjnych, dla których są przeznaczone.
ELF jest formatem, który jest bardziej elastyczny i pozwala na łatwiejsze tworzenie i debugowanie aplikacji. Format ELF pozwala na tworzenie plików wykonywalnych dla różnych architektur procesorów, w tym dla procesorów 32-bitowych i 64-bitowych. Pliki ELF zawierają informacje o sekcjach, symbolach i relokacjach, co ułatwia debugowanie aplikacji i linkowanie bibliotek dynamicznie.
PE jest natomiast formatem, który jest zoptymalizowany pod kątem wydajności i bezpieczeństwa, dlatego jest często stosowany w systemie Windows. Pliki PE zawierają informacje o sekcjach, symbolach, importowaniu i eksportowaniu, co pozwala na łatwe linkowanie bibliotek statycznie i dynamicznie. PE jest również formatem, który jest szyfrowany i zabezpieczony przed nieautoryzowanym dostępem.
Jednym z głównych różnic między formatami ELF i PE jest to, że ELF jest formatem, który jest bardziej otwarty i elastyczny, podczas gdy PE jest formatem, który jest bardziej zamknięty i zoptymalizowany pod kątem wydajności i bezpieczeństwa.
Architektura hybrydowa - jest w Windowsach
Budowa Windowsa:
- Jądro
- Aplikacje systemowe
- Procesy systemowe
- Aplikacje uzytkownika
- Usługi systemowe
- Podsystemy - tworcy chcieli zeby dzialal windows na roznych architekturach i zeby byla mozliwosc uruchamiania aplikacji z roznych podsystemow - teraz zostal tylko windows
NTDLL - narzedzie zmiany przejscia miedzy userem a kernelem
HAL - warstwa abstrakcji sprzetu - pojawienie sie jej wynika z tego, ze windows mial byc cross-platform (16/32 bit) przez to ze rozne sa mechanizmy np obslugi przerwan
IRQL - wirtualny poziom przerwania
HAL dostarcza wywolania dla kernela
Kernel to zbior funkcji i struktur danych, ktore umozliwiaja uzytkownikowi dzialanie na danym komputerze, SO to nie proces
Watki systemowe - watek o innych uprawnieniach, musimy go jawnie otworzyc i go nam przydzielic
Jesli bysmy chcieli cos zmodyfikowac w systemie to musimy zainstalowanie sterownika
Tablica routingu po przejsciu user-kernel wywoluje funkcje z wlasciwych modulow

KiServiceTable, sa dwie takie tablice w Windzie, ma wskaznik do tablicy Kernel Routines, w tej tablicy sa adresy faktyczne procedur ktore sa odpowiedzialne sa dane funkcje - skad wiemy ktora tablice wykorzystac? - o tym mowi rejest eax
SSDT (System Service Dispatch Table) jest tablicą w pamięci systemu operacyjnego, która przechowuje informacje o usługach systemowych dostępnych dla aplikacji. Każda pozycja w tablicy odpowiada jednej usłudze i zawiera adres, który wskazuje na kod ją obsługujący. Aplikacje mogą korzystać z tych usług, wywołując odpowiednie funkcje za pośrednictwem adresów znajdujących się w tablicy SSDT.
Przerwania - przerwanie w Windows to obiekt, ma pewne pola i pewne procedury
CPUIDT - tablica wektorow przerwan
W to w jaki sposob mapuje sie przerwania na obiekty decyduje modul HAL, kernel definiuje strukture obiektow ze tak beda wygladaly, a jak zamapowac mowi HAL
Kazde przerwanie ma adres procedury ISR, semafor(wirujaca blokada), faktyczny kod ktory dostarcza system, IRQL, na jakim priorytecie ono funkcjonuje(poziom wirtualny)
Schemat: Raise IRQL, wez spinlocka/wypusc spinlocka, Lower IRQL
Osbluga przerwania urzadzenia jest dostarczana przez osobe ktora ja tworzyla - obsluge sterownika sprzetu

Wiekszosc przerwan sprzetowych sa kierowane do tego samego dispatchera
Spinlock - instrukcje asm sa atomowe czyli jezeli instrukcja zostala rozpoczeta to zostanie wykonana w sposob niepodzielny, on synchronizuje te watki, xchg zachowuje to, ze liczba nie zostanie np zmodyfikowana przez 2 procesy
IRQL - zdefiniowano 32 poziomy
Poziomami przerwan IRQL zarzadza programista, na poziomie kernelowym sa rowne uprawnienia
Wszystkie procuedury przerwania powinny byc krotkie, nie mozemy na danym poziomie IRQL korzystac z funkcji z nizszych IRQL np zapisywanie do pliku podczas obslugi przerwania zegarowego
DPC - struktura - obiekt

Kazdy procesor ma kolejke obiektow DPC
I/O Manager tworzy DPC i przypisuje do kolejki
Wszystko co zwiazane z DPC pochodzi od przerwan sprzetowych - idzie z gory
APC - asynchroniczne wywolanie procedury - idzie od dolu
Dispatch jest zwiazana z mechanizmem przelaczania zadan - moze pochodzic od przerwania zegarowego lub innych przerwan na zasadzie uszeregowania watkow - te ktore chca odczytac dane zasoby
Dispatch zajmuje sie ktora procedura musi zostac wykonana w pierwszej kolejnosci
Wszystkie watki dzialaja na poziomie passive
APC i Dispatch sa przerwaniami systemowymi, mozemy zmienic ich dzialanie/poziom przerwania
APC jest dziwne bo dziala na 2 roznych poziomach - system APC i User APC
To co jest powyzej poziomu 1 (>APC), jest globalne - nie mozmey nic przelaczac, nie mozna synchronizacji watkow robic, mozna sobie wyobrazic ze jest to pamiec fizyczna ale nie mozemy sie tam nigdzie pomylic
Jesli na poziomie APC - to dziala w kontekscie wątkow
Jesli chcemy odczytac z pliku to generujemy funkcje systemowa - ona decyduje na ktorym poziomie i gdzie nastepuje doczepienie funkcji
Na APC wiemy do ktorego watku jest procedura doczepiona - lokujemy ja w przestrzeni adresowej tego watku, jesli to odczyt z pliku to te dane z pliku trafia w przestrzen adresowa danego pliku
Kazdy watek ma swoja kolejke APC w przeciwienstwie do DPC ktora jest na caly system
APC - jesli z aplikacji chcemy wywolac funckej systemowa
DPC jesli z funkcji systemowej wywolujemy przerwanie
Watki systemowe sa zeby zapewnic komunikacje miedzy DPC a APC, jesli chcemy przekazac funkcje nizej to tworzymy procedure i wywolujemy IoQueueWorkItem
WorkItem to procedura w ktorej zawieramy wskaznik do parametrow i wskaznik funkcji ktora ma byc wywolana i przekazujemy to w postaci WorkItemu do kolejki, robi to DPC i watek systemowy to wywola na poziomie APC
### Zarzadzanie procesami
Granicami systemu jest przestrzen kernela i usera, roznia sie tym co znajduje sie w kernelu
Jest monolitowy kernel, hybrydowy, mikrokernel
Linux jest rozszerzalny, jedno jadro kernel ktore robi wszystko
Najpierw bierzemy sie w systemie za zarzadzanie pamiecia a potem wielowatkowoscia
Minix: Jadro jest stabilne, wystepuje system plikow, liczba bledow jest mala, system sie szybko uruchamia, system plikow laczy sie z procesami
PCB - struktura systemowa ktora opisuje dzialajacy kod, podstawa wykonania
W windowsie struktura szeregowania jest watek
System operacyjny - zbior struktur i funkcji lub procedur ktore na strukturach dzialaja

Dwa zrodla dzialania systemu - przerwania od dolu, dzialania uzytkownika od gory, przerwania moga byc async
Najwazniejsze jest przerwanie zegarowe - cos cyklicznie zostanie wykonane
Kazdy proces ma swoje struktury,
Jest pula VADi wtedy kiedy potrzebne sa dla danego procesu sa brane te ktore nie sa uzywane komorki pamieci

Struktury systemowe w windows:
- Powstaje process block(EPROCESS)
- dla kazdego bloku jest przydzielony watek
- proces - zbior watkow - podstawowa jednostka wykonawcza do podzialu czasu
