맨위로가기

트램펄린 (컴퓨팅)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

트램펄린은 인터럽트 서비스 루틴이나 입출력 루틴의 주소를 가진 메모리 공간을 지칭하며, 간접 점프 벡터와 유사한 개념으로 사용된다. CPU의 인터럽트 벡터나 SMP 컴퓨터의 부트스트랩 프로세서와 같은 환경에서 제어 흐름을 간접적으로 전달하는 데 활용된다. 또한, Lisp, Java, Mono 런타임, Objective-C 등 다양한 프로그래밍 환경에서 특정 기능을 구현하거나, 호출 규약을 변환하거나, 코드 조각을 시작하는 데 사용된다. 특히 GCC 컴파일러에서는 중첩 함수의 함수 포인터를 구현하기 위한 기술로 사용되지만, 실행 불가능한 스택과의 호환성 문제로 인해 보안에 영향을 줄 수 있다.

더 읽어볼만한 페이지

  • 컴퓨터 용어 - 중앙 처리 장치
    중앙 처리 장치(CPU)는 컴퓨터 시스템의 핵심 부품으로, 프로그램 명령어를 해석하고 실행하여 데이터를 처리하는 장치이다.
  • 컴퓨터 용어 - 운영체제 서비스 관리
트램펄린 (컴퓨팅)
트램펄린 (컴퓨팅)
종류계산 트램펄린
얇은 트램펄린
중첩 트램펄린
개요
정의컴퓨터 프로그래밍에서 트램펄린은 다른 함수를 호출하는 함수의 루프를 통해 제어를 간접적으로 전송함으로써 직접적인 함수 호출 및 반환을 피하는 프로그래밍 기술이다.
목적일반적으로 스택 오버플로를 방지하거나, 일부 아키텍처에서 허용하지 않는 꼬리 호출 최적화를 구현하거나, 함수 호출의 의미를 수정하는 데 사용된다.
사용 예시
스택 오버플로 방지재귀 함수 호출 시 스택 공간을 효율적으로 관리
특히 깊은 재귀 호출이 필요한 경우 유용
꼬리 호출 최적화일부 언어 또는 환경에서 꼬리 호출 최적화를 지원하지 않을 때 트램펄린을 사용하여 유사한 효과를 얻을 수 있다.
함수 호출 의미 수정함수 호출 전후에 특정 작업을 수행하거나, 호출 순서를 변경하는 데 사용될 수 있다.
AOP (Aspect-Oriented Programming) 구현에 활용될 수 있다.
구현 방식
함수 포인터 사용트램펄린 함수가 호출할 함수를 함수 포인터 형태로 저장하고, 루프 내에서 해당 함수를 호출한다.
콜백 함수 사용트램펄린 함수가 특정 조건에 따라 다른 콜백 함수를 호출하도록 구현한다.
가상 머신일부 가상 머신 환경에서는 트램펄린을 사용하여 함수 호출을 관리하고 최적화한다.

2. 저수준 프로그래밍

저수준 프로그래밍에서 트램펄린인터럽트 서비스 루틴이나 입출력 루틴의 주소를 가지고 있는 메모리 공간을 가리키는 말로, 종종 간접 점프 벡터(Indirect jump vector)라는 용어와 혼용되기도 한다. 트램펄린이라는 용어는 프로그램 컨트롤이 트램펄린으로 '점프'한 직후에 곧바로 다른 루틴의 주소로 다시 '튕겨나가는' 과정과 연관성이 있다.[1]

2. 1. 인터럽트 처리

중앙 처리 장치(CPU)의 인터럽트 벡터아키텍처적인 제약 사항으로 인해 반드시 미리 정해진 메모리 주소에 위치하여야 하는데, 해당 주소에 ''트램펄린''을 설치하여 실제 기능을 구현하는 인터럽트 핸들러가 간접적으로 호출되게 하면 이러한 제약 사항을 극복할 수 있다.[1]

2. 2. 대칭형 다중 처리 (SMP)

대칭형 다중 처리(SMP) 컴퓨터에서 부트스트랩 프로세서를 제외한 나머지 프로세서들은 부팅 후 환경 설정이 마무리된 후에 활성화되는데, 이들 프로세서는 운영 체제에 의해 부팅 후에 제어 흐름이 트램펄린으로 점프되고, 이 트램펄린에서 대기하며 스케줄링되는 쓰레드를 기다린다.[1][2] 운영 체제가 부팅되면 부트스트랩 프로세서인 하나의 프로세서만 활성화된다. 운영 체제가 자체적으로 구성된 후, 다른 프로세서에게 프로세서를 초기화하고 운영 체제가 해당 프로세서에서 스레드 스케줄링을 시작할 때까지 대기하는 트램펄린 코드 조각으로 점프하도록 지시한다.

