Jak system operacyjny wykrywa naruszenia dostępu do pamięci

12

Skąd system operacyjny (najlepiej Linux) wie, że masz dostęp do lokalizacji pamięci, do której nie masz dostępu?

To pytanie zostało zainspirowane tymi przeklętymi wskazówkami! Widzę to tak: wszystko w komputerach dotyczy kompromisu między szybkością, bezpieczeństwem, integralnością i takimi rzeczami.

Wiem dobrze o mapach pamięci w Linuksie, ale wydaje mi się to trochę niedorzeczne, że jądro sprawdza, czy lokalizacja, do której próbujesz uzyskać dostęp, znajduje się w prawidłowym zakresie za każdym razem, gdy uzyskujesz dostęp. Wygląda na to, że marnowałby tak dużo czasu, który można by poświęcić na robienie czegoś bardziej produktywnego (ale być może mniej bezpiecznego bez kontroli!). A może pamięta wszystkie ostatnie dostępy i sprawdza je przy każdym tyknięciu zegara sprzętowego? (Ale to brzmi niebezpiecznie i po raz kolejny wolno).

Byłem zaskoczony, że na to pytanie nigdzie nie ma odpowiedzi. Zawsze się nad tym zastanawiałem. To sprawia, że ​​myślę, że istnieje sekcja sprzętu, która zrobi to w imieniu systemu operacyjnego, z przyjemnym, wygodnym poziomem abstrakcji. Ale nadal wymagałoby to załadowania map pamięci kolejnych procesów na każdym przełączniku kontekstu, co znów brzmi wolno.

Tak, tak czy inaczej, zaczynam trochę: w jaki sposób system operacyjny wykrywa naruszenie pamięci?

Dzięki

Doddy
źródło

Odpowiedzi:

11

(Poniższa odpowiedź zakłada „nowoczesną” platformę stacjonarną, serwerową lub wyższą (np. Smartfony i coraz więcej mniejszych systemów). W przypadku systemów x86 nowoczesny oznacza 386 i więcej. Następująca odpowiedź zakłada również „Nowoczesny” system operacyjny, taki jak prawie każdy uniks lub Windows od 95.)

Tak się nie dzieje w systemie operacyjnym, dzieje się to w procesorze, a konkretnie w MMU ( jednostce zarządzania pamięcią ) . MMU obsługuje adresowanie wirtualne, przy czym bity tworzące wskaźnik nie wskazują bezpośrednio fizycznej lokalizacji bitów w pamięci.

W typowej jednostce MMU, gdy wskaźnik jest wyłuskany, MMU dzieli bity na dwie grupy: bity wysokiego rzędu tworzą numer strony , a bity niskiego rzędu tworzą adres wewnątrz strony. Większość komputerów i serwerów używa stron o wielkości 4kB. MMU wyszukuje numer strony wirtualnej w tabeli o nazwie TLB (tak zwane „mapy pamięci procesu”). TLB wskazuje numer strony fizycznej, która odpowiada tej stronie wirtualnej. MMU następnie pobiera dane ze strony fizycznej w pamięci.

Jeśli TLB nie zawiera wpisu dla tego konkretnego numeru strony wirtualnej, MMU powiadamia procesor, że nastąpił nieprawidłowy dostęp; jest to zwykle nazywane wyjątkiem.

