데이터 세그먼트
Data segment컴퓨팅에서 데이터 세그먼트(종종 .data로 표기)는 객체 파일의 일부 또는 초기화된 정적 변수, 즉 전역 변수와 정적 로컬 변수를 포함하는 프로그램의 해당 주소 공간입니다.이 세그먼트의 크기는 프로그램 소스 코드의 값 크기에 따라 결정됩니다.
런타임에 변수 값을 변경할 수 있으므로 데이터 세그먼트는 읽기/쓰기입니다.이는 변수가 아닌 정적 상수를 포함하는 읽기 전용 데이터 세그먼트(rodata segment 또는 .rodata)와 대조됩니다.또한 많은 아키텍처에서 읽기 전용으로 사용되는 코드 세그먼트(텍스트 세그먼트라고도 함)와도 대조됩니다.초기화되지 않은 데이터(변수 및 상수 모두)는 대신 BSS 세그먼트에 있습니다.
지금까지 내부 주소 레지스터의 네이티브 크기보다 큰 메모리 주소 공간을 지원할 수 있도록 초기 CPU는 분할 시스템을 구현하여 특정 영역에 대한 오프셋으로 사용하는 작은 인덱스 세트를 저장했습니다.인텔 8086 CPU 패밀리는 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트 및 추가 세그먼트의 4개의 세그먼트를 제공했습니다.각 세그먼트는 실행 중인 소프트웨어에 의해 메모리의 특정 위치에 배치되어 해당 세그먼트 내의 데이터에 대해 동작하는 모든 명령이 해당 세그먼트의 시작에 대해 수행되었습니다.이를 통해 보통 64KB의 메모리 공간에 액세스할 수 있는 16비트 주소 레지스터가 1MB의 메모리 공간에 액세스할 수 있게 되었습니다.
메모리 공간을 개별 블록으로 분할하여 특정 태스크를 오늘날의 프로그래밍 언어와 개념으로 이관하는 것은 여전히 현대 프로그래밍 언어 내에서 널리 사용되고 있습니다.
프로그램 메모리
컴퓨터 프로그램 메모리는 크게 읽기 전용과 읽기/쓰기 두 가지 섹션으로 분류할 수 있습니다.이러한 차이는 마스크 ROM, EPROM, PROM 또는 EEPROM과 같은 읽기 전용 메모리에 메인 프로그램을 보관하고 있던 초기 시스템으로부터 확대되었습니다.시스템이 복잡해지면서 프로그램이 ROM에서 실행되는 대신 다른 미디어에서 RAM으로 로드됨에 따라 프로그램 메모리의 일부를 수정해서는 안 된다는 생각은 유지되었습니다.이들은 프로그램의 .text 세그먼트와 .rodata 세그먼트가 되었고, 나머지 세그먼트는 특정 작업을 위해 다른 세그먼트로 분할할 수 있었습니다.
코드
코드 세그먼트(텍스트 세그먼트라고도 함)는 실행 가능한 코드를 포함하며 일반적으로 읽기 전용이며 크기가 고정되어 있습니다.
데이터.
데이터 세그먼트에는 초기화된 정적 변수, 즉 정의된 값을 가지며 수정할 수 있는 전역 변수와 로컬 정적 변수가 포함됩니다.C의 예는 다음과 같습니다.
int i = 3; char a [ ] = "Hello World";
이러한 변수의 값은 처음에는 읽기 전용 메모리(일반적으로 코드 세그먼트 내)에 저장되며 프로그램의 시작 루틴 중에 데이터 세그먼트에 복사됩니다.
BSS
BSS 세그먼트에는 변수와 상수 모두 초기화되지 않은 정적 데이터, 즉 0으로 초기화되거나 소스 코드에서 명시적으로 초기화되지 않은 글로벌 변수와 로컬 정적 변수가 포함됩니다.C의 예는 다음과 같습니다.
static int i, static char a [ 12 ];
히프
힙 세그먼트에는 동적으로 할당된 메모리가 포함되어 있습니다.일반적으로 BSS 세그먼트의 끝에서 시작하여 거기에서 더 큰 주소로 확장됩니다.malloc, calloc, realloc 및 free에 의해 관리되며, brk 및 sbrk 시스템콜을 사용하여 크기를 조정할 수 있습니다(malloc/calloc/realloc/free 계약을 이행하기 위해 brk/sbrk 및 단일 힙세그먼트를 사용할 필요는 없습니다.또한 mmap/map을 사용하여 인접하지 않은 지역을 예약 또는 예약 해제하는 경우도 있습니다.가상 메모리를 프로세스의 가상 주소 공간에 넣습니다).힙 세그먼트는 프로세스의 모든 스레드, 공유 라이브러리 및 동적으로 로드된 모듈에서 공유됩니다.
스택
스택 세그먼트에는 일반적으로 메모리의 상위 부분에 위치한 LIFO 구조인 콜 스택이 포함됩니다."스택 포인터" 레지스터는 스택의 상단을 추적합니다.이 레지스터는 값이 스택에 "푸시"될 때마다 조정됩니다.1개의 함수 호출에 대해 푸시된 값 집합을 "스택 프레임"이라고 합니다.스택 프레임은 적어도 리턴 주소로 구성됩니다.자동 변수도 스택에 할당됩니다.
스택 세그먼트는 전통적으로 힙세그먼트에 인접하여 서로 향해 성장했습니다.스택 포인터가 힙 포인터를 만났을 때 빈 메모리가 소진되었습니다.주소공간이 크고 가상메모리 기법이 많으면 자유롭게 배치되는 경향이 있지만 일반적으로는 계속 수렴 방향으로 확대됩니다.표준 PC x86 아키텍처에서는 스택은 주소 0을 향해 확장됩니다.즉, 콜 체인의 깊숙한 곳에 있는 최신 아이템은 수치적으로 낮은 주소로 힙에 가깝습니다.일부 다른 아키텍처에서는 반대 방향으로 확장됩니다.
통역 언어
일부 인터프리터 언어, 특히 Perl과[1] [2]Ruby는 데이터 세그먼트와 유사한 기능을 제공합니다.이러한 언어에서는 다음 행이 포함됩니다.__DATA__
(페를) 또는__END__
(Ruby, old Perl)은 코드 세그먼트의 끝과 데이터 세그먼트의 시작을 나타냅니다.이 행 앞의 내용만 실행되고 다음 행 뒤의 소스 파일의 내용은 파일 개체로 사용할 수 있습니다.PACKAGE::DATA
Perl(예:main::DATA
)와DATA
루비로.이것은 여기서 문서(파일 리터럴)의 한 형태로 간주할 수 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ peldata:스페셜 리터럴
- ^ 루비: 오브젝트: __END__
외부 링크
- "C startup". bravegnu.org.
- "mem_sequence.c - sequentially lists memory regions in a process". Archived from the original on 2009-02-02.
- van der Linden, Peter (1997). Expert C Programming: Deep C Secrets (PDF). Prentice Hall. pp. 119ff.