Systemy Operacyjne Komputerów Przemysłowych OS Linux, Część 3
Total Page:16
File Type:pdf, Size:1020Kb
Systemy operacyjne komputerów przemysłowych OS Linux, część 3 Iwona Kochanska´ Katedra Systemów Sonarowych WETI PG Listopad 2019 GUT – Intel 2015/16 1/50 Pami˛ec´ fizyczna - liniowa (“flat”) I wszystkie procesy współdziel ˛aten sam obszar pami˛eci I przykładowe CPU: 8086-80206, ARM Cortex-M, 8- i 16-bit PIC, AVR, wi˛ekszos´c´ systemow 8- i 16-bitowych GUT – Intel 2015/16 2/50 Pami˛ec´ fizyczna - model x86 GUT – Intel 2015/16 3/50 Pami˛ec´ fizyczna - model x86 I Pami˛ec´ fizyczna podzielona jest na strony I Rozmiar strony jest rózny˙ dla róznych˙ architektur. W wi˛ekszosci´ przypadków to 4096 B I Ograniczona przenosno´ s´c´ programów C I Trzeba znac´ (lub sprawdzac)´ całkowit ˛ailos´c´ pami˛eciRAM I Trzeba pilnowac,´ by procesy miały osobne obszary pami˛eci I Zle´ napisane programy mog ˛apowodowac´ awari˛ecałego systemu GUT – Intel 2015/16 4/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a I Mapowanie wirtualnej przestrzeni adreswej na: I przestrzen´ pami˛ecifizycznej RAM I urz ˛adzenia, np. PCI, GPU RAM I Zalety: I kazdy˙ proces moze˙ miec´ własn ˛aprzestrzen´ adresow ˛a; przestrzenie adresowe s ˛aod siebie odseparowane, I przestrzen´ adresowa j ˛adra jest niewidoczna dla przestrzeni adresowej uzytkownika˙ I pami˛ec´ fizyczna RAM moze˙ byc´ mapowana przez wiele procesów - pami˛ec´ współdzielona (shared memory) I obszary pami˛ecimog ˛amiec´ rózne˙ ustawienia dost˛epu(read, write, execute) GUT – Intel 2015/16 5/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a I Dwie przestrzenie adresowe: I adresy fizyczne - uzywane˙ przez urz ˛adzenia (DMA, peryferia) I adresy wirtualne - uzywane˙ przez programy (instrukcje load/store dla procesorów RISC, wszelkie instrukcje dost˛epudo pami˛eciRAM dla procesorów CISC) I Kazdy˙ adres w pami˛eci(fizycznej lub wirtualnej) mozna˙ przedstawic´ jako wielokrotnos´c´ rozmiaru strony oraz przesuni˛ecia I Przestrzen´ adresowa pami˛eciwirtualnej I dla procesorów 32-bitowych: od 0 do 0xffffffff, podzielona na strony o rozmiarze 4 kB I dla procesorów 64-bitowych: 48 bitów adresu (maks. 256 TB), po połowie dla j ˛adra i przestrzeni uzytkownika˙ GUT – Intel 2015/16 6/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a I Przestrzen´ adresowa podzielona na: I przestrzen´ u˙zytkownika (user space) - high memory I i przestrzen´ j ˛adra (kernel space) - low memory GUT – Intel 2015/16 7/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a I Segment danych (Data) - globalne i statyczne zmienne o zdefiniowanych, niezmiennych wartosciach;´ wszelkie zmienne nie zdefiniowane wewn ˛atrzfunkcji I Segment BSS - globalne i statyczne zmienne o wartosci´ 0 lub bez wartosci´ I Sterta (Heap) - zmienne dynamiczne - przestrzen´ zarz ˛adzana poleceniami malloc, calloc, realloc, free; obszar współdzielony przez wszystkie w ˛atki,biblioteki współdzielone, moduły I Stos (Stack) - zmienne lokalne; jesli´ wska´znikstosu zrówna si˛e ze wska´znikiemsterty, to oznacza koniec wolnej pami˛eci. GUT – Intel 2015/16 8/50 Linux to system obsługuj ˛acypami˛ec´ wirtualn ˛a I Podział mi˛edzyprzestrzen´ uzytkownika˙ a przestrzen´ jadra: parametr PAGE_OFFSET konfiguracji j ˛adra I typowy system 32-bitowy: PAGE_OFFSET = 0xc0000000, nizsze˙ 3GB - przestrzen´ uzytkownika˙ I przestrzen´ uzytkownika˙ alokowana dla procesu I przestrzen´ j ˛adra - wspólna dla wszystkich procesów. GUT – Intel 2015/16 9/50 Jednostka zarz ˛adzaniapami˛eci˛a I Memory Management Unit (MMU) - zestaw układów realizuj ˛acychdost˛epdo pami˛ecifizycznej z˙ ˛adanejprzez CPU. Do ich zadan´ nalezy:˙ I translacja pami˛eciwirtualnej do pami˛ecifizycznej, I ochrona pami˛eci, I obsługa pami˛ecipodr˛ecznej, I zarz ˛adzanieszynami danych I przeł ˛aczaniebanków pami˛eci(w systemach 8-bitowych) I Układy MMU dziel ˛aprzestrzen´ logiczn ˛a(wirtualn ˛a)pami˛ecina strony, których rozmiar wynosi 2N (kilka kilobajtów). I Page frame number (PFN) - indeks strony pami˛eci(N starszych bitów adresu pami˛eci).Młodsze M bitów adresu (przesuni˛ecie) pozostaje niezmienione GUT – Intel 2015/16 10/50 MMU - Translation lookaside buffer I Translation lookaside buffer (TLB) - asocjacyjna pami˛ec´ podr˛ecznasłuz˙ ˛acado mapowania adresów wirtualnych/fizycznych I Jezeli˙ TLB nie posiada odpowiedniego przypisania (rozmiar pami˛eciTLB jest ograniczony) uruchamiane s ˛awolniejsze, sprz˛etowe mechanizmy procesora przeszukuj ˛acestruktury danych znajduj ˛acesi˛ew pami˛eci,co wymaga niekiedy pomocy ze strony oprogramowania (systemu operacyjnego). I Pozycje w tych strukturach nazywaj ˛asi˛ewpisami (elementami) tablicy stron pami˛eci(PTEs - ang. page table entries), a cała struktura nazywana jest tablic ˛astron pami˛eci(ang. page table). I Kompletny adres w pami˛ecifizycznej jest ustalany poprzez dodanie bitów przesuni˛eciado przetłumaczonego numeru strony. GUT – Intel 2015/16 11/50 MMU - Translation lookaside buffer I Jezeli˙ w strukturach TLB lub PTE nie znajduje si˛eodpowiedni opis aktualnie wykorzystywanej logicznej strony pami˛ecilub znajduj ˛acysi˛ewpis zabrania dost˛epuw danym trybie, MMU sygnalizuje CPU wyj ˛atekzwi ˛azany z bł˛ednym dost˛epemdo strony pami˛eci,tzw. page fault. GUT – Intel 2015/16 12/50 Mapowanie pami˛eciwirtualnej Ka˙zdastrona pami˛eciwirtualnej mo˙zebyc:´ I niemapowana (próba dost˛epu-> SIGSEGV -> komunikat segmentation fault) I mapowana na stron˛efizyczn ˛apami˛eci prywatn ˛adla procesu I mapowana na stron˛efizyczn ˛apami˛eci współdzielon ˛az innym procesem I mapowana na stron˛efizyczn ˛apami˛eci u˙zywan˛aprzez j ˛adro I j ˛adromoze˙ dodatkowo mapowac´ strony p. wirtualnej na obszary pami˛ecizarezerwowane dla np. buforów pami˛ecisterowników GUT – Intel 2015/16 13/50 Mapowanie pami˛eciwirtualnej - COW I mapowanie i współdzielenie z flag ˛a “copy on write” I gdy istnieje potrzeba współdzielenia duzej˙ ilosci´ danych I zamiast rzeczywistego, kosztownego kopiowania pami˛ecizwracany jest wska´znikdo oryginalnych danych; kopiowanie jest wykonywane dopiero, gdy zachodzi potrzeba ich modyfikacji. I Przykład: funkcja fork() I tworzy proces potomny, który posiada dokładn ˛akopi˛ekontekstu procesu nadrz˛ednego, jak równiez˙ kopi˛ejego pami˛eci(mapowan ˛a na t ˛asam ˛aprzestrzen´ fizyczn ˛a). I strony pami˛eci,które mog ˛abyc´ zmodyfikowane zarówno przez proces jak i jego potomka, otrzymuj ˛aznacznik "kopiowane przy zapisie". I gdy jeden z procesów modyfikuje pami˛ec,´ kernel przechwytuje to wywołanie i kopiuje modyfikowane strony tak, aby zmiany dokonane przez jeden proces były niewidoczne dla drugiego. Od tej chwili proces nadrz˛edny i potomny zaczynaj ˛aodwoływac´ si˛edo GUT – Intelfizycznie 2015/16 róznych˙ stron. 14/50 Mapowanie pami˛eciwirtualnej - COW GUT – Intel 2015/16 15/50 Zalety pami˛eciwirtualnej I niepoprawne odwołania do pami˛eciprzechwytywane i sygnalizowane przez SIGSEGV I proces działa we własnej przestrzeni pamieci, odizolowany od innych procesów I efektywne wykorzystanie pami˛eci- współdzielenie cz˛esci´ kodu i danych ( np. bibliotek) I mozliwo˙ s´c´ zwi˛ekszenia ilosci´ pami˛ecipoprzez pliki wymiany (swap files) GUT – Intel 2015/16 16/50 Wady pami˛eciwirtualnej I trudno ustalic,´ jakie jest aktualne zuzycie˙ pami˛eci(przez aplikacj˛e) I “overcommit” - praktyka przedzielania pami˛eciwirtualnej bez gwarancji, ze˙ dost˛epnajest odpowiednia ilos´c´ pami˛ecifizycznej I opó´znieniawprowadzane przez zarz ˛adzaniepami˛eci˛ai obsług˛e wyj ˛atków(page faults) GUT – Intel 2015/16 17/50 Przestrzen´ pami˛ecij ˛adra Przestrzen´ pamieci j ˛adra - kazdej˙ alokacji w przestrzeni wirtualnej odpowiada przestrzen´ fizyczna! Obszary: I j ˛adro (kod i dane załadowane z obrazu j ˛adra podczas rozruchu systemu) I segmenty: .text, .init, .data, .bss I pami˛ec´ dla sterowników urz ˛adzen´ I moduły j ˛adra GUT – Intel 2015/16 18/50 Przestrzen´ pami˛ecij ˛adra I pami˛ec´ alokowana przez void * kmalloc(size_t size, int flags) I slab allocator - efektywny mechanizm ci ˛agłej alokacji pami˛eci; I zachowanie kmalloc zalezy˙ od parametru flags: I GFP_KERNEL: zwykła alokacja, moze˙ zostac´ chwilowo wstrzymana (zwolniona) i ponownie zaalokowana. I GFP_ATOMIC: alokacja dokonana w całosci´ lub wcale. I zwolnienie pami˛eci: void kfree(const void *objp); I pami˛ec´ alokowana przez void *vmalloc(unsigned long size); I wi˛eksze obszary pami˛eciniz˙ kmalloc() (przestrzen´ adresowa wirtualna jest ci ˛agła,ale fizyczna - niekoniecznie) I odpowiednik malloc() w przestrzeni uzytkownika,˙ I zwolnienie pami˛eci: void vfree(const void *addr); I Przykład programu: http://www.roman10.net/2011/07/29/linux- kernel-programmingmemory-allocation/ GUT – Intel 2015/16 19/50 Ile pami˛eciuzywa˙ j ˛adro? I rozmiar obrazu j ˛adra I zwykle j ˛adrojest małe w porównaniu z całkowit ˛ailosci´ ˛apami˛eci I budowa małego j ˛adra ( Linux-tiny, Linux Kernel Tinification), projekt https://tiny.wiki.kernel.org/. GUT – Intel 2015/16 20/50 Ile pami˛eciuzywa˙ j ˛adro? Odczyt /proc/meminfo. Kernel memory usage to suma: I Slab: pami˛ec´ alokowana przez slab allocator I wi˛ecejinformacji - odczyt /proc/slabinfo I KernelStack: przestrzen´ adresowa stosu I PageTables: pami˛ec´ do przechowywania tablic stronicowania I VmallocUsed: pami˛ec´ alokowana przez vmalloc() I wi˛ecejinformacji - odczyt /proc/vmallocinfo GUT – Intel 2015/16 21/50 Ile pami˛eciuzywa˙ j ˛adro? GUT – Intel 2015/16 22/50 Ile pami˛eciuzywa˙ j ˛adro? lsmod - ile pami˛ecizuzywa˙ kod i dane modułów j ˛adra? GUT – Intel 2015/16 23/50 Obszar pami˛eciuzytkownika˙ I Stronicowanie na ˙z˛adanie(Demand-paging) - Linux mapuje strony pami˛ecifizycznej tylko wtedy, gdy program odwołuje si˛e do odpowiedniego miejsca w pami˛eciwirtualnej malloc(3) zwraca wska´znikdo pami˛eciwirtualnej operacja odczytu/zapisu przechwytywana przez