Piszę moduł jądra, który ma dostęp do pamięci określonego procesu. Zrobiłem anonimowego odwzorowania na niektóre pamięci przestrzeni użytkownika z do_mmap()
:Zmiana flag ochrony pamięci użytkownika z modułu jądra
#define MAP_FLAGS (MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS)
prot = PROT_WRITE;
retval = do_mmap(NULL, vaddr, vsize, prot, MAP_FLAGS, 0);
vaddr
i vsize
są ustawione wcześniej, a połączenie się powiedzie. Po napisaniu do tego bloku pamięci z modułu jądra (przez copy_to_user
), chcę usunąć na nim uprawnienie PROT_WRITE
(tak jak z mprotect
w normalnej przestrzeni użytkownika). Nie mogę znaleźć funkcji, która na to pozwoli.
Podjęto próbę usunięcia mapy regionu i ponownego jej przypisania z odpowiednimi zabezpieczeniami, ale to zeruje blok pamięci, usuwając wszystkie zapisane przeze mnie dane; Ustawienie MAP_UNINITIALIZED
może naprawić, ale ze strony człowieka:
MAP_UNINITIALIZED (od wersji Linuksa 2.6.33)
Nie jasne anonimowych stron. Ta flaga ma na celu zwiększenie wydajności wbudowanych urządzeń . Ta flaga jest honorowana tylko wtedy, gdy jądro zostało skonfigurowane z opcją CONFIG_MMAP_ALLOW_UNINITIALIZED. Z powodu implikacji związanych z bezpieczeństwem ta opcja jest zwykle włączona tylko w urządzeniach wbudowanych (tj. Urządzeniach, w których jedna ma pełną kontrolę nad zawartością pamięci użytkownika).
więc, chociaż może to zrobić, co chcę, to nie byłoby bardzo przenośne. Czy istnieje standardowy sposób osiągnięcia tego, co zasugerowałem?
Dlaczego oh, dlaczego robisz to wszystko w swoim module jądra? Dzięki zdrowo zdefiniowanemu API nie ma powodu, którego nie mógłby zrobić sam proces przestrzeni użytkownika. – mpe
@mpe Powodem, dla którego nie mogę tego zrobić w przestrzeni użytkownika, jest to, że moduł, który piszę, to program ładujący proces; Nie mam żadnego wpływu na kod przestrzeni użytkownika. – nosuchthingasstars
Co masz na myśli przez program ładujący proces? Masz na myśli handler binfmt? – mpe