Бит NX (no-execute) — это технология, используемая в ЦП для разделения областей виртуального адресного пространства для хранения данных или инструкций процессора. Операционная система с поддержкой бита NX может помечать определенные области адресного пространства как неисполняемые. Затем процессор откажется выполнять любой код, находящийся в этих областях адресного пространства. Общая техника, известная как защита исполняемого пространства , также называемая Write XOR Execute , используется для предотвращения захвата компьютеров определенными типами вредоносного программного обеспечения путем вставки своего кода в область хранения данных другой программы и запуска своего собственного кода из этой области; один класс таких атак известен как атака переполнения буфера .
Термин NX bit возник в Advanced Micro Devices (AMD) как маркетинговый термин. Intel продвигает эту функцию как XD bit (execute disable). Архитектура MIPS называет эту функцию XI bit (execute inhibit). Архитектура ARM называет функцию, которая была введена в ARMv6 , XN (execute never). [1] Сам термин NX bit иногда используется для описания похожих технологий в других процессорах.
Процессоры x86 , начиная с 80286 , включали аналогичную возможность, реализованную на уровне сегмента . Однако почти все операционные системы для процессоров 80386 и более поздних x86 реализуют модель плоской памяти , поэтому они не могут использовать эту возможность. В записи таблицы страниц (дескрипторе страницы) в этих процессорах не было флага «Исполняемый», пока, чтобы сделать эту возможность доступной для операционных систем, использующих модель плоской памяти, AMD не добавила бит «не выполнять» или NX в запись таблицы страниц в своей архитектуре AMD64 , предоставив механизм, который может контролировать выполнение постранично , а не по целому сегменту.
Intel реализовала похожую функцию в своем процессоре Itanium ( Merced ) с архитектурой IA-64 в 2001 году, но не перенесла ее в более популярные семейства процессоров x86 ( Pentium , Celeron , Xeon и т. д.). В архитектуре x86 она была впервые реализована AMD как бит NX для использования в ее линейке процессоров AMD64 , таких как Athlon 64 и Opteron . [2]
После решения AMD включить эту функциональность в свой набор инструкций AMD64, Intel реализовала похожую функцию бита XD в процессорах x86, начиная с процессоров Pentium 4, основанных на более поздних итерациях ядра Prescott. [3] Бит NX конкретно относится к биту номер 63 (т. е. самому старшему биту) 64-битной записи в таблице страниц . Если этот бит установлен в 0, то код может быть выполнен с этой страницы; если установлен в 1, то код не может быть выполнен с этой страницы, и все, что там находится, считается данными. Он доступен только с длинным режимом (64-битный режим) или устаревшими форматами таблиц страниц Physical Address Extension (PAE), но не с исходным 32-битным форматом таблиц страниц x86, поскольку записи таблицы страниц в этом формате не содержат 64-й бит, используемый для отключения и включения выполнения.
Windows XP SP2 и более поздние версии поддерживают функцию предотвращения выполнения данных (DEP).
В ARMv6 был представлен новый формат записи таблицы страниц; он включает бит «выполнять никогда». [1] Для ARMv8-A , дескрипторов блоков и страниц VMSAv8-64 и дескрипторов блоков и страниц VMSAv8-32 для трансляций на этапе 1 есть биты «выполнять никогда» как для привилегированного, так и для непривилегированного режима, а дескрипторы блоков и страниц для трансляций на этапе 2 есть один бит «выполнять никогда» (два бита из-за функции ARMv8.2-TTS2UXN); дескрипторы таблиц трансляций коротких дескрипторов VMSAv8-32 на уровне 1 есть биты «выполнять никогда» как для привилегированного, так и для непривилегированного режима, а на уровне 2 есть один бит «выполнять никогда». [4]
Начиная с четвертого издания руководства по архитектуре Alpha, DEC (теперь HP) Alpha имеет бит ошибки выполнения в записях таблицы страниц с OpenVMS , Tru64 UNIX и Alpha Linux PALcode . [5]
SPARC Reference MMU для Sun SPARC версии 8 имеет значения разрешений «Только чтение», «Чтение/запись», «Чтение/выполнение» и «Чтение/запись/выполнение» в записях таблицы страниц [6] , хотя не все процессоры SPARC имеют SPARC Reference MMU.
MMU SPARC версии 9 может предоставлять, но не обязан предоставлять, любую комбинацию разрешений на чтение/запись/выполнение. [7] Запись таблицы трансляций в буфере хранения трансляций в архитектуре Oracle SPARC 2011, проект D1.0.0 имеет отдельные исполняемые и записываемые биты. [8]
Записи таблицы страниц для хэшированных таблиц страниц IBM PowerPC имеют бит неисполнения страницы. [9] Записи таблицы страниц для таблиц страниц с радикс-деревом в Power ISA имеют отдельные биты разрешений, предоставляющие доступ на чтение/запись и выполнение. [10]
Записи буфера TLB и записи таблицы страниц в PA-RISC 1.1 и PA-RISC 2.0 поддерживают страницы только для чтения, чтения/записи, чтения/выполнения и чтения/записи/выполнения. [11] [12]
Записи TLB в Itanium поддерживают страницы только для чтения, чтения/записи, чтения/выполнения и чтения/записи/выполнения. [13]
Начиная с двенадцатого издания принципов работы z/Architecture , процессоры z/Architecture могут поддерживать функцию защиты выполнения инструкций, которая добавляет бит в записи таблицы страниц, контролирующий возможность выполнения инструкций из заданного региона, сегмента или страницы. [14]
Биты APX и XN (execute never) были добавлены в VMSAv6 [Virtual Memory System Architecture]