пользовательские обработчики ошибок страниц и исключений - PullRequest
4 голосов
/ 05 мая 2011

Я пытаюсь понять, можем ли мы добавить нашу страницу обработчики ошибок / исключение обработчики в ядро ​​ / пользовательский режим и дескриптор ошибка, которую мы вызвали, прежде чем вернуть контроль ядру. Здесь задачей будет не изменение существующего кода ядра ( do_page_fault fn ), а добавление пользовательского обработчика, который будет просматриваться при возникновении ошибки страницы или при возникновении исключения

Можно найти такие инструменты, как " kprobe ", которые обеспечивают зацепки при обучении, но, похоже, это не будет служить моей цели.

Будет здорово, если кто-нибудь поможет мне понять это или укажет на хорошие ссылки.

Ответы [ 4 ]

3 голосов
/ 06 мая 2011

Из пользовательского пространства вы можете определить обработчик сигнала для SIGSEGV, так что ваша собственная функция будет вызываться всякий раз, когда будет сделан недопустимый доступ к памяти. В сочетании с mprotect() это позволяет программе управлять собственной виртуальной памятью из пользовательского пространства.

Однако у меня сложилось впечатление, что вы ищете способ перехватить все сбои страниц (основные, второстепенные и недействительные) и вызвать в ответ произвольную функцию kernel, Я не знаю чистый способ сделать это. Когда мне понадобилась эта функциональность в моих собственных исследовательских проектах, я добавил код к do_page_fault(). Это прекрасно работает для меня, но это взломать. Мне было бы очень интересно, если бы кто-нибудь знал о чистом способе сделать это (то есть, который мог бы использоваться модулем ванильного ядра).

1 голос
/ 06 августа 2013

Если вы не захотите изменить способ обработки этих ошибок ядром и просто добавите свой ранее, то kprobes будет служить вашей цели. С ними немного сложно работать, потому что вы получаете аргументы зондируемых функций в структуре, содержащей регистры, и в стеке, и вы должны знать, куда именно компилятор поместил каждый из них. НО, если вам это нужно для определенных функций (известных при создании проб), то вы можете использовать jprobes ( здесь - хороший пример того, как использовать оба), которые требуют функций для точного зондирования те же аргументы, что и у одного (так что нет ошибок в регистрах / стеке).

Вы можете динамически загружать модуль ядра и устанавливать jprobes на выбранные функции без необходимости изменять ваше ядро.

0 голосов
/ 06 августа 2013

Вы можете установить пейджер пользовательского уровня с помощью gnu libsegsev .Я не использовал его, но, похоже, это именно то, что вы ищете.

0 голосов
/ 06 мая 2011

Я не думаю, что это было бы возможно - во-первых, обработчик сбоев страниц - это сложная функция, которая требует прямого доступа к структурам подсистемы виртуальной памяти.

Во-вторых, представьте, что это не будет проблемой, но для того, чтобы написать обработчик ошибок страницы в пространстве пользователя, вы должны иметь возможность зафиксировать ошибку, которая по умолчанию является передачей силы в пространство ядра, поэтому, по крайней мере, вы должны предотвратить это произойдет.

Для этого вам потребуется супервизор, чтобы отслеживать весь доступ к памяти, но вы не можете гарантировать, что код супервизора уже был отображен и присутствует в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...