세그먼트란 프로세스를 5가지 논리적 기준으로 잘라낸것으로 아래와 같이 나뉘어진다
또한 각 세그먼트 마다 부여되는 권한과 위치하는 데이터가 다르다.
실행 가능한 기계코드가 위차하는 곳으로, 코드를 실행해야 하므로 읽기권한, 실행권한이 부여된다.
쓰기 권한이 있으면 공격자가 악성코드를 삽입할 위험이 있기 때문에, 현대의 운영체제들은 대부분 쓰기 권한을 제거한다.
데이터 세그먼트는 컴파일이 완료된 시점에서 확정된 전역 변수, 전역 상수들이 위치한다. 또한 CPU가 이러한 변수들을 읽을 수 있어야 하므로, 읽기권한이 부여된다. 데이타 세그먼트는 쓰기권한의 여부에 따라 2종류로 나뉜다.
데이터 세그먼트처럼 전역변수를 저장하지만, BSS 세그먼트는 선언은 되어있으나 초기화가 되지않은 전역변수들을 담고있다. 이 세그먼트는 프로그램이 시작될때 모든 메모리 값을 0으로 초기화 한다. 그래서 C언어 코드에서는 초기화되지 않은 전역변수의 값이 0이다. 이 세그먼트에는 읽기권한,쓰기권한이 부여된다
스택 세그먼트는 말 그대로 스택이 위치하는 세그먼트로, 함수의 인자나 지역 변수같은 임시 변수들이 저장된다. 스택 세그먼트에서는 스택 프레임이라는 단위를 사용하는데, 이는 함수가 호출될 때 생성되어, 반환될 때 해제된다. 하지만 프로그램의 전체 실행 흐름은 사용자의 입력과 같이 여러 요인의 영향을 받기 때문에, 스택 프레임을 얼마나 사용할지 알 수 없다, 그렇기에 운영체제는 프로세스가 실행될때 스택 세그먼트에 자그마한 스택을 할당해주고 부족해 질 때마다 이를 확장해준다 참고로 이때는 기존 주소보다 낮은 주소로 확장된다. 스택 세그먼트는 읽기,쓰기권한이 부여된다
말 그대로 힙 데이터가 위치하는 세그먼트로, 스택처럼 동적으로 할당되어 프로그램 실행중에 스택의 반대 방향으로 자란다. 스택과 반대방향으로 자라는 이유는, 충돌을 방지하기 위해서 이다