포인터 스윙글링
Pointer swizzling![]() |
컴퓨터 과학에서 포인터 스위칭은 이름이나 위치에 기초한 참조를 직접 포인터 참조(메모리 주소)로 변환하는 것이다.그것은 일반적으로 실행 파일이나 포인터 기반 데이터 구조와 같은 디스크 파일에서 다시 연결 가능한 객체의 역직렬화 또는 로딩 중에 수행된다.
메모리 포인터를 위치 독립적인 기호나 위치로 대체하는 역작전은 언지즐링(unswizzing)이라고도 하며, 직렬화(저장) 중에 수행된다.
예
다음과 같은 요소를 사용하여 링크된 목록 데이터 구조를 쉽게 만들 수 있다.
구조상의 마디를 짓다 { 인트로 자료; 구조상의 마디를 짓다 *다음에; };
그러나 목록을 파일에 저장한 다음 다시 로드하면 노드들은 거의 동일한 메모리 위치에 로드되지 않기 때문에 모든 링크가 끊어지고 목록을 사용할 수 없게 된다.목록을 유용하게 저장하고 검색하는 한 가지 방법은 각 노드에 고유한 ID 번호를 할당하고 포인터를 다음 노드의 ID 번호를 나타내는 필드로 전환하여 포인터를 해제하는 것이다.
구조상의 node_node { 인트로 자료; 인트로 id_number; 인트로 id_number_of_next_node; };
이와 같은 레코드는 어떤 순서로든 파일에 저장될 수 있고 리스트를 어기지 않고 다시 로드할 수 있다.다른 옵션으로는 다음 노드의 파일 오프셋이나 저장된 레코드 순서에서 파일 오프셋의 위치를 나타내는 숫자를 저장할 수 있다.
이러한 목록을 로드한 후, 번호를 기준으로 노드를 찾는 것은 번거롭고 비효율적이다(시리얼 검색).원래 "다음" 포인터를 사용하여 목록을 가로지르는 것은 매우 빨랐다.목록을 원래 형식으로 다시 변환하거나 포인터를 회전하려면 각 노드의 주소를 찾고 id_number_of_next_node 필드를 다시 오른쪽 노드에 대한 직접 포인터로 변환해야 한다.
지글지글하지 않는 방법
포인터를 지우지 않을 수 있는 양식의 수는 잠재적으로 무제한이지만, 가장 인기 있는 것 중 일부는 다음과 같다.
- 파일에서 점으로 표시된 객체의 간격띄우기
- 레코드 순서에서 특정 대상의 인덱스
- 사용자의 사회 보장 번호와 같이 특정 대상의 소유자가 소유한 고유 식별자. 데이터베이스에서 모든 포인터는 이러한 방식으로 표시되지 않는다(외부 키 참조).
스위징 방법
일반적인 경우에서 스윙하는 것은 복잡할 수 있다.포인터의 참조 그래프는 임의의 주기 수를 포함할 수 있다. 이것은 이전 미사용 값에서 새 주소로 매핑을 유지하는 것을 복잡하게 한다.연관 배열은 매핑을 유지하는 데 유용하며, 너비 우선 검색과 같은 알고리즘은 두 가지 모두 추가 스토리지가 필요하지만 그래프를 가로지르는 데 도움이 된다.다양한 직렬화 라이브러리는 일반적인 스위칭 시스템을 제공한다.그러나 많은 경우, 트리 또는 참조 목록 구조와 같은 가정 단순화로 스위칭을 수행할 수 있다.
스윙의 다양한 유형은 다음과 같다.
- 자동 스위즐링
- 주문형 스윙글링
잠재적인 보안 취약점
보안을 위해, 흔들림과 흔들림이 매우 주의해서 실행되어야 한다.특히 공격자가 특수하게 조작된 파일을 표시하면 예상한 범위와 적절한 범위를 벗어난 주소에 액세스할 수 있다.메모리 보호가 취약한 시스템에서는 이것은 기밀 데이터의 노출이나 실행 가능성이 있는 코드의 수정으로 이어질 수 있다.시스템이 데이터 실행에 대한 가드를 구현하지 않을 경우 다양한 종류의 악성 프로그램의 설치로 시스템이 심각하게 손상될 수 있다.
보호 방법에는 데이터를 애플리케이션에 공개하기 전의 검증이 포함된다.
- 모든 오프셋이 데이터 읽기 범위 내에 있다는 것.
- 인덱스 테이블과 레코드가 가리키는 것도 이와 유사하게 제한된다.
- 그 식별자들은 독특하고, 민감하다면, 암호화된다.
- 모든 가변 길이 데이터는 실제 할당을 초과하지 않는 길이로 제한된다.
- 그 할당은 적당한 규모다.
- 데이터 읽기가 로드되지 않은 할당은 지워지거나 특정 패턴이 로드된다.
![]() |
참고 항목
- 포인터 수정의 간절한 형태인 재배치
참조
추가 읽기
- Wilson, Paul R. (1991-07-01) [June 1991]. "Pointer swizzling at page fault time: efficiently supporting huge address spaces on standard hardware". ACM SIGARCH Computer Architecture News. Vol. 19, no. 4. pp. 6–13. doi:10.1145/122576.122577.
- Kemper, Alfons; Kossmann, Donald (July 1995). "Adaptable Pointer Swizzling Strategies in Object Bases: Design, Realization, and Quantitative Analysis" (PDF). The International Journal on Very Large Data Bases (VLDB). 4 (3): 519–567. doi:10.1007/BF01231646. Archived (PDF) from the original on 2008-07-25. Retrieved 2021-12-08. (49쪽)
- Crawford, Derek (June 1992). Derek's ABC of C. Vol. 2. pp. 340–343.
{{cite magazine}}
:누락 또는 비어 있음title=
(도움말)