3. 고수준 프로그래밍

고수준 프로그래밍에서 트램펄린은 다양한 용도로 사용된다.


  • Lisp 구현에서는 thunk를 반환하는 함수(지속 전달 스타일)를 반복적으로 호출하는 루프를 트램펄린이라고 한다. 단일 트램펄린으로 프로그램의 모든 제어 전송을 표현할 수 있으며, 이를 통해 꼬리 재귀 함수 호출을 구현할 수 있다.
  • 자바에서는 내부 클래스 대신 리플렉션을 사용하여 이벤트 리스너 등에서 외부 클래스에 이벤트를 전달하는 'GenericListener'를 생성하는 것을 트램펄린이라고 한다.
  • Mono 런타임에서는 작고 손으로 작성된 어셈블리 코드 조각을 트램펄린이라고 하며, 다양한 작업을 수행하는 데 사용된다.[1]
  • Objective-C에서는 메서드로 전송된 모든 메시지를 캡처하고 재현하여 다른 객체로 전달하는 객체를 트램펄린이라고 하며, 고차 메시징에서 사용된다.
  • 호환되지 않는 호출 규약을 가진 코드를 인터페이스할 때 호출 규약을 변환하거나, 임베디드 시스템에서 인터럽트 핸들러를 C로 작성하고 호출 규약을 변환하는 데 트램펄린이 사용될 수 있다.
  • 난해한 프로그래밍 언어 Befunge에서 트램펄린은 제어 흐름에서 다음 셀을 건너뛰는 명령이다.

3. 1. C/C++

GCC 컴파일러에서 ''트램펄린''은 지역(중첩) 함수의 함수 포인터를 구현하기 위해 스택에 삽입되는 작은 코드 조각이다.[2]

지역 함수가 부모 함수의 지역 변수에 접근하려면 부모 함수의 스택 프레임 주소, 즉 ''정적 링크 포인터''가 필요하다. 지역 함수가 직접 호출될 때는 스택에서 정적 링크 포인터를 유추할 수 있지만, 함수 포인터를 통해 간접적으로 호출될 때는 이 정보를 유추할 수 없다. 이 문제를 해결하기 위해 함수 포인터를 ''뚱뚱하게'' 만들어 지역 함수의 포인터에 부모 함수의 스택 프레임 주소를 ''첨부''하는 방법(Fat function pointer)이 있지만,[3][4][5] 이 방식은 지역 함수의 함수 포인터를 일반적인 함수 포인터와 같은 방식으로 다룰 수 없게 만든다는 단점이 있다.[6]

대신 ''트램펄린''을 사용하면 정적 링크 포인터 문제를 해결하면서도 위와 같은 단점을 없앨 수 있다. 트램펄린은 함수 포인터를 통해 지역 함수를 호출할 때 일종의 ''대리자'' 역할을 한다. 즉, 트램펄린은 호출 직후 정적 링크 포인터를 준비하고 바로 원래의 지역 함수로 제어 흐름을 전달한다. 지역 함수의 주소가 사용될 때 트램펄린의 주소를 대신 제공하면 모든 "함수 포인터를 통한" 지역 함수 호출이 트램펄린을 거치게 된다.

트램펄린이 제공하는 정적 링크 포인터는 트램펄린 코드 자체에 새겨져야 한다. 함수의 스택 프레임 주소는 런타임에 동적으로 결정되므로, 트램펄린 코드 역시 런타임에 스택 상에 즉석으로 삽입되어야 한다. 하지만 이 때문에 스택 전체를 실행 가능한 영역으로 만들어야 하는데, 이는 컴퓨터 보안상 스택을 실행 불가능하게 만드는 원칙과 상충된다.

C/C++에서 콜백을 사용하는 시스템에 C++ 클래스의 특정 인스턴스 메서드를 실행하려는 경우, 트램펄린을 사용하여 C 함수 호출 규약을 C++ 메서드 호출 규약으로 변환할 수 있다.

3. 1. 1. 실행 불가능한 스택 (NX bit)

GCC 컴파일러의 일부 트램펄린 구현은 실행 불가능한 스택(NX 스택)과 상호 양립할 수 없다.[7] 이는 GCC에서 지역 함수의 함수 포인터를 구현하기 위해 프로그램 실행 중스택에 트램펄린 코드를 주입하고, 지역 함수가 포인터로 호출될 때 이 트램펄린을 경유하도록 설계되었기 때문이다. 트램펄린이 실행되려면 스택 메모리실행 권한이 필요하므로, 실행 불가능한 스택 환경에서는 작동할 수 없다.[7]

