/ / Dlaczego nie ma sygnału SIGSEGV podczas kopiowania podczas zapisu? - zarządzanie pamięcią, system operacyjny, kopiowanie przy zapisie, błąd strony

Dlaczego podczas zapisu nie ma sygnału SIGSEGV? - zarządzanie pamięcią, system operacyjny, kopiowanie przy zapisie, błąd strony

The artykuł na Wikipedii kopiuj-pisz mówi, że kopiowanie przy zapisie jest zwykle realizowane przezdaje stronom dostęp tylko do odczytu, dzięki czemu podczas zapisywania jedna z nich może obsłużyć unikalną stronę pamięci fizycznej. Moje pytanie brzmi więc, dlaczego aplikacja na poziomie użytkownika nie odbiera sygnału SIGSEGV, gdy wystąpi taki błąd strony? artykuł w Wikipedii na temat SIGSEGV mówi, że SIGSEGV jest sygnałem wysyłanym do procesugdy powoduje nieprawidłowe odwołanie do pamięci lub błąd segmentacji. Więc w tym przypadku, czyli w przypadku kopiowania przy zapisie, dlaczego SIGSEGV nie jest wysyłany do procesu.

Odpowiedzi:

2 dla odpowiedzi № 1

Wiem, że minęło trochę czasu, odkąd o to pytano, ale chciałem trochę rozwinąć odpowiedź Alexeya.

Kopiowanie przy zapisie (zakładam, że mówisz o pamięci wirtualnej, a nie o systemach plików) zwykle działa tak:

  1. System operacyjny wie, które strony należy skopiować podczas zapisu. (Są to strony prywatne dla procesu). Strony te są oznaczone w sprzęcie jako tylko do odczytu. Jednak mapa pamięci wirtualnej procesu ma strony oznaczone jako czytelne i do zapisu. Oznacza to, że proces użytkownika uważa, że ​​ma pełny dostęp do danych stron.
  2. Gdy proces użytkownika próbuje napisać na jednej z tych stron, a błąd strony jest generowany, ponieważ procesor rozpoznaje, że strona jest tylko do odczytu (na podstawie wcześniejszych oznaczeń sprzętowych). Błędy strony są podobne do segfault, ale dla jądra zamiast dla procesów użytkownika.
  3. Powoduje to uruchomienie procedury obsługi błędów stronyw jądrze, które patrzy na daną stronę i widzi, że jest to strona prywatna, która nie została jeszcze skopiowana. Program obsługi utworzy kopię strony i oznaczy ją jako zapisywalną.
  4. Następnie moduł obsługi zastąpi adres starej strony nowym adresem w tabeli translacji wirtualnej na fizyczną i zakończy działanie.
  5. Ostatnia instrukcja zostanie ponowiona przez użytkownikaproces w tym momencie, a tym razem zapis się powiedzie, ponieważ nowa strona jest zapisywalna zarówno na mapie pamięci wirtualnej (widok uprawnień użytkownika do procesu), jak i sprzętowej (widok uprawnień jądra).

Błąd strony jest generowany za każdym razem awystępuje błąd segmentacji, ale większość błędów strony jest obsługiwana przez jądro i nigdy nie jest przekazywana do procesu, który spowodował je jako błędy segfault. Istnieje wiele powodów, dla których błąd strony może być obsługiwany na niższym poziomie, w tym:

  • Strona, do której uzyskano dostęp, została przeniesiona na dysk, ponieważ nie była używana przez długi czas. System operacyjny musi przywrócić ją do pamięci, aby proces mógł z niej ponownie skorzystać.
  • Proces uzyskuje dostęp do nowo przydzielonej stronypo raz pierwszy, a rzeczywista strona fizyczna nie została jeszcze przydzielona. System operacyjny musi przydzielić stronę, a następnie wstawić ją do tabeli translacji wirtualnej na fizyczną, zanim pamięć będzie mogła zostać faktycznie użyta.
  • System operacyjny odtwarza dostęp do strony sprzętowejtrik zezwoleń, aby pozwolić mu szukać dostępu do określonej strony. Tak dzieje się w przypadku kopiowania przy zapisie, ale może mieć również inne zastosowania. Rozważ taką technologię wirtualizacji na poziomie systemu operacyjnego, jak kvm, w którym zapis do lokalizacji urządzenia zamapowanego w pamięci w systemie operacyjnym gościa powinien faktycznie prowadzić do pliku lub wyświetlacza w systemie operacyjnym hosta.

1 dla odpowiedzi nr 2

Główną ideą COW jest to, że COW jest całkowicie przejrzysty dla procesu użytkownika, tak jakby w pełni posiadał pamięć bez udostępniania.