Kiedy pamięć wirtualna nie jest już tak wirtualna?

0

W systemach Windows, Mac i Linux trwa pamięć wirtualna dla każdego procesu aplikacji na stosie pamięci RAM.

Ale jeśli chodzi o faktyczne wykorzystanie mojej pamięci uzyskującej dostęp do typów danych, gdzie dokładnie zostanie zmapowana moja pamięć i kiedy stanie się fizyczna:

1. Po kompilacji.

2. Podczas kompilacji.

3. Po załadowaniu i wykonaniu.

Pytam, ponieważ ponieważ pamięć musi być chroniona, aby uniknąć nadpisania jądra, nieprawidłowego dostępu lub manipulacji, jak mam traktować pamięć w moim programie, jeśli nie wiem dokładnie, gdzie moja pamięć naprawdę będzie wcześniej, stąd eliminacja jakichkolwiek możliwości bezpośredniego śledź w sumie bity pamięci, których mój program dokładnie użyje.

Łapa dinozaurów
źródło

Odpowiedzi:

4

Przestrzeń adresowa, którą widzi Twój program, ZAWSZE jest wirtualna. (Przynajmniej w każdym nowoczesnym systemie operacyjnym.)
Przydzielasz pamięć, wywołując w tym celu interfejsy API systemu operacyjnego (lub kompilator robi to za Ciebie, gdy definiujesz zmienne w kodzie).
Adresy (lub wskaźniki, niezależnie od tego, jak je nazywa język programowania) zwracane dla tej przydzielonej pamięci są prawidłowe w kontekście twojego programu.
W przypadku pamięci, którą sam przydzieliłeś, jesteś odpowiedzialny za jej przywrócenie do systemu operacyjnego. Jeśli kompilator wykonał czynności w Twoim imieniu, kompilator również uwzględni niezbędne czyszczenie. Po wyjściu z programu system operacyjny wykona również czyszczenie.

Miejsce, w którym rzeczywiste dane programu znajdują się w fizycznej pamięci RAM komputera, jest całkowicie akademickie. Twój system operacyjny odwzoruje wirtualną przestrzeń adresową, którą widzi Twój program, na fizyczną pamięć RAM i / lub przestrzeń wymiany. Sam po prostu nie wiesz, jak to się robi w danym momencie.

Może to być ważne, jeśli programujesz sterownik urządzenia lub komponent jądra, ale oczywiście nie masz wymaganej wiedzy na temat systemów operacyjnych i programowania do tego. Tyle wynika z twojego pytania.
Takie oprogramowanie działa na innym poziomie i może wymagać interakcji z rzeczywistą fizyczną pamięcią RAM. Istnieją specjalne metody i interfejsy API, aby sobie z tym poradzić, ale nigdy nie spotkasz ich w normalnym programie napisanym przez użytkownika.
Inną możliwością jest programowanie niskiego poziomu na urządzeniu wbudowanym, na którym nie ma systemu operacyjnego, który zapewniłby tę warstwę abstrakcji między wirtualną a fizyczną pamięcią RAM. Ponownie: jest to coś dla specjalistów.

Po prostu nie jest to coś, o co będziesz musiał się martwić, jeśli napiszesz poprawne programy zgodnie z zasadami języka programowania.
Oczywiście: jeśli twój program jest niepoprawny (np. Uzyskuje dostęp do pamięci, której nigdy nie przydzielił), program może ulec awarii lub zostanie przerwany przez sam system operacyjny, jeśli system wykryje, że program działa nieprawidłowo. Ważnym aspektem programowania jest ustalenie, co poszło nie tak i rozwiązanie problemu w programie. Nazywa się to debugowaniem.

Tonny
źródło
@Keltari Dzięki ... Myślałem, że poprawiłem wszystkie błędy ortograficzne przed przesłaniem, ale przegapiłem najbardziej oczywisty :-(
Tonny
Bardzo ignorująca odpowiedź
Dinozaur Pawz