Я никогда не реализовывал эмуляцию NX, но, зная кое-что о x86, я могу догадаться, как он может работать.
Все это связано с тем, как ядро настраивает вашу глобальную таблицу дескрипторов ., чтобы определить, в каком диапазоне адресов может содержаться код.
Если можно кратко изложить это ... На x86 в 32-битном защищенном режиме те старые "регистры сегментов" из 16-битного кода по-прежнему имеюткакой-то смысл.Регистры сегментов определяют, какая запись в GDT используется.Записи GDT по сути являются диапазоном памяти.Если ядро указывает регистр cs
(сегмент кода) на запись GDT, которая имеет адреса только в диапазоне [x, y], то адреса вне этого диапазона не могут быть выполнены.
Обратите внимание, что это намногоболее грубый, чем бит NX, поскольку бит NX входит в запись таблицы страниц .Таким образом, бит NX позволяет пометить произвольную страницу как неисполняемую, тогда как использование cs
сегментов позволяет указывать (как правило, большой, непрерывный) диапазон как неисполняемый.