Как ядро ​​дает сег.вина за такой сценарий? - PullRequest
1 голос
/ 12 мая 2010

У меня есть сомнения в доступе к некоторым неверным данным. Как ОС может вызвать ошибку сегментации для сценария, подобного этому:

Предположим, что фрагмент данных имеет длину 100 байт и выровнен в начале страницы 4K. Если мы получим доступ к действительным данным в первых 100 байтах страницы, это загрузит страницу в память и поместит запись таблицы страниц в TLB. Если мы сейчас попытаемся получить доступ к некоторым недопустимым данным между 100 и 4КБ, поскольку запись уже есть в таблице страниц, нам будет разрешен доступ к неверным данным?

Ответы [ 3 ]

5 голосов
/ 12 мая 2010

Это верно. Но обычно вы не выделяете память непосредственно из операционной системы. Вы обычно выделяете его с помощью некоторой библиотечной функции (new или malloc и т. Д.). Функция библиотеки возьмет 4 КБ (обычно она также выделяет более 4 КБ в одном чанке) и разбивает его на фактические части, которые вы запрашиваете. Поэтому обычно, когда вы запрашиваете 100 байт памяти, эти 100 байт будут «втиснуты» между двумя другими вашими запросами на выделение.

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

2 голосов
/ 12 мая 2010

На самом деле вы можете получить доступ к неверным данным между байтами 100 и 4K страницы, даже если страница не загружена. Ядро знает только о доступах, которые сделаны к несуществующей странице (или к странице, на которой у вас нет прав на чтение / запись). Точное расположение отдельных фрагментов данных на страницах определяется библиотекой C, а не ядром.

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

2 голосов
/ 12 мая 2010

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

...