Что произойдет, если мы разыграем нулевой указатель в пространстве пользователя и пространстве ядра?Нерезидентная разметка в пространстве пользователя и пространстве ядра
С моей точки зрения, поведение основано на компиляторе, архитектуре и т. Д.
, но в общем случае для каждой программы пользовательского пространства, выделенной виртуальной памятью, а пейджинг используется для перевода виртуального адреса на физический адрес с использованием таблиц страниц.
поэтому, если мы разыскиваем нулевой указатель в пространстве пользователя, этот адрес недействителен, поэтому коммутатор контекста будет происходить и в ядре на основе прерывания для этого разыменования нулевого указателя «Ошибка сегментации придет или произойдет ошибка ошибки страницы».
в пространстве ядра:
Если мы разыменование указателя NULL есть возможность сбоя системы или ядра может не в состоянии вернуться из этого вызова.
Является ли мое понимание правильным? Или любые другие недостающие сведения, пожалуйста, объясните.
Ref: я понял из этого «What happens in OS when we dereference a NULL pointer in C?»
: Спасибо, еще одно сомнение, если мы будем разыскивать нулевой указатель в пользовательском пространстве, он также вызовет внутренние системные вызовы правильно?, Так что будет отличаться от пространства пользователя и пространства ядра?, Обработка памяти отличается для обоих? Я слышал, что пользовательское пространство имеет меньше доступа к памяти по сравнению с пространством ядра. Скажите, что вы немного объясните об этом? »Ядро отображает страницу по виртуальному адресу 0 во все процессы без набора битов разрешения». Не могли бы вы объяснить это? – freeworld
Вы должны проверить статью в википедии в виртуальной памяти. Это слишком много, чтобы окунуться в комментарий. Короче говоря, блок управления памятью обрабатывает ваши указатели. Когда вы разыскиваете 0, MMU видит, что его нет, и вызывает ядро. Если адрес действителен, ядро не задействовано. – a3f
Следует отметить, что также можно злоупотреблять тем, что некоторые называют нулевым указателем deref в пользовательском пространстве. Рассмотрим «char x [42]; overflow_array (x, 42); 'vs' char x [42]; overflow_array (42, x); 'где' overflow_array' запускает какое-то условие переполнения буфера ... Они должны оба сжиматься, чтобы: let * a * быть выражением 'x [42 + y] = something_else;' и * b * be выражение '42 [x + y] = something_else;' where * a * расширяется до '* (x + 42 + y)' и * b * расширяется до '* (42 + x + y)'; должно быть тривиально видеть, как эти два выражения эквивалентны ...Теперь рассмотрим 'null_pointer [x + y]' vs 'x [null_pointer + y]' ... – Sebivor