Linux 커널에서 유저 프로세스를 실행할 때, 실행되는 가상 주소(address)가 모두 동일한 이유는 바로 가상 메모리(Virtual Memory) 시스템을 사용하기 때문입니다.
가상 메모리 시스템은 각 프로세스가 독립적인 가상 주소 공간을 가지도록 합니다. 프로세스는 자신만의 가상 주소 공간을 가지며, 이 가상 주소 공간은 실제 물리적인 메모리에 매핑되어야 합니다. 하지만 가상 주소 공간은 각 프로세스마다 독립적이므로, 프로세스마다 동일한 주소를 사용해도 서로 다른 메모리를 가리킬 수 있습니다.
따라서 유저 프로세스가 실행될 때, 커널은 해당 프로세스에게 독립적인 가상 주소 공간을 할당하고, 이 가상 주소 공간은 프로세스의 코드, 데이터, 스택 등을 포함합니다. 이 가상 주소 공간은 모든 프로세스에 대해 동일한 레이아웃을 가지며, 가상 주소 공간 내의 주소는 프로세스마다 독립적으로 매핑됩니다.
따라서 같은 가상 주소를 사용하는 모든 프로세스는 동일한 레이아웃을 가지며, 해당 주소에서 실행되는 코드는 각각의 프로세스마다 별도로 매핑된 실제 메모리 위치를 가리킵니다. 이를 통해 각 프로세스는 자신만의 독립적인 가상 주소 공간에서 실행될 수 있으며, 서로의 메모리 영역을 침범하지 않으면서 공유 라이브러리 등의 효율적인 공유도 가능해집니다.
물리적인 메모리 주소에 접근하기 위한 전체적인 동작 흐름은 다음과 같습니다:
프로세스 실행: 유저 프로세스가 실행되기 위해 프로세스의 실행 파일이 메모리에 로드됩니다. 실행 파일은 실행 가능한 명령어 코드와 데이터를 포함하고 있습니다.
가상 주소 할당: 프로세스가 실행될 때, 운영체제는 해당 프로세스에게 독립적인 가상 주소 공간을 할당합니다. 가상 주소 공간은 일반적으로 32비트 또는 64비트 크기를 가지며, 여기에는 코드, 데이터, 스택 등이 포함됩니다.
가상 주소 변환: 프로세스는 가상 주소를 사용하여 메모리에 접근하게 됩니다. 프로세스가 가상 주소로 데이터에 접근하려고 하면, 이 가상 주소는 가상 메모리 관리 단위인 페이지(Page)로 분할됩니다. 페이지는 고정된 크기를 가지며 일반적으로 4KB입니다.
페이지 테이블 접근: 가상 주소의 페이지 번호를 사용하여 해당 페이지의 물리적인 메모리 위치를 찾기 위해 페이지 테이블을 사용합니다. 페이지 테이블은 가상 주소 공간과 물리 주소 공간 간의 매핑 정보를 담고 있습니다. 페이지 테이블은 계층 구조로 구성되어 있으며, 각 계층은 페이지 번호의 일부를 사용하여 물리 주소로의 매핑을 찾습니다.
MMU(Memory Management Unit)를 통한 주소 변환: MMU는 가상 주소를 물리 주소로 변환하는 역할을 합니다. MMU는 페이지 테이블을 사용하여 가상 주소의 페이지 번호를 물리 주소로 변환합니다. 변환된 물리 주소는 실제 메모리에서 해당 데이터의 위치를 나타냅니다.
물리 주소 접근: 변환된 물리 주소를 사용하여 데이터에 접근합니다. 이 때, CPU는 메모리 버스를 통해 물리 메모리에 직접적으로 접근하여 데이터를 읽거나 쓸 수 있습니다.
위의 과정을 통해 가상 주소에서 물리 주소로의 변환이 이루어지며, 유저 프로세스는 가상 주소를 사용하여 데이터에 접근하고 실제로는 물리 주소를 통해 메모리에 접근하게 됩니다. 이를 가능하게 하는 것이 가상 메모리 시스템과 MMU의 역할입니다.