답변:
이는 부분적으로 CPU 설계에 기반을두고 있습니다. 1980 년대에 들어서면서 대부분의 컴퓨터는 16 비트 아키텍처를 가졌지 만, 그래서 포인터는 가상 주소 공간에 접근 할 수있다. 2의 16 (65536) 바이트입니다. 이것은 자연스럽게 너무 제한적이라고 간주되었습니다. 코드 세그먼트가 다른 세그먼트와 분리되면, 너는 2을 가질 수있다. 16 바이트 상당의 코드 (지침) 및 2 16 데이터의 바이트 가치는 나 빠지지 않습니다.
프로그램 / 프로세스의 "데이터 공간" (가능한 가장 넓은 의미의 용어 사용)에는 다음을 포함 할 수 있습니다
printf("Hello, world\n");
), int i = 42;
), y = x + 17;
), int j;
, char mydata[80];
정적 / 전역 컨텍스트에서) malloc
, new
), 나는 뭔가를 남기고 있을지 모르지만 레지스터는 실제로 셀 수 없다. (그들은 본질적으로 초기화되지 않은 변수의 특별한 경우이다) 공유 메모리는이 논의의 범위를 벗어납니다. 위의 내용 중에서, 초기화 된 데이터 만 실행 파일에 저장해야합니다. 초기화되지 않은 변수에 대한 공간 및 스택은 프로그램이 실행될 때 OS에 의해 자동으로 할당됩니다. 그래서 컴파일러는 초기화 된 데이터를 추적해야했습니다. 및 초기화되지 않은 변수를 별도로 지정해야합니다.
또 하나의 주름은 Intel 8086 CPU (펜티엄의 위대한 증조부) 각 세그먼트는 하나의 크고 연속적인 메모리 블록이되어야했습니다. Unix 커널은 하나의 큰 코드 블록과 하나의 큰 데이터 블록으로 구성됩니다 (초기화 된 데이터 및 초기화되지 않은 변수) 각 프로세스마다 별도의 스택을 사용합니다. 따라서 8086은 능력이 필요했습니다. 스택을 다른 모든 데이터와 다른 세그먼트에 포함시킵니다.
이 웹에 관한 많은 정보가 있습니다. 예를 들어, Wikipedia :