Я размышлял над построением своего протенького, но безопасного процессора, и пришел к некоторому концепту.
Одна из основных вещей, это отдельный контекстный стек, указатель на который доступен только защищенного режима, и отдельная контекстная шина, возможно выходящая на свой кэш, возможно просто на отдельную память, в зависимости от архитектуры. Из этого кэша контекст может медленно сливаться в основную память, при закрытии строки. Кстати, MMU может тоже может помечать эту страничку как страницу стека, и давать доступ к ней, только этой шине.
К чему это приведет?
Контекстная шина процессора, может быть достаточно широкой, вплоть до передачи всех регистров параллельно за один такт. Теоретически, это позволит делать вызов функции за один (или несколько) тактов, и при этом не сохранять не только регистр возврата, но и другие временные регистры, или регистры передающие параметры. С защитой все понятно, все становится намного лучше. Адрес возвртата недоступен, и его не только не перезапишут, но и не узнают.
Но теперь самое интересное. Если шина широкая, то можно реализвать команду отката значения регистра на начальное значение. Т.е. предположим в функцию передавались аргументы, теперь, регистр с аргументом, может быть использован как временный, а в нужный момент, его значение можно откатить на начальное. Отсается только не откатывать значения регистров, которые возвращают результат, при возврате из функции. Теоретически, можно даже уложиться в ARM ABI, только комилятору, нужно будет убрать пролог и эпилог функции (это будет делаться аппаратно на параллельной шине).
Как считаете, стоит ли?
Вот что мне ответил ChatGPTТы описываешь очень интересный и продвинутый подход к организации стека вызовов и сохранению контекста процессора, который действительно может дать ряд преимуществ как по производительности, так и по безопасности. Позволь мне прокомментировать и расширить некоторые из твоих идей.
Отдельный стек для адресов возврата и контекста
Аппаратная шина стека:
Идея выделить отдельную шину для стека адресов возврата и контекста действительно может ускорить операции сохранения и восстановления. Если эта шина реализована аппаратно и не связана напрямую с основной памятью, это позволит выполнять операции push/pop почти за один такт, значительно уменьшая накладные расходы при вызове функций и обработке прерываний.
Защищённый доступ:
Ограничение доступа к стеку возвратов только защищённым режимом работы процессора — отличная идея с точки зрения безопасности. Это позволит предотвратить атаки, связанные с переполнением стека (stack smashing), так как пользовательский код не сможет напрямую изменить адрес возврата.
Сохранение и откат регистров:
Возможность аппаратного отката регистров и состояния второго стека до исходных значений за один такт — очень удобная функция. Это может упростить реализацию функций с сохранением контекста, повысить надёжность и упростить отладку.
Расширение набора инструкций
Введение инструкций для быстрого сохранения/восстановления контекста, отката регистров и управления отдельным стеком контекста — это мощный инструмент, который может повысить эффективность и безопасность программ.
Однако расширение ISA (Instruction Set Architecture) требует серьёзной проработки, поддержки со стороны компиляторов, отладчиков и операционных систем.
Безопасность и изоляция кода
Запрет на чтение констант из кода и хранение их в отдельной области памяти, доступной только для чтения, — классический приём повышения безопасности. Это усложняет анализ и модификацию кода вредоносными программами.
Современные процессоры уже используют подобные техники (например, W^X — Write XOR Execute), но твоя идея может быть расширена и усилена.
Возможные сложности и вызовы
Совместимость:
Введение такого аппаратного механизма потребует поддержки на уровне компиляторов, операционных систем и существующего ПО. Это большой вызов с точки зрения экосистемы.
Сложность аппаратной реализации:
Реализация отдельной шины стека и дополнительного набора инструкций усложнит дизайн процессора, что может увеличить стоимость и энергопотребление.
Обучение и адаптация:
Разработчикам ПО и инструментам потребуется время, чтобы освоить новые возможности и правильно их использовать.
Итог
Твоя концепция — это пример архитектурного решения, которое может значительно повысить безопасность и производительность, особенно в критичных по времени и безопасности приложениях. Подобные идеи иногда реализуются в специализированных процессорах (например, в системах с аппаратной поддержкой защищённых зон, типа ARM TrustZone или Intel SGX), но широкого распространения пока не получили.
Если интересно, могу помочь обсудить, как такие идеи можно было бы прототипировать или какие существуют аналогичные решения в современных архитектурах. Что думаешь?