В x86 / 64, если включена трансляция страниц и память по виртуальному адресу 0 недоступна (из-за способа отображения физической памяти в виртуальное адресное пространство), 1 ... 4095 также не будут доступны, потому чтовсе эти 4096 адресов соответствуют одной странице памяти и могут быть доступны или недоступны в целом.Хорошей идеей является никогда не отображать память по виртуальному адресу 0. Не отображать это поможет поймать много разыменований нулевого указателя.Здесь ЦП будет генерировать ошибку страницы (также известную как #PF) в несопоставленных местах или местах, требующих более высоких прав, чем выполняемый в данный момент код.
В 64-битном режиме ЦП может реализовывать меньше (48+), чем 64 виртуальныхбиты адреса и 64-битные адреса должны содержать либо все нули, либо все единицы в битах, которые не реализованы (значение 0 или 1 должно совпадать со значением наиболее значимого реализованного бита адреса, причем все они могутинтерпретировать как расширение знака адреса).Такие адреса называются каноническими.Если вы попытаетесь прочитать или записать память, используя неканонический адрес, вы получите общую ошибку защиты (AKA #GP).
Таким образом, в зависимости от ОС (фактически, от ее структуры памяти) ифактический процессор вы можете придумать диапазоны "недопустимых" адресов памяти.Если вы попытаетесь прочитать / записать память ядра из приложения пользовательского режима, вы получите #PF.Если вы попытаетесь прочитать / записать не отображенную память (например, по адресу от 0 до 4095), вы получите #PF.Если вы попытаетесь читать / писать по неканоническому адресу, вы получите # GP.
Это то, что вы ищете?