2010-09-30 11 views
5

Podczas przechodzenia przez jedną architekturę wbudowanego procesora widziałem blok MMU i wspomniałem głównie o funkcji ochrony pamięci.W jaki sposób jednostka MMU (jednostka zarządzania pamięcią) w procesorze chroni segmenty pamięci

mogę wiedzieć,

Jak MMU czyni tę ochronę i dlaczego jest to potrzebne? Co to znaczy ochrona pamięci?

Jakie są inne zastosowania MMU inne niż ochrona (jak adresowanie wirtualne)?

Należy rozważyć wbudowany system bez systemu operacyjnego.

__Kanu

+0

Potrzebuje tagu 'praca domowa'? –

+0

Niezupełnie.;-) –

+0

Brak dalszych aktualizacji? –

Odpowiedz

14

Dla procesorów, które używają pamięci (większość z nich) istnieje pewien rodzaj interfejsu pamięci, niektóre mają nazwy (np. Amba, axi, wishbone), inne nie. Z punktu widzenia procesorów jest to adres i dane i proszę albo przeczytać, albo napisać, co jest pod tym adresem. W dawnych czasach miałbyś jeden autobus, a twój flesz, baran i urządzenia peryferyjne zasiadałyby w tym autobusie patrząc na pewne (zazwyczaj górne) fragmenty adresu, aby określić, czy są one adresowane, a jeśli tak, to czytaj dalej lub wskocz na magistrala danych w przeciwnym razie pozostaje trójpromotowa. Dzisiaj, w zależności od układu, itp., Niektóre z tych dekodowania pamięci odbywają się w rdzeniu lub w jego pobliżu, a twój publiczny interfejs do rdzenia lub układu może być kilkoma magistralami, może to być konkretna magistrala flash i konkretny autobus szyny i konkretny dramat bus, itp.

Pierwszy problem z płaską przestrzenią adresową, nawet jeśli został podzielony na flash i ram, część pamięci jest płaska, adres 0 do N-1 dla N bajtów. W przypadku niewbudowanego systemu operacyjnego, aby ułatwić ludziom życie, gdyby program mógł w pewien sposób zakładać, że wszystkie zaczynają się od adresu 0 lub adresu 0x100 lub adresu 0x8000, zamiast konieczności kompilacji w jakiejkolwiek innej wolnej pamięci jest miejsce lub system operacyjny nie musi całkowicie przenosić programu z mniejszej pamięci i zastępować go innym podczas przełączania zadań. Najłatwiejszym sposobem było wykorzystanie segmentu inteli: schematu odsunięcia. Programy zawsze zaczynały się w tym samym miejscu, ponieważ segment kodu został skorygowany przed uruchomieniem programu i zastosowano przesunięcie do wykonania (bardzo uproszczony widok tego modelu), gdy przełączanie zadań między programami właśnie zmieniłeś segment kodu, przywróć komputer do następny program. Jeden program może mieć adres 0x1100, a drugi 0x8100, ale oba programy sądzą, że są pod adresem 0x0100. Łatwy dla wszystkich programistów. MMU zapewniają tę samą funkcjonalność, biorąc ten adres na magistrali procesora i nazywając go wirtualnym adresem, mmu zwykle siedzi blisko procesora między interfejsem pamięci procesorów a resztą układu/świata. Aby ponownie wyświetlić adres 0x0100 w mmu, sprawdź go w tabeli i przejdź do adresu fizycznego 0x0100, a po przełączeniu zadania zmień tabelę tak, aby następne pobranie 0x0100 przechodziło do 0x1100. Każdy program myśli, że działa pod adresem 0x0100, łączenie, kompilowanie, rozwijanie, ładowanie i wykonywanie kodu jest mniej bolesne.

