Батут (компьютерный)
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В компьютерном программировании слово «батут» имеет несколько значений и обычно связано с инструкциями перехода (т. е. переходом к различным путям кода).
Низкоуровневое программирование
[ редактировать ]Батуты (иногда называемые векторами косвенного перехода ) — это ячейки памяти, содержащие адреса, указывающие на процедуры обслуживания прерываний , процедуры ввода-вывода и т. д. Выполнение прыгает на батут, а затем немедленно выскакивает или отскакивает, отсюда и термин «батут» . У них много применений:
- Trampoline можно использовать для преодоления ограничений, налагаемых архитектурой центрального процессора (ЦП), которая всегда должна находить векторы в фиксированных местах.
- Когда операционная система загружается на машине с симметричной многопроцессорной обработкой (SMP), активным будет только один процессор — загрузочный процессор. После того, как операционная система настроится, она даст указание другим процессорам перейти к фрагменту батутного кода, который инициализирует процессоры и будет ждать, пока операционная система начнет планировать на них потоки.
Программирование высокого уровня
[ редактировать ]- В некоторых реализациях Lisp трамплин — это цикл, который итеративно вызывает функции, возвращающие thunk ( стиль передачи продолжения ). Одного батута достаточно для осуществления всех передач управления программой; программа, выраженная таким образом, является батутом или в батутном стиле ; преобразование программы в стиль батута — это прыжки на батуте. Программисты могут использовать трамплинные функции для реализации хвостовых рекурсивных вызовов функций в стек-ориентированных языках программирования . [1]
- В Java . батут означает использование отражения , чтобы избежать использования внутренних классов , например, в прослушивателях событий Затраты времени на вызов отражения обмениваются на затраты пространства внутреннего класса. Батуты в Java обычно включают создание GenericListener для передачи событий внешнему классу. [2]
- В Mono Runtime батуты — это небольшие рукописные фрагменты ассемблерного кода, используемые для выполнения различных задач. [3]
- При взаимодействии фрагментов кода с несовместимыми соглашениями о вызовах используется батут для преобразования соглашения вызывающего абонента в соглашение вызываемого абонента.
- Во встроенных системах батуты — это короткие фрагменты кода, которые запускают другие фрагменты кода. Например, вместо того, чтобы писать обработчики прерываний полностью на языке ассемблера, другой вариант — написать обработчики прерываний в основном на C и использовать короткий трамплин для преобразования соглашения о вызовах прерываний на языке ассемблера в соглашение о вызовах C. [4]
- При передаче обратного вызова в систему, которая ожидает вызова функции C , но хочет, чтобы она выполнила метод конкретного экземпляра класса, написанного на C++ , используется короткий батут для преобразования соглашения о вызове функций C в C++. соглашение о вызове методов. Один из способов написать такой батут — использовать thunk . [5] Другой метод — использовать общий прослушиватель . [2]
- В Objective-C батут — это объект, возвращаемый методом, который захватывает и реифицирует все отправленные ему сообщения, а затем «перебрасывает» эти сообщения на другой объект, например, в обмене сообщениями более высокого порядка . [6]
- В GCC компиляторе батут относится к методу реализации указателей на вложенные функции, когда
-ftrampolines
опция включена. [7] Батут — это небольшой фрагмент кода, который создается «на лету» в стеке, когда берется адрес вложенной функции. Батут устанавливает указатель статической ссылки, который позволяет вложенной функции получать доступ к локальным переменным вмещающей функции. Указатель функции тогда является просто адресом батута. Это позволяет избежать использования «толстых» указателей на функции для вложенных функций, которые содержат как адрес кода, так и статическую ссылку. [8] [9] [10] Однако это противоречит желанию сделать стек неисполняемым по соображениям безопасности. - В эзотерическом языке программирования Befunge батут — это инструкция, позволяющая пропустить следующую ячейку в потоке управления .
Стеки без выполнения
[ редактировать ]Некоторые реализации батутов приводят к потере стеков без выполнения (стек NX). в коллекции компиляторов GNU В частности, (GCC) вложенная функция создает батут в стеке во время выполнения, а затем вызывает вложенную функцию через данные в стеке. Батут требует, чтобы стек был исполняемым.
Стеки без выполнения и вложенные функции в GCC являются взаимоисключающими. Если при разработке программы используется вложенная функция, то стек NX незаметно теряется. GCC предлагает -Wtrampolines
предупреждение о состоянии.
Программное обеспечение, разработанное с использованием безопасного жизненного цикла разработки, часто не позволяет использовать вложенные функции из-за потери стеков NX. [11]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Бейкер, Генри Г. (сентябрь 1995 г.). «CONS не должен аргументировать CONS, Часть II: Чейни о MTA» Уведомления ACM SIGPLAN . 30 (9): 17–20. дои : 10.1145/214448.214454 . S2CID 20720831 . Архивировано из оригинала 11 ноября 2016 г.
- ^ Перейти обратно: а б Мюллер, Ганс (31 января 2005 г.). «Утверждение контроля над графическим интерфейсом: команды, значения по умолчанию и пакеты ресурсов» . сегодня.java.net . Батуты . Проверено 6 ноября 2015 г. [1]
- ^ «Батуты» . Монопроект. 8 октября 2022 г.
- ^ Линк, Джозеф М. (1 сентября 2001 г.). «Батуты для встраиваемых систем: минимизация задержки обработчиков прерываний» . Журнал доктора Добба . Архивировано из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
- ^ Стангвик, Эйнар Отто (16 августа 2006 г.). «Мысли в Win32 с C++» . Архивировано из оригинала 15 октября 2012 г.
- ^ Вейхер, Марсель (2004). «Обмен сообщениями более высокого порядка (HOM)» (PDF) . Архивировано (PDF) из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
- ^ фуз (18 ноября 2011 г.). «Реализация вложенных функций» . StackOverflow . Архивировано из оригинала 29 марта 2016 г. Проверено 26 мая 2018 г.
- ^ «Батуты для вложенных функций» . Использование коллекции компиляторов GNU (GCC) . 2018 [2002]. 18.11. Архивировано из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
- ^ «Вложенные функции» . Использование коллекции компиляторов GNU (GCC) . 2018 [2002]. 6.4. Архивировано из оригинала 27 мая 2018 г. Проверено 26 мая 2018 г.
- ^ Брейэль, Томас М. (2013). «Лексические замыкания для C++» (PDF) . Архивировано (PDF) из оригинала 12 декабря 2017 г. Проверено 26 мая 2018 г.
- ^ Уолтон, Джеффри; Манико, Джим; Уолл, Кевин (02 марта 2018 г.) [2013]. «Усиление защиты инструментальной цепочки на основе C» . Открытый проект безопасности веб-приложений (OWASP). Архивировано из оригинала 27 мая 2018 г. Проверено 02 марта 2018 г.