Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #2.1.5
- #1. Należy wskazać trzy różnice pomiędzy uruchomionym programem skonsolidowanym statycznie i dynamicznie:
- #a) w jakiej sytuacji nie może zostać utworzony proces po uruchomieniu programu;
- #W przypadku programu skonsolidowanego dynamicznie nie może zostać utworzony proces po uruchomieniu programu, ponieważ brakuje biblioteki libsodium.
- echo -e '\033[0;32m---------2.1.5.1 (A)--------\nProba uruchomiena programu skonsolidowanego dynamicznie bez biblioteki\033[0m'
- sudo dnf remove libsodium -yq
- ldd prog | grep --color -E "not found|$"
- ldd sprog
- ./prog
- ./sprog
- echo -e '\033[0;32mInstalacja brakujacej biblioteki\033[0m'
- sudo dnf install libsodium -yq
- ldd prog | grep --color -E "libsodium.so.26 =>|$"
- ldd sprog
- ./prog
- ./sprog
- #b) porównanie liczby nieanonimowych segmentów pamięci w mapie pamięci każdego z procesów - wymagane wskazanie nieanonimowego segmentu pamięci zawierającego odpowiednio text/zmienne/stałe;
- echo -e '\033[0;32m---------2.1.5.1 (B)--------\n Liczba nieanonimowych segmentow pamieci w mapie pamieci (fragmentu pamieci o ciaglej logicznej adresacji pamieci)\033[0m'
- #uruchomić w oddzielnych oknach terminala program sprog i prog
- pidof prog
- pidof sprog
- pmap -x $(pidof prog) | grep --color -E "Mode|Mapping|$"
- pmap -x $(pidof sprog) | grep --color -E "Mode|Mapping|$"
- echo -e 'r---- stale\nrw--- zmienne\nr-x-- text\nNieanonimowe bez [anon] i [stack]\n\033[0;32m- Wiecej segmentow nieanonimowych dla procesu utworzonego wskutek uruchomienia programu skonsolidowanego dynamicznie\033[0m\nnieanonimowe segmenty to te, gdzie dane lub tekst wczytane zostaly z pliku wykonywalnego lub zawierajacego biblioteke';
- #c) korzystając z narzędzia top/htop należy wykazać rozmiar pamięci wirtualnej (ozn. VSZ/VIRT), rozmiar zajmowanej ulotnej pamięci fizycznej (ozn. RSZ/RSS/RES) oraz rozmiar pamięci, która może być potencjalnie współdzielona (ozn. SHR) przez każdy z procesów z innymi procesami.
- htop
- #F4 aby filtrować (wpisać prog i enter)
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 8022 root 20 0 2940 1480 1480 S 0,0 0,0 0:00.00 prog
- 8444 root 20 0 1380 928 928 S 0,0 0,0 0:00.00 sprog
- #VSZ/VIRT prog ma więcej, bo ładuje biblioteki współdzielone (dynamiczne).
- #RSZ/RSS/RES większe dla prog, bo załadowane są również fragmenty bibliotek współdzielonych do pamięci fizycznej.
- #SHR (Shared memory): Większe w prog, bo dzieli segmenty bibliotek dynamicznych z innymi procesami.
- #większe dla prog, bo współdzieli biblioteki dynamiczne (np. glibc, libsodium) z innymi procesami.
- #Jak dla pliku regularnego zawierającego program wykonywalny lub bibliotekę wspólną ELF określić rodzaj zastosowanej konsolidacji?
- echo -e '\033[0;32m---------2.1.5.1 (D)--------\nOKRESLENIE RODZAJU ZASTOSOWANEJ KONSOLIDACJI\033[0m\n\033[0;32mdla biblioteki\033[0m'
- file /usr/lib64/libc.so.6 | grep --color -E "dynamically linked|$"
- echo -e '\033[0;32mdla programu dynamicznie skonsolidowanego\033[0m'
- file prog | grep --color -E "dynamically linked|$"
- echo -e '\033[0;32mdla programu statycznie skonsolidowanego\033[0m'
- file sprog | grep --color -E "statically linked|$"
- #2. Dla programu oraz biblioteki skonsolidowanej dynamicznie należy wykazać listę wymaganych bibliotek i wykazać listę wszystkich bibliotek zarządzanych przez linker? - każdy uczestnik zajęć wybiera do eksperymentu inny niż pozostali program ELF oraz inną niż pozostali bibliotekę ELF (nie można wybrać programu prog oraz biblioteki libsodium).
- #sciezki do programu mozemu szukac poleceniem: which
- echo -e '\033[0;32m---------2.1.5.2--------\nLista bibliotek wymaganych przez program\033[0m'
- ldd /usr/bin/find
- echo -e '\033[0;32mi biblioteke skonsolidowana dynamicznie\033[0m'
- ldd /usr/lib64/libc.so.6
- #ew. ldd libselinux.so.1
- echo -e '\033[0;32mIlosc bibliotek w linkerze\033[0m'
- ldconfig -p | grep bibliotek
- echo -e '\033[0;32mWszystkie biblioteki zarzadzane przez linker\033[0m'
- ldconfig -p
- #3. Wykazać dla uruchomionego programu ELF czas przetwarzania w trybie uprzywilejowanym i czas przetwarzania w trybie nieuprzywilejowanym, dlaczego suma tych czasów nie musi być zgodna z czasem cyklu życia (istnienia) procesu. Skąd pochodzi kod przetwarzany przez proces w trybie uprzywilejowanym, a skąd pochodzi kod przetwarzany przez proces w trybie nieuprzywilejowanym. W jakiej sytuacji następuje zmiana trybu przetwarzania z nieuprzywilejowanego na uprzywilejowany?
- echo -e '\033[0;32m---------2.1.5.3--------\nCzas przetwarzania w trybie nieuprzywilejowanym i uprzywilejowanym\033[0m'
- time ls
- echo -e '\033[0;32m- Suma tych czasow nie musi byc zgodna, poniewaz proces w trakcie swojego zycia nie musi byc przetwarzany w zadnym trybie (moze np. oczekiwac na input)\n- proces pochodzi\nw uprzywilejowanym: z jadra\nw nieuprzywilejowanym: z programu lub biblioteki.\n- Zmiana nastepuje w momencie zgloszenia wywolania systemowego przez proces (rozkaz pulapki)\033[0m'
- #4. Czym jest wywołanie systemowe i która z bibliotek oferuje procesom możliwość zgłaszania wywołań systemowych? - wykazanie, który z procesów utworzonych w wyniku uruchomienia udostępnionych w zadaniu programów ELF (zakładając identyczny kod źródłowy obu programów wykonywalnych, skonsolidowanych odpowiednio statycznie i dynamicznie) zgłaszał mniej wywołań systemowych.
- echo -e '\033[0;32m---------2.1.5.4--------\nWywolanie systemowe to rozwiazanie/funkcjonalnosc (procedura obslugi wywolania systemowego), ktore umozliwia procesowi skorzystanie z funkcjonalnosci oferowanych przez jadro\033[0m\nTakie wywolania umozliwia biblioteka \033[0;32mVDSO\033[0m\nFragment kodu uruchamiany po wykonaniu wywolania systemowego to \033[0;32mPROCEDURA\033[0m\n\n\n\033[0;32mPorownanie ilosci zgloszen wywolan systemowych\033[0m'
- strace -c ./prog
- strace -c ./sprog
- echo -e '\033[0;32mprog\033[0m miał więcej wywołań systemowych ze względu na dynamiczne ładowanie bibliotek'
- #Patrzymy na calls/total
- #Z reguły sprog (statyczny) zgłasza mniej wywołań na starcie, bo nie potrzebuje ładowania bibliotek
- #prog (dynamiczny) będzie miał więcej wywołań systemowych, przez dynamiczne ładowanie bibliotek
- #cat /proc/$(pidof prog)/maps | grep vdso - mozemy udowodnić użycie VDSO
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement