MMU가 Unix/Linux 커널 내부에 있습니까? 아니면 자체 메모리가 있는 하드웨어 장치에만 있습니까?

MMU가 Unix/Linux 커널 내부에 있습니까? 아니면 자체 메모리가 있는 하드웨어 장치에만 있습니까?

그래서 나는 항상 MMU가 주소를 물리적 주소로 변환하는 Unix 커널의 일부라고 생각했지만 MMU 위키 페이지에서는 MMU가 일반적으로 자체 메모리를 가진 컴퓨터 하드웨어의 일부라고 말하지만 페이지에서는 MMU에 대해 많이 언급하지 않습니다. 유닉스/리눅스 운영 체제

그래서 혼란스럽습니다. 모든 변환이 하드웨어에서 일어나고 커널은 변환을 수행하지 않습니까? 기본적으로 운영 체제는 실제 물리적 주소에 대해 아무것도 모릅니다.

Unix 기반 운영 체제에 대해 묻고 있는데, 다른 운영 체제(Windows 등)에 대해서도 알고 계시거나 최신 컴퓨터에서 일반적으로 사용되는 경우 알려주시기 바랍니다. 감사합니다.

답변1

MMU(메모리 관리 장치)컴퓨터 시스템의 물리적 구성 요소로 일반적으로(반드시 그런 것은 아님) CPU의 일부입니다. 가상 주소(x86 세계에서는 선형 주소라고도 함)를 물리적 주소로 변환합니다. 또한 메모리 액세스 제어, 캐시 제어 및 버스 중재를 시행할 수도 있습니다. 일반적으로 자체 메모리가 없으며 시스템 메인 메모리의 데이터에 의존하여 작동합니다.

MMU는 데이터 구조(예: 페이지 테이블)에 저장된 정보를 사용하여 이 변환을 수행합니다. 이는 선형 주소 범위에 해당하는 물리적 주소 범위를 지정합니다(있는 경우 페이지가 "존재하지 않을" 수 있음). 페이지 테이블은 매핑이 무엇인지 결정하는 커널에 의해 설정됩니다. 따라서 물리적 주소에 대한 최종 권한은 커널이지만 항상 MMU의 도움으로 작동합니다. 즉, CPU는 항상 MMU에 의해 물리적 주소로 변환되는 선형 주소에서 작동하지만 커널은 이러한 변환을 알고 이를 수행하도록 MMU를 프로그래밍합니다.

사용자 공간 프로세스는 이에 대해 아무것도 모르고 (보통) 자신이 사용하는 선형 주소에 해당하는 물리적 주소를 모르고 일반적으로 매핑에 액세스할 수 없습니다. 어떤 경우에는 물리적 매핑이 손상되지만 일반적으로 보안 취약점으로 처리되어 신속하게 해결됩니다. 그러나 Linux에서는 충분한 권한이 있는 프로세스가 /proc/<pid>/pagemap.

특히 Linux의 경우 다음을 참조하세요.메모리 관리 문서,특히페이지 테이블 섹션을 확인하세요..

답변2

MMU(Memory Management Unit)는 가상 주소를 물리적 주소로 변환하는 하드웨어입니다. 예를 들어, CPU가 읽을 주소를 발행하면 MMU는 해당 가상 주소를 물리적 주소로 변환한 다음 물리적 주소를 메모리 버스로 보냅니다.

MMU는 운영 체제에 의해 프로그래밍됩니다. 운영 체제는 메모리(물리적 및 가상)를 관리하고 가상-물리적 매핑을 관리합니다.

답변3

물리적에서 가상으로의 변환이 수행되는 정확한 위치를 검색하고 있었기 때문에 답변을 작성하기로 결정했습니다.

Linus의 원본 게시물에 대한 링크를 남겨드리겠습니다. 커널 공간에서 주소 변환 이렇게 하면 파일을 찾을 수 있습니다

#include <asm/io.h>

원래 예상했던 mm 폴더에는 없습니다. 그 이유는 아키텍처 간의 차이가 너무 넓어서 모든 것을 mm 폴더에 포함시키기에는 각 아키텍처마다 더 많은 차이가 있기 때문입니다.

따라서 Arch/x86/include/asm/io.h 파일, 특히 virt_to_phys를 살펴보십시오. https://codebrowser.dev/linux/linux/arch/x86/include/asm/io.h.html#virt_to_phys

x86의 Linus의 의견에 따르면 버스 주소는 동일한 가상 주소이기 때문에 모든 것이 더 간단합니다. 버스 주소와 가상 주소의 차이점은 버스 주소가 CPU가 아닌 장치가 메모리 레이아웃을 보는 방식이라는 것입니다.

x86에서는 더 간단하고 두 용어(버스 주소와 가상 주소)가 같은 의미로 사용되기 때문입니다.

다음 정의는 내 말을 증명합니다

#define isa_bus_to_virt     phys_to_virt

isa/pci가 외부(CPU가 아닌) 장치라고 가정합니다.

조금 더 자세히 살펴보면 linux/arch/powerpc/mm/ioremap_32.c 파일에서 볼 수 있는데, 이는 ISA 장치의 메모리 레이아웃이 다른 다른 아키텍처(PowerPC)와 관련되어 있습니다.

https://codebrowser.dev/linux/linux/arch/powerpc/mm/ioremap_32.c.html

함수에서 볼 수 있습니다.

__ioremap_caller 

댓글은 다음과 같습니다.

/*
* If the address lies within the first 16 MB, assume it's in ISA
* memory space
*/
if (p < 16 * 1024 * 1024)
    p += _ISA_MEM_BASE;

이는 실제로 서로 다른 버스 주소와 가상 주소를 고려하여 PowerPC 레이아웃이 약간 다르다는 Linus의 진술을 확인시켜 줍니다.

관련 정보