2016-02-06 10 views
1

Что произойдет, если мы разыграем нулевой указатель в пространстве пользователя и пространстве ядра?Нерезидентная разметка в пространстве пользователя и пространстве ядра

С моей точки зрения, поведение основано на компиляторе, архитектуре и т. Д.

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

поэтому, если мы разыскиваем нулевой указатель в пространстве пользователя, этот адрес недействителен, поэтому коммутатор контекста будет происходить и в ядре на основе прерывания для этого разыменования нулевого указателя «Ошибка сегментации придет или произойдет ошибка ошибки страницы».

в пространстве ядра:

Если мы разыменование указателя NULL есть возможность сбоя системы или ядра может не в состоянии вернуться из этого вызова.

Является ли мое понимание правильным? Или любые другие недостающие сведения, пожалуйста, объясните.

Ref: я понял из этого «What happens in OS when we dereference a NULL pointer in C?»

ответ

2

Ядро отображает страницу в виртуальный адрес 0 во все процессы, без каких-либо разрешений битов. Когда вы пытаетесь получить доступ к этой странице, вы получаете page fault. Процедура ядра, которая обрабатывает ее, выдает SIGSEGVsignal вашему процессу. Если у вас нет обработчика зарегистрированного SIGSEGV, ядро ​​dumped, и вы увидите сообщение об ошибке «Сегментация».

Сторона ядра, все немного отличается. В конце концов, ядро ​​должно быть устойчивым:

  • Если разыменовать происходит и восстановление возможно (например, драйвер трекпад сделал преступление), kernel oops генерируется. Ядро продолжает работать (пока).
  • Если разыменование происходит так, что восстановление невозможно, Oops ведет к kernel panic. Перезагрузитесь.
  • Если по какой-либо причине есть данные, отображаемые на нулевой странице, вы повредите память. Который может привести к панике по пути, остаться незамеченным или даже быть abused for a privilege escalation attack.
+1

: Спасибо, еще одно сомнение, если мы будем разыскивать нулевой указатель в пользовательском пространстве, он также вызовет внутренние системные вызовы правильно?, Так что будет отличаться от пространства пользователя и пространства ядра?, Обработка памяти отличается для обоих? Я слышал, что пользовательское пространство имеет меньше доступа к памяти по сравнению с пространством ядра. Скажите, что вы немного объясните об этом? »Ядро отображает страницу по виртуальному адресу 0 во все процессы без набора битов разрешения». Не могли бы вы объяснить это? – freeworld

+0

Вы должны проверить статью в википедии в виртуальной памяти. Это слишком много, чтобы окунуться в комментарий. Короче говоря, блок управления памятью обрабатывает ваши указатели. Когда вы разыскиваете 0, MMU видит, что его нет, и вызывает ядро. Если адрес действителен, ядро ​​не задействовано. – a3f

+0

Следует отметить, что также можно злоупотреблять тем, что некоторые называют нулевым указателем 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