
Segmentation Fault: как оно устроено?
klewy 49 минут назад Segmentation Fault: как оно устроено? Средний 4 мин 1.7K C++ * Linux * Операционные системы Программирование * Туториал ВступлениеSegmentation faultНаверняка, далеко не один раз в жизни вы наблюдали...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: klewy 49 минут назад Segmentation Fault: как оно устроено? 7K C++ * Linux * Операционные системы Программирование * Туториал ВступлениеSegmentation faultНаверняка, далеко не один раз в жизни вы наблюдали сообщение об ошибке со следующим содержанием: "segmentation fault (core dumped)" - эта ошибка настолько популярна, что о ней давно уже слагают легенды, и немало бойцов пало в противостоянии с этой ошибкойРаспространенные примеры:int arr; int abc = arr; // out-of-bounds обращение к массиву // или int* ptr = nullptr; *ptr = 20; // разыменование null pointer Segmentation Fault - это понятие на уровне ОС, сигнал, который операционная система посылает процессу, говоря о том, что произошла ошибка обращения к памяти. Если копнуть глубже, то это понятие исходит из исключений (exceptions) на уровне ниже, на уровне архитектуры процессора, а именно - Page Fault (чаще всего) / General Protection Fault, которые происходят при обращении к памяти, при котором что-то да точно не так (об этом дальше).
Virtual MemoryНа большинстве современных систем используется подход virtual memory к управлению памятью. Для понимания segmentation fault и конкретно этой статьи требуется хотя бы общее понимание принципа работы данного подхода. Основная частьВиды segmentation faultsНа самом деле, существует несколько типов segmentation fault:SEGV_MAPERR - обращение к несуществующему участку памяти.
Технические детали
SEGV_ACCERR - ошибка прав доступа к участку памяти. Для начала небольшой ликбез по тому, как хранится информация о памяти в ядре Linux. Рассмотрим картинку:Устройство памяти в Linuxmm_struct - структура, отвечающая за хранение всей информации об адресном пространстве процесса.
Так называемый memory descriptor. vm_area_struct - структура, хранящая информацию об отдельном регионе памяти: его начало, конец, флаги доступа и прочее. Так называемая memory region.
SEGV_MAPERRЭтот тип segmentation fault означает, что адрес, по которому хотели совершить какое-либо действие (read, write, execute), вообще не замаплен в адресном пространстве процесса - то есть не принадлежит ни одному региону vm_area_struct. Пример 1auto arr = std::make_unique(10); std::println("Trying to access addr. {:#018x}", (uintptr_t)(arr.
Отраслевые последствия
get() + 1000000)); int val = arr. get(); Программа выводит адрес, по которому собирается читать int - "0x00005587db62ad30". Запомним его и выведем регионы адресного пространства процесса с помощью cat /proc/{pid}/maps (показаны только важные):...
5587ca00f000-5587ca010000 rw-p 0001f000 08:03 22957888 /bin/app 5587db248000-5587db27b000 rw-p 00000000 00:00 0 7f215e000000-7f215e024000 r--p 00000000 08:03 14552434 /usr/lib/libc. 6 7f215e024000-7f215e195000 r-xp 00024000 08:03 14552434 /usr/lib/libc. Поскольку arr аллоцирован в heap, смотрим его диапазон адресов: 0x00005587db248000-0x00005587db27b000.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