Pamiętaj, że do tej pory nie wspominałem o systemie operacyjnym. Jest tak, ponieważ cała ta operacja jest niezależna od systemu operacyjnego. System operacyjny wchodzi w grę, ponieważ konfiguruje rzeczy na dwa sposoby:

  • System operacyjny jest odpowiedzialny za przełączanie zadań. Gdy tak się dzieje, jak podejrzewasz, zapisuje bieżącą TLB i zastępuje ją zapisaną TLB dla następnego zaplanowanego zadania. W ten sposób każdy proces ma TLB, więc adres 0x123456w procesie X może nie wskazywać tego samego rzeczywistego miejsca w pamięci RAM, jak ten sam adres w procesie Y, lub może po prostu być nieprawidłowy. Jeśli proces próbuje wyłuskać wskaźnik poza swoją przestrzenią adresową, nie dociera do przestrzeni innego procesu, a raczej nie dochodzi do nikąd .

  • System operacyjny decyduje, co się stanie, gdy zostanie zgłoszony wyjątek. Może zakończyć proces wykonywania nieprawidłowego dostępu do pamięci (błąd segmentacji, ogólny błąd ochrony, ...). Jest to również sposób implementacji wymiany: moduł obsługi wyjątków może zdecydować o pobraniu niektórych danych z przestrzeni wymiany, odpowiedniej aktualizacji TLB i ponownym dostępie.

Pamiętaj, że MMU zapewnia bezpieczeństwo, ponieważ proces nie może zmienić własnej TLB. Tylko jądro systemu operacyjnego może zmieniać TLB. Jak działają uprawnienia do zmiany TLB, wykracza poza zakres tej odpowiedzi.

Gilles „SO- przestań być zły”
źródło
6

1) Awarie segmentowe są wykrywane przez moduł zarządzania pamięcią. Gdy poprosisz o pamięć, system operacyjny prosi jednostkę zarządzającą pamięcią o pobranie części ze sprzętu. Musi być coś, co śledzi wszystkie duże bloki pamięci, które daje ci system operacyjny. Rodzaj systemu rąk, które trafiają do MMU. Ponieważ zna całą pamięć, którą ci dał, może ci również powiedzieć, kiedy próbujesz uzyskać dostęp do lokalizacji pamięci, której nie otrzymałeś z przydziałów, system operacyjny ma specjalnie dla tego zdarzenie, pamięć, której nie posiadasz. W końcu system operacyjny zabija twoją aplikację, powodując awarię lub jej odpowiednik w innych systemach operacyjnych.

Nie wszystkie systemy operacyjne mają tę ochronę. MacOS do 9 tego nie miał, mimo że MMU to obsługiwało. Podobnie jak Win 3.1. Win95 miał pewną ochronę, ponieważ przechodził między brakiem ochrony a dodawaniem.

2) System operacyjny nie zna żadnych szczegółów poza tym. Jeśli masz zbłąkany wskaźnik, który uzyskuje dostęp do pamięci, której nigdy nie przydzieliłeś, to wie. Jeśli masz taki, który przechodzi do innej części Twojej aplikacji, to oczywiście nie wie. Pozwala ci to zepsuć. W tym miejscu otrzymujesz uszkodzone stosy, a zbłąkane wskaźniki z aplikacji zastępują inne części aplikacji.

Tak, możesz wkręcić własne dane. Jeśli masz zbłąkany wskaźnik, który zastępuje własną aplikację, NADZIEJE, że trafiłeś swój stos, ponieważ prawdopodobnie spowoduje to kolejne naruszenie, gdy spróbujesz zwrócić stos, ale jeśli trafisz własne dane, nigdy się nie dowiesz.

Możesz starać się być bardziej rygorystyczny niż „brak ochrony”, istnieje narzędzie o nazwie Electric Fence ( http://perens.com/FreeSoftware/ElectricFence/ ), które oszuka twoje MMU, aby działało trochę więcej i sprawi, że wykryje więcej błędy

Rich Homolka
źródło
OK, czy możesz sprecyzować, jak to działa? Na przykład, skąd wie, że określony proces nie może uzyskać dostępu do określonej lokalizacji? Co mówi mu, do których procesów można uzyskać dostęp? Jak to się rozróżnia? Dzięki
Doddy,
1
@panic - wyszukaj Memory_management_unit w wikipedii i linki z tej strony. Zauważ, że stan procesu obejmuje status MMU. Możesz spędzić semestry na projektowaniu MMU, jego funkcjach i integracji.
mpez0