---
# System prepended metadata

title: Notatki SO

---

# 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

![](https://i.imgur.com/8SQdjNU.png)

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

![](https://i.imgur.com/qxGITkP.png)

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

![](https://i.imgur.com/ZD6pncw.png)

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

![](https://i.imgur.com/vHS0pDQ.png)

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

![](https://i.imgur.com/lrC0MCb.png)

### 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

![](https://i.imgur.com/Tbw3Miz.png)

## 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

![](https://i.imgur.com/noL7gL5.png)

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

![](https://i.imgur.com/g9iW1xa.png)

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.

![](https://i.imgur.com/RJtOqNC.png)

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

![](https://i.imgur.com/9v4glCr.png)


## 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

![](https://i.imgur.com/ZepNsw4.png)

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

![](https://i.imgur.com/gi6suP4.png)

VBR - rekord ladujacy partycji

Dane BPB - wskazuja co dalej z ta partycja bedziemy robic

![](https://i.imgur.com/Pzu7dPR.png)

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

![](https://i.imgur.com/XHkdfCZ.png)

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

![](https://i.imgur.com/nB2K5dS.png)

![](https://i.imgur.com/bF0KefU.png)

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:

![](https://i.imgur.com/VtNs7Hv.png)

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

![](https://i.imgur.com/fnfon2c.png)

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
![](https://i.imgur.com/Vd7taHf.png)
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

![](https://i.imgur.com/993aLr0.png)

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

![](https://i.imgur.com/gkFXrEL.png)

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 

![](https://i.imgur.com/dTjrP1w.png)

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

![](https://i.imgur.com/Mg9HJjV.png)

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

![](https://i.imgur.com/di9XyYH.png)

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

![](https://i.imgur.com/Hw8fnUa.png)























