OS - jak zmienna przekazuje wartosc i pamiec dla danych

0

Witam

W jaki sposob system operacyjny (<ort>najprostrzy </ort>z trybem chronionym) przekazuje argumenty i ich dlugosc w <ort>bajatach </ort>np uruchamianemu watkowi? lub innej bibliotece? <ort>Wewala </ort>dane w obszar danych startujacego watku/programu/bibliotece dane wejsciowe i zapisuje ich adres w rejestrze?

Jak obliczyc a dokladniej jak odgadnac ile dany program bedzie potrzebowal pamieci na dane? Jak to sie odbywa od strony kernela? najpierw liczymy zmienne czy jak?

Z gory dzieki :)

0

Jesli wywolujesz funkcje pochadzace z jadra (poprzez furtke wywolania) to tutaj argumenty sa przekazywane przez stos, z tym ze jesli poziom uprzywilejowania kodu wywolujacego funkcje jadra jest nizszy od poziomu uprzywilejowania samego jadra wowczas nastepuje zmiana stosow tzn. parametry ze stosu programu o nizszym stopniu uprzywilejowania sa kopiowane na stos jadra a SS oraz ESP zostaja ustawione na stos jadra, z tym ze odbywa sie to automatycznie, o wszystko dba procesor. Po powrocie z takiej funkcji stos z powrotem zostaje ustawiony na kod programu wywolujacego funkcje jadra (Te wartosci sa przywracane z segmentu zadania TSS). Jesli chodzi o ilosc bajtow ktore maja zostac skopiowane ze stosu twojego programu na stos jadra, to okreslasz to w definicji furtki wywolania.
Jesli chodzi o biblioteki to cholera wie skomplikowana sprawa ale mozna sobie opisac jakis deskryptor dla kodu biblioteki, zaladowac tam biblioteke a potem z kodu twojej aplikacji cos w stylu call sel_deskrypt:nazwa_funkcji, lub jescze inaczej pakowac kod biblkoteki bezposrednio do segmentu kodu aplikacji, ktora korzysta z funkcji tej biblioteki, potem relokacja, czyli porawianie wszystkich adresow w bibliotece, bo kod biblioteki mogl zostac wstrzykniety np. od adresu 40000h i wowczas trzeba by poprawic wszystkie offsety w pamieci zwlaszcza adresy wywolan funkcji bibliotekcznych.

Chyba najlepiej jak zapoznasz sie z formatem Exe-Pe wtedy, moze zdabedziesz ogolny poglad na sprawe, polecam tez stare dosowe pliki EXE tam sa fajne tablice relokacji mowiace o tym gdzie w pliku sa wskazniki wymagajace porawy. - He he w Exe-Pe NIE MA takich fajowych tabliczek, bo sa przeznaczone do plasikiego modelu pamieci, i wszystkie adresy linker ustawia automatycznie, bo itak wiadomo ze plik wyladuje w segmencie w ktorym adresy zaczynaja sie od 0.

To ile program potrzebuje pamieci na dane wypelnia naogol linker, i wpusuje to do naglowka pliku, a jesli format pliku jest binarny to chyba sam bedziesz musial posilkowac sie jakims wlasnym naglowkiem,
a rozmiar danych "mierzyc" korzystajac z etykiet np: koniec_danych - poczatek_danych (obliczyc roznice adresow).

Bleeeeee trudny temat i zalezny od tak wielu czynnikow ze ciezko cokolwiek precyzyjnie napisac.

Na tym zakoncze bo syndrom uczonego idioty mi sie wlaczyl, wiem ze to nie jest dokladnie to czego oczekiwales, no ale moze cos z tego co napisalem okaze sie przydatne.

A i jescze jedno zamiast furtek wywolania mozesz do wywolywania funkcji jadra korzystac rowniez z przerwan programowych, wtedy argumenty przekazujesz przez rejestry.

Pozdrawiam

0

Chyba najlepiej jak zapoznasz sie z formatem Exe-Pe wtedy, moze zdabedziesz ogolny poglad na sprawe, polecam tez stare dosowe pliki EXE tam sa fajne tablice relokacji mowiace o tym gdzie w pliku sa wskazniki wymagajace porawy. - He he w Exe-Pe NIE MA takich fajowych tabliczek, bo sa przeznaczone do plasikiego modelu pamieci, i wszystkie adresy linker ustawia automatycznie, bo itak wiadomo ze plik wyladuje w segmencie w ktorym adresy zaczynaja sie od 0.

format PE nie oferuje relokacji!? Wybacz stary, ale chyba nie masz pojęcia o czym mówisz - wszystkie pliki PE za wyjątkiem exe /a i to nie wszystkich!/ posiadają relokacje. Płaski model pamięci? Owszem, ale segment FS jest mapowany na adres 7xxxxxxx /różnie w różnych wersjach win, a nadal nie mam porządnego debuggera pod ręką :/ /.

A i jescze jedno zamiast furtek wywolania mozesz do wywolywania funkcji jadra korzystac rowniez z przerwan programowych, wtedy argumenty przekazujesz przez rejestry.

callgate? w 'normalnych' systemach operacyjnych widziałem tylko przerwania i ew. zastosowanie msr - instrukcje sysenter lub syscall. Np, w Win NT wiele funkcji w kernel32.dll jest forwardowana do ntdll.dll, ten zaś przenosi do rejestru edx offset danych na stosie /argumentów funkcji - oczywiście w konwersji stdcall/ i wywołuje int 0x2e lub sysenter, obsługa kopiuje argumenty ze stosu ring3 na stos ring0 /sys posiada zapisaną ilość argumentów w tablicy funkcji/. Adres danych na stosie ring3 - jak już wspomniałem - otrzymuje handler w rejestrze edx, kopiuje i dopiero wywołuje 'normalną' /zwykle exportowaną z ntoskrnl.exe/ funkcję /oczywiście z odpowiednimi uprawnieniami/. O linuksie nie będę się wypowiadał - dawno jego jądrem się nie bawiłem, a źródła i dokumentacja są publicznie dostępne /w przeciwieństwie do Win - m$ nigdy nie przyznał oficjalnie jak działa wywoływanie ring0/...

1 użytkowników online, w tym zalogowanych: 0, gości: 1