Teoretycznie, jeśli miałbym zbudować program, który przydzieliłby całą nieużywaną pamięć w systemie i nadal żądałby coraz większej ilości pamięci, ponieważ inne aplikacje zwalniały pamięć, której już nie potrzebują, czy byłoby możliwe odczytanie ostatnio zwolnionej pamięci z innych aplikacji ? Czy jest to w jakiś sposób chronione przez nowoczesny system operacyjny?
Nie mam na to praktycznego zastosowania, jestem po prostu ciekawy. Zdaję sobie sprawę, że istnieją pewne problemy z przydzielaniem „całej dostępnej pamięci” w prawdziwym życiu.
Edycja: Aby to wyjaśnić, pytam konkretnie o pamięć „Zwolnioną”, a nie dostęp do pamięci, która jest obecnie przydzielana przez inną aplikację.
źródło
The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process
Widzę tutaj pewną niespójność. Miałeś na myśli „ten sam plik wykonywalny”? Jak sprawdza się, czy nie zerować - ścieżką dysku?W grę wchodzi kilka warstw, które wpływają na odpowiedź.
Jeśli przyjmiesz nowoczesny system operacyjny pamięci wirtualnej, nie będziesz w stanie zobaczyć pozostałości danych z innych procesów na przydzielanych stronach.
Kiedy proces jest ładowany po raz pierwszy, tablica stron jest ładowana i potencjalnie ramki rzeczywistej pamięci są przydzielane do tych stron. Tabela stron lub tabela uzupełniająca zawiera przynajmniej mapę całej pamięci, którą proces może przydzielić. Tutaj również ustawia się początkową przerwę procesu, o której mowa powyżej.
Podczas gdy malloc () może, jeśli proces jest dozwolony, zmienić przerwanie procesu, dodając więcej stron do tabeli strony procesów (strony dodatkowej) w celu spełnienia żądania, miejscem, w którym jeden proces może „uzyskać inny”, jest dane dolna warstwa pamięci rzeczywistej.
W obu tych scenariuszach nowoczesny system operacyjny korzystający ze stronicowania na żądanie lub leniwego przydzielania jeszcze nie przydziela pamięci fizycznej (ramek). System operacyjny po prostu „robi notatki” na temat tego, która pamięć wirtualna dla tego procesu jest uważana za prawidłową. Rzeczywista pamięć jest przydzielana tylko w razie potrzeby.
Pamięć fizyczna lub ramki są przydzielane do procesu, gdy strona wirtualna jest realizowana i odwzorowywana na tabelę stron procesów W tym miejscu istnieje możliwość ujawnienia danych. Dzieje się tak podczas błędu strony. Narażenie wynika z faktu, że poprzedni proces mógł używać tej samej ramki, a jego dane zostały porzucone lub zamienione, aby zrobić miejsce dla bieżącego żądania pamięci fizycznej. System operacyjny musi zachować ostrożność, aby upewnić się, że dane procesów żądających zostały odpowiednio zamienione lub ramka została wyczyszczona (wyzerowana) przed wznowieniem procesu. Jest to również wspomniane powyżej jako „stary, ale rozwiązany” problem.
To sprawia, że nie ma znaczenia, czy pamięć innych procesów została „zwolniona”, czy nie. Kolejna „zwolniona” pamięć procesów nadal znajduje się na stronach przypisanych do tego procesu i zwykle nie jest odwzorowywana aż do zakończenia procesu, ponieważ zostaną one po prostu zamienione, gdy pamięć się wyczerpie lub zostaną w inny sposób eksmitowane. malloc () i free () zarządzają pamięcią wirtualną przypisaną do procesu na poziomie (użytkownika).
W twoim pytaniu twój proces nadal żąda coraz więcej pamięci, teoretycznie, wypychając wszystkie inne procesy z pamięci. W rzeczywistości istnieją strategie alokacji ramek - globalne i lokalne - które również mogą mieć wpływ na odpowiedź. Jest równie prawdopodobne, że proces wymusi zwolnienie pamięci z własnych stron, zanim będzie możliwe przekroczenie systemu operacyjnego i wszystkich innych procesów. Chociaż wykracza to poza początkowe pytanie.
Wszystko to jest dyskusyjne w systemie takim jak MS-DOS. MS-DOS (i inne, prostsze systemy) nie używają pamięci wirtualnej (same w sobie) i można łatwo szturchać i naciskać na inne „procesy” danych.
Dobrymi odniesieniami, które mogą być łatwiejsze do zrozumienia niż kod źródłowy Linuksa, byłby dobry podręcznik dotyczący systemów operacyjnych, Koncepcje systemów operacyjnych Silberscatz, Gavin i Gange lub Projektowanie systemów operacyjnych Andrew Tanenbaum. Również coś takiego jak Nachos z Berkeley lub Pintos ze Stanford to małe systemy operacyjne zbudowane do nauki i zawierające w sobie te same pomysły.
źródło
Próbowałem tego na Ubuntu 16.04 miesięcy temu. Tak jak powiedział 0xACE, nowoczesny system operacyjny przydziela wirtualną stronę zerową po wywołaniu malloc (). Ale jeśli nic nie napiszesz do przydzielonego bufora, nie zostanie on zamapowany w pamięci fizycznej (to znaczy zasada kopiuj przy zapisie), dlatego zawsze będziesz czytać zera z „niezainicjowanego” bloku. Być może istnieje jakiś wbudowany system operacyjny skompilowany z opcją „CONFIG_MMAP_ALLOW_UNITIALIZED” w celu uzyskania lepszej wydajności, w tym przypadku możesz uzyskać to, czego oczekujesz.
źródło
Nie, nie pozwoli to innemu programowi na odczytanie pamięci innej osoby dzięki magii stronicowania . W ten sposób całkowite wykorzystanie pamięci może przekroczyć fizyczny RAM, rozładowując jego część na dysk twardy.
Ponadto maksymalna pamięć, jaką proces może przydzielić, jest arbitralnie ograniczona przez system operacyjny (do 4 koncertów dla architektury 32-bitowej), po czym następne
alloc
wywołanie zwróci błąd braku pamięci.źródło
mlock
).