Linux: где находится "настоящий" обработчик ошибок сегментации? - PullRequest
3 голосов
/ 24 июня 2009

Если я читаю / пишу / прыгаю по адресу без привязки, т.е.

.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

это вызывает ошибку сегментации.

Интересно, какова действительная часть системы (ядра)? который перехватывает чтение / запись на не сопоставленные адреса (как?) и выбрасывает сигнал "пользовательский режим"?

Ответы [ 3 ]

4 голосов
/ 24 июня 2009

Все вытекает из таблицы ловушек архитектур. Обычно это называется entry.S (разделено на x86 между entry_32 и entry_64.S) и имеет ассемблерную связь, которая делает несколько вещей (в зависимости от конфигурации), прежде чем отправиться в код на C самого ядра.

Таким образом, недопустимый доступ к памяти должен поступать либо через page_fault, либо через general_protection, и, вероятно, в конечном итоге он выполнит force_sig_info, прежде чем окончательно окажется в очереди в пользовательском пространстве в send_signal (kernel / signal.c).

0 голосов
/ 28 сентября 2009

В чипах PowerPC, которые не относятся к «Книге E» (например, последние чипы для встроенных систем), ошибка сегментации начинается с исключения 0x300 (для данных) или 0x400 (для инструкций.) Установлен флаг режима пользователя / супервизора для супервизора MMU выключен, и процессор переходит на адрес 0x300 или 0x400, предоставляя управление операционной системе.

0 голосов
/ 24 июня 2009

Реализовано для разных архитектур. Например, на x86 вы можете проверить источник по адресу:

do_page_fault: linux/arch/x86/mm/fault.c  
...