GCC는 `-Wtrampoline` 옵션을 통해 트램펄린으로 인해 스택이 실행 가능해지는 경우 컴파일러 경고를 출력한다.

보안 개발 수명 주기를 따르는 소프트웨어는 NX 스택이 손실될 수 있으므로 중첩 함수 사용을 허용하지 않는 경우가 많다.

3. 2. Lisp

일부 Lisp 구현에서 트램펄린은 thunk를 반환하는 함수(지속 전달 스타일)를 반복적으로 호출하는 루프이다. 단일 트램펄린으로 프로그램의 모든 제어 전송을 표현할 수 있으며, 이렇게 표현된 프로그램은 트램펄린 처리되거나 '트램펄린 스타일'이라고 한다. 프로그램을 트램펄린 스타일로 변환하는 것을 트램펄린 처리라고 한다. 프로그래머는 트램펄린 함수를 사용하여 스택 기반 프로그래밍 언어에서 꼬리 재귀 함수 호출을 구현할 수 있다.

3. 3. 자바

자바에서 '트램펄린'은 내부 클래스 사용을 피하기 위해 리플렉션을 사용하는 것을 의미하며, 이벤트 리스너 등에서 사용된다. 리플렉션 호출의 시간 오버헤드는 내부 클래스의 공간 오버헤드와 교환된다. 자바의 트램펄린은 일반적으로 외부 클래스에 이벤트를 전달하기 위해 'GenericListener'를 생성하는 것을 포함한다.

3. 4. Mono 런타임

Mono 런타임에서 트램펄린은 다양한 작업을 수행하는 데 사용되는 작고 손으로 작성된 어셈블리 코드 조각이다.[1]

3. 5. Objective-C

Objective-C에서 트램펄린은 해당 메서드로 전송된 모든 메시지를 캡처하고 재현하여 다른 객체로 전달하는 메서드에서 반환되는 객체이다. 이는 고차 메시징에서 사용된다.

3. 6. 기타

호환되지 않는 호출 규약을 가진 코드 조각을 인터페이스할 때, 트램펄린은 호출자의 규약을 호출 대상의 규약으로 변환하는 데 사용될 수 있다. 임베디드 시스템에서 트램펄린은 다른 코드 조각을 시작하는 짧은 코드 조각으로 사용될 수 있다. 예를 들어, 인터럽트 핸들러를 어셈블리 언어로 작성하는 대신, C로 작성하고 짧은 트램펄린을 사용하여 어셈블리 언어 인터럽트 호출 규약을 C 호출 규약으로 변환할 수 있다. 난해한 프로그래밍 언어 Befunge에서 트램펄린은 제어 흐름에서 다음 셀을 건너뛰는 명령이다.

4. 한국의 소프트웨어 개발과 보안

몇몇 트램펄린 구현은 실행 불가능한 스택(NX 스택)을 배제시키는 결과를 초래한다. 특히 GCC 컴파일러의 경우에는 지역 함수의 함수 포인터를 구현하기 위해 프로그램 실행 중스택에 트램펄린 코드가 주입되도록 하고, 지역 함수가 포인터로 호출되는 경우에 이 트램펄린을 경유하여 실행되도록 하는데, 트램펄린이 실행되기 위해선 스택 메모리실행 권한이 필요하다.[7] 따라서 실행 불가능한 스택과 지역 함수 기능은 GCC에서는 상호 양립할 수 없는데, 이 점으로 인해 취약점 없는 소프트웨어를 개발하기 위해서는 지역 함수 사용을 지양하도록 권장되고 있다.

GCC는 `-Wtrampoline` 옵션을 통해 트램펄린으로 인해 스택이 실행 가능해지는 경우에 컴파일러 경고를 출력하도록 하고 있다.

보안 개발 수명 주기를 사용하여 설계된 소프트웨어는 NX 스택의 손실로 인해 중첩 함수의 사용을 허용하지 않는 경우가 많다.

참조

[1] 웹사이트 Trampolines https://github.com/m[...] Mono Project 2022-10-08
[2] StackOverflow Implementation of nested functions https://stackoverflo[...] 2018-05-26
[3] 간행물 Trampolines for Nested Functions http://gcc.gnu.org/o[...] Using the GNU Compiler Collection (GCC) 2018-05-26
[4] 간행물 Nested functions http://gcc.gnu.org/o[...] Using the GNU Compiler Collection (GCC) 2018-05-26
[5] 논문 Lexical Closures for C++ http://www-cs-studen[...] 2018-05-26
[6] 문서 C 언어의 함수 포인터는 함수의 주소 이외에는 어떤 추가 정보도 담고 있지 않다.
[7] 웹인용 C-Based Toolchain Hardening http://www.owasp.org[...] The Open Web Application Security Project (OWASP) 2018-03-02



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com