리눅스에서는 세그먼트의베이스가 모두 0이기 때문에 논리 주소가 선형 주소와 일치합니다 (Book "Understanding the linux kernel"). 나는 서로 다른 프로세스의 논리 주소가 같아서 서로 다른 프로세스의 선형 주소가 동일 할 수도 있고 각 프로세스가 4GB를 볼 때마다 각 프로세스가 자체의 선형 주소 공간 (로컬 주소 공간)을 가질 것이라고 생각한다. 그러나 다른 기사에서는 모든 프로세스가 공유하는 큰 선형 주소 공간이 있다고하며 세그먼트 메커니즘은 다른 프로세스를 선형 주소 공간의 다른 부분에 매핑하는 데 사용됩니다. 넓은 주소 비트를 가진 글로벌 선형 주소 공간처럼 들립니다. 내가 어디서 잘못한거야? 아니면 다른 아키텍처에서 사용됩니까?Linux의 전역 또는 로컬 선형 주소 공간?
답변
각 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
모든 참조를주의 깊게 읽으십시오.
리눅스가 프로세스의 논리 주소 (가상 주소도 마찬가지 임)를 선형 주소와 동일하게 만들고 페이징으로 다른 프로세스만을 구분한다는 의미입니까? – user1559088
"선형 주소"(Linux는 세그먼트 주소 지정을 사용하지 않습니다. x86-64 나 다른 프로세서에서 사용되지 않는 i386의 오래된 쓸데없는 점)을 이해하지 못합니다. 내가 너에게 준 모든 참고 사항을 읽었 니? –
예. 나는이 책에서 소개 된 세 가지 주소에 대해 혼란 스러웠다. 이제 리눅스에서 프로세스가 가상 주소를 직접 볼 수 있다고 말하면됩니다. 가상 주소는 페이징에 의해 물리적 주소로 직접 변환됩니다. – user1559088
인텔 지원 주소 3 종류 :
논리 주소 - (세그먼트 단위) ---> 선형 주소 --- (호출 장치) ---> 물리적 주소
당신이 알고있는 , 모든 커널 및 사용자 코드 액세스 데이터 또는 텍스트 가상 주소 (CPU의 논리 주소). 리눅스 구현은 선형 주소의 개념을 지원하지 않는
같이 세그먼트에만 허가 제어를 위해 제공되며,이 주소는 다음과 같이 그래프의 선형 주소로 번역된다. Linux 커널은 각 세그먼트의 오프셋 값을 0으로 구성합니다. 그래서 커널에서 선형 주소를 볼 수없고 커널은 페이징 단위에서 가상 주소를 직접 사용합니다.
선형 주소를 얻은 후, MMU 페이징 유닛은 CR3 레지스터를 참조하여 물리적 주소를 생성하기 위해 테이블의 기반을 얻습니다.
CPU 캐시와 동일하게, 상기 페이징 유닛은 메모리상에서 수행 어드레스 변환을 가속화하기위한 CPU 코어 당 TLB 캐시를 갖는다.
- 1. Linux의 공간 문제
- 2. 전역 ObjectContext 또는 로컬 객체입니까?
- 3. AIR 로컬 호스트 또는 로컬 IP 주소
- 4. 프로세스의 메모리 주소 공간
- 5. 시스템 DLL 주소 공간
- 6. XML 암호화 주소 공간
- 7. PHP 전역 이름 공간 함수
- 8. 클래식 ASP에서 호출 된 DLL의 주소 공간
- 9. numpy의 로컬 선형 근사
- 10. 가상 주소 및 가상 주소 공간 이해
- 11. 다중 스레드 가상 주소 공간?
- 12. ARM linux : 프로세스 주소 공간
- 13. fork 호출 후 주소 공간
- 14. 로컬 변수 또는 정적 변수 또는 전역 변수
- 15. 쿼리 로컬 IP 주소
- 16. 로컬/전역 부울 문제
- 17. 링크 로컬 주소 추가
- 18. 로컬 IP 주소 얻기
- 19. C++ : 전역 값을 메모리 주소 또는 다른 방법으로 저장하십시오.
- 20. 가상 주소 공간 전체 그림 필요
- 21. PAE가 활성화 된 프로세스의 가상 주소 공간
- 22. Oracle : 함수에 대한 전역 이름 공간 한정자?
- 23. IPv6 로컬 인터페이스 및 링크 로컬 주소
- 24. Linux의 로컬 사용자에게만 프로그램을 설치하려면 어떻게해야합니까?
- 25. Linux의 C# : 로컬 네트워크에있는 컴퓨터를 열거하는 방법?
- 26. Linux의 COFF 또는 Windows의 ELF
- 27. 전역 메모리와 여러 장치 간의 일치하지 않는 주소 공간 매핑으로 인해 혼동 됨
- 28. 네임 스페이스 내부의 전역 공간 함수
- 29. 다중 스레드 Linux 프로세스의 주소 공간 레이아웃
- 30. 업로드 파일 이름의 공간 주소 지정 방법
보기의 어떤 시점에서 당신이 질문을하고 있습니다 : 커널 내부에서 (예를 들어, 새로운 커널 모듈을 코딩하는 경우), 또는 (예를 들어, 코딩 Linux 응용 프로그램) 응용 프로그램 내부에서? –
리눅스의 원리와 메커니즘을 알고 싶습니다. 특히 리눅스가 하드웨어에서 제공하는 기능을 사용하는 방법. , CPU. – user1559088
나는 내 대답에 신중하게 많은 참고 문헌을 줬다. * 각 참조는 당신에게 유용 할 것입니다 *. –