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