Получавайте сигнал за всяка грешка на страницата

Искам да настроя манипулатор на сигнали в моето приложение, така че ядрото да изпраща сигнал всеки път, когато обработва прихващане на грешка на страницата. Разбира се, мога да използвам манипулатора на сигнали 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. Набор от корекции за предаване на грешки в потребителското пространство от Andrea Arcangeli може да направи това възможно. (Но може би само ако вършите много повече работа в потребителското пространство?).   -  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

Сигналите също генерират прекъсване. Разликата е, че прекъсването на грешката на страницата е векторизирано към кода. Има обяснение какво прави кодът. IMO, винаги генерирането на друго прекъсване в манипулатор на прекъсване е лоша идея.

Кажете ни: Какво се опитвате да постигнете? Не както смятате, че трябва да се направи.

person jim mcnamara    schedule 21.04.2012
comment
Така че процесът на Linux няма начин да знае кога е възникнала грешка в страницата? Бих искал да отпечатам на stdout адреса, който е причинил всяка грешка на страницата. Това възможно ли е? - person JohnTortugo; 05.02.2014
comment
Не. Грешката на страницата е нещо друго; това не е проблем, това наистина е очаквана характеристика на нормалната обработка: прекъсване - ОС се извиква да направи нещо - докато процесът стои там, блокиран да прави каквото и да било - може би за няколко микросекунди. - person jim mcnamara; 06.02.2014