2011-09-21 3 views
0

어제의 질문에 따라, 나는 약간의 조사를했고, 나는 리눅스 프로세스 메모리 맵에 대한보다 명확한 그림을 가지고 있다고 생각했다.Wikipedia의 데이터 세그먼트 설명에 대한 질문?

나는 처음 헷갈 렸던 이유 중 하나는 Wikipedia에 대한 잘못된 설명인데, 이는 힙이 분명히 잘못된 데이터 세그먼트의 일부라고 주장합니다. 또한 데이터 세그먼트는 읽기 전용이 아니며 따라서 Rodata와는 다르다고 주장합니다.

그러나 데이터 세그먼트에 rodata, BSS 및 데이터가 포함되어 있다는 것을 이해하면 누구나 내 이해를 확인할 수 있습니까? (전문가가 Wikipedia 기사를 다시 쓸 수 있다면 더 좋을 것입니다.)

+0

최신 데스크톱 운영 체제에는 세분화가 없습니다. – Puppy

+0

페이지 자체에서 "이 기사의 사실적 정확성에 대한 이의가 있습니다." 아마도 그것이 틀렸기 때문일 것입니다. –

답변

2

"세그먼트"는 현대적인 페이징 메모리 아키텍처가 널리 사용되지 않았던 때로 거슬러 올라가는 구식 개념입니다. 세그먼트 화 된 아키텍처는 상당히 까다로운 메모리 레이아웃을 필요로하는 반면 페이징 메모리는 프로세스가 가상 메모리의 개별 영역을 여러 개 가질 수 있으며 각 영역마다 고유 한 액세스 제한이 있습니다.

리눅스 프로세스는 텍스트 (또는 코드) (실행의 텍스트 섹션에서 초기화)을 실행 가능한 코드를 포함하는 영역을 갖고, 데이터 영역 함유 런타임 데이터합니다 (데이터에서 초기화 , bss 및 (아마도) rodata 실행 파일 섹션). 이 지역은 구식 텍스트 및 데이터에 다소 일치합니다 (세그먼트). 또한 스택을 가지며 메모리의 다른 영역 (예 : 메모리 매핑 파일 및 동적 라이브러리의 코드)에 액세스 할 수도 있습니다.

[기사]는 힙 그것은 반드시 잘못이 아니다

분명히 잘못된 데이터 세그먼트의 일부입니다 주장한다. 힙은 데이터 세그먼트 (brk() 시스템 호출 사용)를 확장하거나 익명 매핑을 만들려면 mmap()을 사용하여 새 메모리 영역을 만들거나이 둘을 조합하여 만들 수 있습니다. 첫 번째 방법으로 생성 된 힙 공간 은 데이터 세그먼트의 일부분 인이지만이 경우 세그먼트의 크기가 고정되어 있음을 나타내는 문서가 올바르지 않습니다.

또한 데이터 세그먼트는 읽기 전용이 아니므로 Rodata와 다릅니다. 그러나, 나의 이해는 데이터 세그먼트가 rodata, BSS 및 데이터를 포함한다는 것입니다.

이 기사는 약간 혼란 스럽습니다. 세그먼트 (프로세스의 메모리 영역)과 섹션 (실행 파일의 일부)을 비교할 수 없습니다. 읽기 전용 데이터는 쓰기 가능한 데이터 영역이 아닌 별도의 쓰기 방지 영역에 두어 보호 할 수 있습니다. 최신 데스크탑/서버 운영 체제는이를 수행 할 것입니다 (일반적으로 파일의 rodata 섹션을 메모리에 직접 매핑하여). 더 단순한 시스템은 메모리 쓰기 방지 메커니즘이 없기 때문에 데이터 세그먼트에 배치 할 가능성이 더 큽니다.

리눅스 프로세스에서 메모리가 어떻게 배치되는지 확인하는 좋은 방법은 /proc/<PID>/maps 파일을 보는 것입니다. 프로세스에 사용할 수있는 각 영역에 대한 가상 주소 범위, 액세스 제한 및 매핑 된 파일 (있을 경우)이 표시됩니다.

0

현대 데스크톱 운영체제에는 전혀 세분화가되어 있지 않습니다. 메모리에는 평평한 모델이 있습니다. 토론 섹션에서 찾은 것은 프로세스 나 운영체제가 아닌 바이너리 실행 가능 형식을 말하는 것입니다.

관련 문제