Następną funkcją jest buforowanie, ochrona pamięci itp. Tak więc procesor i jego kontroler pamięci mogą dekodować niektóre adresy przed osiągnięciem mmu, być może niektóre rejestry rdzenia i być może same kontrolki mmu. Ale inne rzeczy, takie jak pamięć i urządzenia peryferyjne, mogą być adresowane po drugiej stronie mmu, po drugiej stronie cache, która często jest następną warstwą cebuli poza mmu. Podczas odpytywania portu szeregowego, na przykład w celu sprawdzenia, czy dostępny jest inny bajt, nie chcesz, aby dostęp do danych był buforowany tak, aby pierwszy odczyt rejestru statusu portu szeregowego faktycznie wyszedł na magistrali fizycznej i dotknął portu szeregowego, a następnie wszystkie następnie czyta przeczytaną nieaktualną wersję w pamięci podręcznej. Chcesz tego dla wartości pamięci RAM, celu pamięci podręcznej, ale dla niestabilnych rzeczy, takich jak rejestry stanu, jest to bardzo złe. Tak więc w zależności od systemu prawdopodobnie nie będzie można włączyć pamięci podręcznej danych, dopóki nie zostanie włączone mmu.Interfejs pamięci na ARM ma na przykład bity kontrolne, które wskazują, jaki to jest dostęp, czy jest to niekwalifikowalny dostęp do pamięci podręcznej, część serii, tego typu rzeczy. W ten sposób można włączyć buforowanie instrukcji niezależnie od buforowania danych, a bez wartości mmu przekaże te sygnały sterujące bezpośrednio do kontrolera pamięci podręcznej, który jest następnie podłączony do świata zewnętrznego (jeśli nie obsługiwał transakcji). Tak więc pobranie instrukcji może zostać zbuforowane ze wszystkich innych elementów, które nie są buforowane. Ale do bufora danych ram dostępu, ale nie rejestru stanu z portu szeregowego, co musisz zrobić, to skonfigurować tabele dla mmu i w środowisku osadzonym możesz po prostu mapować ram jeden do jednego, co oznacza adres 0x1000 wirtualny staje się 0x1000 fizyczne , ale teraz możesz włączyć bit pamięci podręcznej danych dla tego fragmentu pamięci. Następnie dla portu szeregowego możesz odwzorować adresy wirtualne na fizyczne, ale wyczyścisz bit aktywacji pamięci podręcznej dla tego fragmentu pamięci. Teraz możesz włączyć pamięć podręczną danych, odczyty pamięci są teraz buforowane (ponieważ sygnały kontrolne przekazywane przez mmu są oznaczone jako takie, ale dla dostępu do rejestru sygnały sterujące wskazują, że nie można ich zapisać w pamięci podręcznej).

Z pewnością nie musisz mapować wirtualnie na fizyczny jeden do jednego, zależy to od wbudowanego lub niewłączonego systemu operacyjnego, itp. Ale to jest miejsce, w którym wchodzi ochrona. Najłatwiej zobaczyć w systemie operacyjnym. Aplikacja w warstwie aplikacji nie powinna mieć możliwości dostępu do chronionej pamięci systemowej, jądra itp. Nie powinna być w stanie wyłuskać miejsca w pamięci innych aplikacji. Tak więc po włączeniu aplikacji tabele mmu odzwierciedlają dostępną pamięć i dostęp do pamięci, do której nie ma dostępu. Każdy adres niedozwolony przez program jest przechwytywany przez mmu, generowany jest wyjątek/błąd (przerwanie), a jądro/nadzorca przejmuje kontrolę i może sobie poradzić z tym programem. Możesz zapamiętać termin "ogólny błąd ochrony" z wcześniejszych dni w systemie Windows, zanim marketing i inne grupy zainteresowań w firmie zdecydowały, że powinniśmy zmienić nazwę, to było wprost z podręcznika wywiadu, że przerwanie zostało zwolnione, gdy miałeś wadę które nie pasowały do ​​innych kategorii, takich jak pytanie wielokrotnego wyboru w teście A bob, B ted, C alice, D żadnego z powyższych. Ogólna usterka ochrony nie była żadną z powyższych strategii, ale jest najczęstszym trafieniem, ponieważ tak właśnie było, gdy program próbował uzyskać dostęp do pamięci lub wejścia/wyjścia poza przydzieloną mu przestrzeń pamięci.

