2012-07-28 2 views
2

리눅스에서는 세그먼트의베이스가 모두 0이기 때문에 논리 주소가 선형 주소와 일치합니다 (Book "Understanding the linux kernel"). 나는 서로 다른 프로세스의 논리 주소가 같아서 서로 다른 프로세스의 선형 주소가 동일 할 수도 있고 각 프로세스가 4GB를 볼 때마다 각 프로세스가 자체의 선형 주소 공간 (로컬 주소 공간)을 가질 것이라고 생각한다. 그러나 다른 기사에서는 모든 프로세스가 공유하는 큰 선형 주소 공간이 있다고하며 세그먼트 메커니즘은 다른 프로세스를 선형 주소 공간의 다른 부분에 매핑하는 데 사용됩니다. 넓은 주소 비트를 가진 글로벌 선형 주소 공간처럼 들립니다. 내가 어디서 잘못한거야? 아니면 다른 아키텍처에서 사용됩니까?Linux의 전역 또는 로컬 선형 주소 공간?

+0

보기의 어떤 시점에서 당신이 질문을하고 있습니다 : 커널 내부에서 (예를 들어, 새로운 커널 모듈을 코딩하는 경우), 또는 (예를 들어, 코딩 Linux 응용 프로그램) 응용 프로그램 내부에서? –

+0

리눅스의 원리와 메커니즘을 알고 싶습니다. 특히 리눅스가 하드웨어에서 제공하는 기능을 사용하는 방법. , CPU. – user1559088

+0

나는 내 대답에 신중하게 많은 참고 문헌을 줬다. * 각 참조는 당신에게 유용 할 것입니다 *. –

답변

1

각 Linux process은 고유 한 address space입니다. virtual memory입니다. 프로세스마다 다른 주소 공간이 있습니다 (그러나 프로세스 내의 모든 스레드는 동일한 주소 공간을 공유합니다).

당신은 프로세스 내에서 /proc/1234/maps을 읽어 나에서 리눅스 과정 1234의지도를 얻을 수 있습니다

/proc/self/maps

다음 명령

cat /proc/$$/maps 
cat /proc/self/maps 

을 시도하고 자신의 출력에 대해 생각; 첫 번째 명령은 쉘의 메모리 맵을 보여줍니다; 두번째 어드레스 공간은 프로그램 시작시 execve(2) 설정하고 mmap(2)로 바꾸고 syscalls 관련된다 cat

실행하는 프로세스의 메모리 맵을 나타낸다.

응용 프로그램은 syscalls를 통해서만 커널과 상호 작용합니다. 커널은 "다른"주소 공간을 가지고 있습니다. 커널 내부에서 코딩하지 않는 한 신경 쓸 필요가 없습니다. 또한

읽기 Advanced Unix Programming 및/또는 Advanced Linux Programming

같은 좋은 책은 콜에도 this explanation 참조하십시오.

세그먼트 화 된 주소 지정은 i386에만 해당되며 더 이상 사용되지 않습니다. 대부분의 시스템에서는 더 이상 사용하지 않습니다. x86-64의 64 비트 모드에서는 완전히 사라졌습니다. 모든 Linux 시스템은 다음을 사용합니다. flat memory model

모든 참조를주의 깊게 읽으십시오.

+0

리눅스가 프로세스의 논리 주소 (가상 주소도 마찬가지 임)를 선형 주소와 동일하게 만들고 페이징으로 다른 프로세스만을 구분한다는 의미입니까? – user1559088

+0

"선형 주소"(Linux는 세그먼트 주소 지정을 사용하지 않습니다. x86-64 나 다른 프로세서에서 사용되지 않는 i386의 오래된 쓸데없는 점)을 이해하지 못합니다. 내가 너에게 준 모든 참고 사항을 읽었 니? –

+0

예. 나는이 책에서 소개 된 세 가지 주소에 대해 혼란 스러웠다. 이제 리눅스에서 프로세스가 가상 주소를 직접 볼 수 있다고 말하면됩니다. 가상 주소는 페이징에 의해 물리적 주소로 직접 변환됩니다. – user1559088

3

인텔 지원 주소 3 종류 :

논리 주소 - (세그먼트 단위) ---> 선형 주소 --- (호출 장치) ---> 물리적 주소

당신이 알고있는 , 모든 커널 및 사용자 코드 액세스 데이터 또는 텍스트 가상 주소 (CPU의 논리 주소). 리눅스 구현은 선형 주소의 개념을 지원하지 않는

enter image description here

같이 세그먼트에만 허가 제어를 위해 제공되며,이 주소는 다음과 같이 그래프의 선형 주소로 번역된다. Linux 커널은 각 세그먼트의 오프셋 값을 0으로 구성합니다. 그래서 커널에서 선형 주소를 볼 수없고 커널은 페이징 단위에서 가상 주소를 직접 사용합니다.

선형 주소를 얻은 후, MMU 페이징 유닛은 CR3 레지스터를 참조하여 물리적 주소를 생성하기 위해 테이블의 기반을 얻습니다.

enter image description here

CPU 캐시와 동일하게, 상기 페이징 유닛은 메모리상에서 수행 어드레스 변환을 가속화하기위한 CPU 코어 당 TLB 캐시를 갖는다.

참조 : intel64 software developer's manual

관련 문제