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