2012-02-26 2 views
8

운영 체제 (주로 Linux를 참조)를 연구하면서 내가 배운 자료에서 잘 설명되지 않은 몇 가지 사항이 있습니다.최신 운영 체제의 메모리 분할

메모리에로드 된 프로그램은 가상 메모리가 순전히 페이징을 기반으로하는 Linux와 같은 운영 체제의 컨텍스트에서도 텍스트, 데이터, 스택 등의 세그먼트로 구분되는 것으로 종종 설명됩니다. 세그먼트 화 된 메모리 자체가 아니라 프로그램 일 뿐인가? 그렇다면 용어가 혼란 스럽습니다.

malloc은 데이터 세그먼트의 크기를 늘리는 'sbrk'호출을 사용하여 Linux에서 구현 될 수 있음을 알았습니다. 다시 말하지만,이 '데이터 세그먼트'는 단지 '실제'세그먼트가 아닌 관례에 따라 데이터 용으로 사용되는 메모리 영역입니까? (추가 질문 : 'sbrk'는 '세그먼트'의 크기를 줄일 수있는 것 같지 않습니다. 프로세스가 메모리를 절대로 종료 할 수 없다는 뜻입니까?)

또한 관심이 있습니다. 현대 운영 체제가 세그먼트 화를 사용하지 않는 것 같은 이유를 알고 있습니다. 특정 종류의 공격이 자신의 보호 된 세그먼트에 코드가 상주하도록하여 보안을 강화하지 않을까요? 다른 한편으로, 이것은 예를 들어. JIT 컴파일 불가능/어려움?

위의 질문에 대한 "예"/ "아니오"답변 외에도 주제에 대한 통찰력있는 분석에 관심이 있습니다.

미리 감사드립니다.

+0

도 *는 * 낮은 값으로 프로그램 중단을 설정할 수 있습니다'brk',있다. 그리고 세그먼트 *는 페이지로 분할되고 각 페이지는 실제로 읽기 전용이거나 실행 불가능할 수 있으며 따라서 텍스트 세그먼트와 ro 데이터 세그먼트는 일반적으로 설정됩니다. –

답변

4

"데이터 세그먼트"의 세그먼트는 하드웨어 세그먼트 화와 관련이 없습니다. 이는 가상 메모리를 구현하기 위해 페이징에 의존하는 최신 운영 체제 (즉, 페이징과 관련하여 중복)와는 거의 관련이없는 기능입니다. 세그먼트는 페이징에 비해 심각한 단점을 가지고 있습니다 (예 : 세그먼트의 인접한 메모리가 물리적으로 인접해야 함). 사용자 공간 프로그램을위한 "세그먼트"는 문자 그대로 프로세스의 가상 공간의 연속적인 섹션을 의미합니다.

많은 아키텍처에는 더 이상 분할 기능이 없습니다. x86에서 세그먼트 화는 역사적인 페이로드 일 뿐이며 분할을 건너 뛸 수 없기 때문에 전체 주소 공간을 포괄하는 코드 및 데이터 세그먼트를 갖도록 설정됩니다. 는 sbrk를 통해 얻은 메모리를 해제에 대한

귀하의 질문은 여기에 대한 답변 : How do I free memory obtained by sbrk()?

+0

답변 해 주셔서 감사합니다. _paged_ 세분화를 통해 이익을 얻을 수있는 방법이 있습니까? 자신의 주소 공간을 가진 실제 세그먼트에 세그먼트를 갖는 것이 메모리 관리를 단순화하고 스택 및 데이터 세그먼트가 서로 도달 할 가능성을 제거하는 것으로 보입니다. 세그먼트 처리는 컴파일러/링커에서 처리 할 수 ​​있습니다. 여하튼, 데이터 세그먼트 등에서 "세그먼트"라는 단어를 사용하는 것은 혼란을 요구하는 것이라고 생각합니다. 나는 몇몇 위키 피 디아 페이지들에 약간의 모호성 노트를 덧붙여 야한다고 생각한다. :) –

+1

@Gnurou 나는 그것이 섞여 있다고 생각한다. x86 세그먼트는 _linear_ (즉, 가상) 주소 공간에 정의됩니다. 즉, 페이징은 세그먼트 화 후에 발생합니다. 이것은 [인텔 ® 64 및 IA-32 아키텍처 개발자 설명서 : Vol. 3A] (http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.html)). – reima

+0

reima : 당신 말이 맞아요 - 지적 해 주셔서 고마워요. 이 주석을 삭제하는 중입니다. – Gnurou

관련 문제