Получайте сигнал о каждой ошибке страницы

Я хочу установить обработчик сигнала в своем приложении, чтобы ядро ​​отправляло сигнал всякий раз, когда оно обрабатывает ловушку ошибки страницы. Конечно, я могу использовать обработчик сигнала SIGSEGV, но меня больше всего интересует обнаружение ошибок страницы, возникающих при копировании при записи. Например, после разветвления (за которым не следует exec) исходный процесс получит ошибку страницы, если попытается записать на какую-либо страницу. Я хочу получать уведомления о таких ошибках страницы. Как я могу этого добиться?


person pythonic    schedule 20.04.2012    source источник
comment
Я подозреваю, что вам придется взломать обработчик ошибок страницы. Будьте очень, очень осторожны и всегда сохраняйте загрузочную резервную копию.   -  person Martin James    schedule 21.04.2012
comment
Что произойдет, если вы возьмете ошибку страницы в обработчике сигнала?   -  person Kristof Provost    schedule 21.04.2012
comment
Вот именно - двойные ошибки в теннисе плохо, а в ядрах еще хуже. Может подойти семафор в невыгружаемом пуле, но для чего-то подобного я бы просто включил счетчик в невыгружаемый пул и заставил драйвер возвращать его при опросе (да, Мартин Джеймс только что предложил опрос для чего-то :)   -  person Martin James    schedule 21.04.2012
comment
ссылка из удаленного ответа: lwn.net/Articles/550555. Возможно, это стало возможным благодаря набору исправлений для обработки сбоев страниц в пользовательском пространстве от Андреа Арканджели. (Но, может быть, только если вы будете делать намного больше работы в пользовательском пространстве?).   -  person Peter Cordes    schedule 20.02.2019
comment
perf stat / perf record -e page-faults также может подсчитывать/записывать события ошибки страницы.   -  person Peter Cordes    schedule 20.02.2019


Ответы (1)


ошибки страницы — это прерывания, обрабатываемые do_page_fault()

http://www.stillhq.com/pdfdb/000446/data.pdf

Сигналы также генерируют прерывание. Разница в том, что прерывание по ошибке страницы передается коду. Есть объяснение того, что делает код. ИМО, всегда генерировать другое прерывание в обработчике прерываний - плохая идея.

Расскажите нам: чего вы пытаетесь достичь? Не так, как вы думаете, это должно быть сделано.

person jim mcnamara    schedule 21.04.2012
comment
Итак, у процесса Linux нет способа узнать, когда произошла ошибка страницы? Я хотел бы напечатать на стандартный вывод адрес, вызвавший ошибку каждой страницы. Это возможно? - person JohnTortugo; 05.02.2014
comment
Нет. Ошибка страницы — это что-то другое; это не проблема, это действительно ожидаемая функция нормальной обработки: прерывание - ОС вызывается, чтобы что-то сделать - в то время как процесс заблокирован от каких-либо действий - может быть, на несколько микросекунд. - person jim mcnamara; 06.02.2014