Inną korzyścią z mmus jest malloc. Przed mmus alokacja pamięci musiała wykorzystywać schematy do ponownego rozmieszczenia pamięci, aby zachować duże puste bloki pośrodku. dla tego następnego dużego malloc, aby zminimalizować "z 4meg za darmo dlaczego mój 1kbajtowy podział się nie powiódł?". Teraz, podobnie jak dysk, przycinasz przestrzeń pamięci na te 4kbyte lub kilka takich rozmiarów. Malloc, który ma rozmiar mniejszy lub mniejszy, pobiera dowolną porcję w pamięci za pomocą wpisu tabeli mmu, aby wskazać na niego i nadać wywołującemu adres wirtualny powiązany z tym wejściem mmu. Potrzebujesz 4096 * 10 bajtów, nie musisz szukać tyle pamięci liniowej, ale znaleźć 10 liniowych wpisów w tabeli mmu, wziąć 10 kawałków pamięci (niekoniecznie sąsiednich) i umieścić ich fizyczne adresy w wpisach 10 mmu.

Najważniejsze jest to, "jak" to robi, że zwykle znajduje się pomiędzy procesorem a pamięcią podręczną lub jeśli nie ma pamięci podręcznej fizycznej szyny pamięci. Logika mmu sprawdza adres, używa go do zaglądania do tabeli. Bity w tabeli zawierają adres fizyczny plus niektóre sygnały kontrolne, które zawierają pamięć podręczną, oraz pewien sposób wskazania, czy jest to prawidłowy wpis, czy chroniony region. Jeśli ten adres jest chroniony, mmu uruchamia przerwanie/zdarzenie z powrotem do rdzenia. Jeśli jest poprawna, modyfikuje adres wirtualny, aby stał się adresem fizycznym na innym/poza mmu, a bity, takie jak bit pamięci podręcznej, służą do informowania o tym, co jest po drugiej stronie mmu, jaki rodzaj transakcji to jest, instrukcja, dane, cacheable, burst, itp. W przypadku osadzonego systemu operacyjnego, który nie jest osem, potrzebny może być tylko jeden stolik mmu. Szybkim sposobem w systemie operacyjnym do wykonywania ochrony na przykład byłoby posiadanie tabeli na aplikację lub podzestaw tabeli (które drzewo przypomina strukturę katalogów), tak, że po przełączeniu zadań wystarczy zmienić tylko jedną rzecz, początek tabeli lub początek jednej gałęzi drzewa w celu zmiany adresów wirtualnych na fizyczne i przydzielonej pamięci (ochrony) dla tej gałęzi drzewa.

+0

To naprawdę ma sens z koncepcją MMU. Dzięki! –

+0

dodać do myśli o malloc, ponieważ jesteś w wirtualnej przestrzeni adresowej, która może być znacznie większa niż ilość pamięci fizycznej masz większą szansę na znalezienie liniowych wpisów mmu tabeli. Nie jest tak, że możesz mieć 100 * 4096 bajtów pamięci w stercie, aby zarządzać bezpośrednio z fizycznym dostępem, a teraz masz tylko 100 mmu wpisów w tabeli w tym samym systemie, możesz mieć setki wpisów w tabeli mmu, z których możesz zarządzać 100 blokami pamięci fizycznej. –

3

Zabezpieczenie pamięci oznacza, że ​​każdy proces w systemie działa w jego własnej przestrzeni wirtualnego adresu w istocie, każdy proces przebiega tak, jakby to ma pamięć główną systemie wszystko do siebie. Oznacza to również, że jeden proces nie może zmienić pamięci zarezerwowanej dla innego procesu; ma to krytyczne znaczenie dla stabilności systemu i bezpieczeństwa (na przykład program nie może po prostu przeskanować pamięci systemowej w celu znalezienia właśnie wpisanego hasła).

Istnieje wiele, wiele innych funkcji dostarczanych przez MMU (pamięć wirtualna, dynamiczne przenoszenie itp.).

To właśnie i dlaczego. Aby odpowiedzieć "jak", powinieneś wykonać trochę dalej: reading.

7

MMU (moduł zarządzania pamięcią) to podstawowy blok systemów, które chcą mieć oddzielne i chronione obszary pamięci. Zamierzam zachować to proste, ponieważ można napisać całe książki o sprzęcie do zarządzania pamięcią i strategiach ...

