Помнится, на архитектуре i386 была возможнсть использовать не только страничную, но и сегментную организацию памяти, а за счет таблицы LDT можно в каждой программе иметь кажется 4096 (или сколько-то там) сегментов памяти. Вылезание за их пределы приводило к ошибке. По-идее, это позволяет существенно ограничить ущерб от переполнения буфера.
почему же от этого отказались?
Перемещено beastie из talks