Jądro Linuksa 5.12 zaadaptowało podsystem KFence do wykrywania błędów podczas pracy z pamięcią

Jądro Linuksa 5.12, które jest w fazie rozwoju, zawiera implementację mechanizmu KFence (Kernel Electric Fence), który sprawdza obsługę pamięci, wychwytywanie przepełnień bufora, dostępów do pamięci po jej zwolnieniu i innych błędów podobnej klasy.

Podobna funkcjonalność była już obecna w jądrze w postaci opcji kompilacji KASAN (dezynfekcja adresu jądra, wykorzystuje Address Sanitizer w nowoczesnym gcc i clang) - jednak została ona ustawiona głównie do użytku debugowania. Podsystem KFence różni się od KASAN dużą szybkością działania, co pozwala na wykorzystanie tej funkcji nawet na rdzeniach w pracujących układach.

Zastosowanie na systemach produkcyjnych umożliwi wychwycenie błędów pamięci, które nie pojawiają się w przebiegach testowych, a pojawiają się jedynie podczas obciążeń lub podczas długotrwałej pracy (przy dużym czasie sprawności). Dodatkowo zastosowanie KFence na systemach produkcyjnych pozwoli znacząco zwiększyć liczbę maszyn biorących udział w sprawdzaniu działania jądra z pamięcią.

KFence osiąga minimalny narzut niezależny od obciążenia poprzez wstawianie stron ochronnych do sterty w stałych odstępach czasu. Po upływie kolejnego okresu ochrony KFence poprzez standardowy system alokacji pamięci (alokator SLAB lub SLUB) dodaje kolejną stronę ochrony z puli obiektów KFence i rozpoczyna nowy raport licznika czasu. Każdy obiekt KFence znajduje się na osobnej stronie pamięci, a strony pamięci wzdłuż lewego i prawego brzegu tworzą strony ochronne, których rozmiar jest wybierany losowo.

W ten sposób strony z obiektami są oddzielone od siebie stronami zabezpieczającymi, które są skonfigurowane tak, aby generować „błąd strony” przy każdym dostępie. Do wykrywania zapisów poza granicami wewnątrz stron obiektowych wykorzystywane są dodatkowo wzorcowe „czerwone strefy”, które zajmują pamięć nieużywaną przez obiekty, pozostającą po wyrównaniu wielkości stron pamięci. —+————+————+————+————+————+— | xxxxxxxxx | O: | xxxxxxxxx | :O | xxxxxxxxx | | xxxxxxxxx | B: | xxxxxxxxx | :B | xxxxxxxxx | | x STRAŻNIK x | J: CZERWONY- | x STRAŻNIK x | CZERWONY- : J | x STRAŻNIK x | | xxxxxxxxx | E: STREFA | xxxxxxxxx | STREFA: E | xxxxxxxxx | | xxxxxxxxx | C: | xxxxxxxxx | :C | xxxxxxxxx | | xxxxxxxxx | T: | xxxxxxxxx | : T | xxxxxxxxx | —+————+————+————+————+————+—

Jeśli zostanie podjęta próba dostępu do obszaru poza granicami buforów, operacja ta wpływa na stronę zabezpieczającą, co prowadzi do wygenerowania „błądu strony”, który przechwytuje KFence i rejestruje informacje o zidentyfikowanym problemie. Domyślnie KFence nie blokuje błędów i wyświetla jedynie ostrzeżenie w dzienniku, ale istnieje ustawienie „panic_on_warn”, które pozwala wprowadzić jądro w stan paniki w przypadku wykrycia błędu.

Źródło: opennet.ru

Dodaj komentarz