Ошибка страницы в контексте прерывания - PullRequest
3 голосов
/ 31 января 2011

Может ли сбой страницы возникнуть в обработчике прерываний / атомарном контексте?

Ответы [ 5 ]

7 голосов
/ 31 января 2011

Может, но это будет катастрофа.: -)

1 голос
/ 10 апреля 2013

(Это старый вопрос. Существующие ответы содержат правильные факты, но они довольно тонкие. Я попытаюсь ответить на него более существенным образом.)

Ответ на этот вопрос зависит от того,код находится в ядре (режим супервизора) или в режиме пользователя.Причина в том, что правила доступа к памяти в этих регионах обычно разные.Вот краткая последовательность событий для иллюстрации проблемы (при условии, что память ядра может быть выгружена):

  1. Во время выполнения пользовательской программы происходит прерывание (например, нажатие клавиши / событие диска).
  2. Процессор переходит в режим супервизора и начинает выполнять обработчик в ядре.
  3. Обработчик прерываний начинает сохранять состояние процессора (чтобы пользовательский процесс можно было правильно возобновить позже), но при этомпоэтому он касается части своего хранилища, которое ранее было выгружено.
  4. Это вызывает исключение сбоя страницы.
  5. Чтобы обработать исключение сбоя страницы, ядро ​​должно теперь сохранить состояние процессоракода, который столкнулся с пропуском страницы.
  6. Возможно, он действительно сможет это сделать, если у него есть заранее выделенный пул памяти, который никогда не будет выгружен, но такой пул неизбежно будет ограничен в размере.

Итак, вы видите, что самое безопасное (и самое простое) решение для ядра - гарантировать, что память принадлежит ядрувообще не допускается.По этой причине ошибки страницы не должны возникать в ядре.Они могут возникать, но, как отмечает @adobriyan, это обычно указывает на гораздо большую ошибку, чем простая необходимость пролистывать страницы в некоторой памяти.(Я полагаю, что это так в Linux. Проверьте вашу конкретную ОС, чтобы убедиться, что память ядра не поддерживает разбиение на страницы. Архитектуры ОС действительно различаются.)

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

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

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

1 голос
/ 31 января 2011

Да.

Код для обработчика или критической области может охватывать границу между двумя страницами. Если вторая страница недоступна, то для ее доставки необходима ошибка страницы.

0 голосов
/ 14 сентября 2018

Я думаю, что ответ ДА. Я только что проверил код обработчика ошибок страницы в ядре 4.15 для платформы x86_64. Примите следующее как подсказку. no_context - это классическое ядро.

no_context(struct pt_regs *regs, unsigned long error_code,
           unsigned long address, int signal, int si_code)
{

        /* Are we prepared to handle this kernel fault? */
        if (fixup_exception(regs, X86_TRAP_PF)) {
                /*
                 * Any interrupt that takes a fault gets the fixup. This makes
                 * the below recursive fault logic only apply to a faults from
                 * task context.
                 */
                if (in_interrupt())
                        return;
0 голосов
/ 15 марта 2012

Не знаю, почему ни одно тело не использовало слово «Двойная ошибка»:

http://en.wikipedia.org/wiki/Double_fault

Но это термины, используемые в руководстве Intel:

http://software.intel.com/en-us/articles/introduction-to-pc-architecture/

или здесь:

ftp: //download.intel.com/design/processor/manuals/253668.pdf (см. Раздел 6-38).

Существует также так называемая тройная ошибка, которая, как следует из названия, может также произойти, когда процессор пытается обработать ошибку двойной ошибки.

...