Bez ochrony program uruchomiony w dowolnym procesie mógłby uzyskać dostęp do pamięci dowolnego innego procesu. Nawet jeśli zignorujesz implikacje związane z bezpieczeństwem, oznacza to, że błąd w jednym programie może zastąpić pamięć należącą do innego procesu. Nie jest łatwo debugować tę klasę problemu, ponieważ objawy ujawniają się bardzo daleko od przyczyny.

Potrzebna jest więc pewna zasada organizacyjna, aby każdy proces mógł tylko widzieć i modyfikować przypisaną do niego pamięć. A ponieważ robią się błędy, ważne jest, aby ta organizacja była wspierana przez sprzęt, tak aby nawet przypadkowy dostęp do niewłaściwej części pamięci był trudny.

Zaletą tego jest to, że staje się możliwe, że mapa pamięci każdego procesu wygląda identycznie. Łącznik może zlokalizować każdy program pod tym samym adresem początkowym, umieścić stos i stertę w przewidywalnych obszarach i zarezerwować pamięć dla interakcji z jądrem.

MMU jest komponentem sprzętowym, który implementuje tłumaczenie z adresów logicznych, które proces wykorzystuje do adresów fizycznych, z których korzysta sprzęt. Zapewnia także funkcje bezpieczeństwa, takie jak oznaczanie tylko niektórych części pamięci jako wykonywalnych. Dostarcza struktur danych, które jądro potrzebuje do implementacji wymiany procesów i pamięci wirtualnej, aby strony pamięci należące do procesu A nie były widoczne w procesie B, ale zarówno A, jak i B mogą być widoczne przez zaufane jądro.

Aby osiągnąć ten cel w praktyce, pamięć fizyczna jest podzielona na strony, zazwyczaj o rozmiarze 4KB. Każdy adres logiczny jest podzielony na numer strony i przesunięcie. Numery stron indeksują tabelę w MMU, która tłumaczy każdą stronę logiczną na jakiś fizyczny adres. Tłumaczenie to dzieje się podczas każdego cyklu dostępu do pamięci. Pojedyncza strona fizyczna może być odwzorowana na żadne procesy (prawdopodobnie w puli wolnych stron), dokładnie jeden lub kilka.

Stos, dane i stertę procesu składa się zazwyczaj ze stron odwzorowanych na dokładnie ten sam proces. Pomaga to zapobiec wpływowi błędów w jednym procesie na inne, ponieważ każdy proces może zapisywać tylko na własnych stosach, danych i stronach sterty.

Jeśli ta sama strona pamięci fizycznej jest mapowana na więcej niż jeden proces, jest dla nich widoczna. W ten sposób udostępniana jest biblioteka DLL w systemie Windows lub .so na systemie Unix: strony zawierające jej tekst programu są odwzorowywane na każdy proces, który jest z nią powiązany.

MMU posiada mechanizm, który zgłasza wyjątek podczas uzyskiwania dostępu do strony, która nie została przyporządkowana do procesu. Obsługa tego wyjątku umożliwia zaimplementowanie pamięci wirtualnej i zwiększenie ilości pamięci przydzielonej do procesu w miarę zmiany jego potrzeb.

+1

Ok. A co z systemem bez systemu operacyjnego obsługującego MMU? oznacza to, w jaki sposób MMU jest zdefiniowany w systemie osadzonym bez systemu operacyjnego? –

+2

@Renjith G: Bez systemu operacyjnego zazwyczaj konfigurowałbyś MMU w pojedynczą przestrzeń adresową, często z bezpośrednim mapowaniem fizycznym = wirtualnym. Możliwe, że skonfigurujesz przestrzeń kodu jako tylko do odczytu, aby chronić ją przed przypadkową lub złośliwą modyfikacją. Jednak brak systemu operacyjnego lub RTOS implikuje operację pojedynczego wątku/procesu, więc możliwość ochrony jednego wątku lub przetwarzania przestrzeni danych od innego nie stanowi problemu. – Clifford

+0

Dzięki za komentarz. –