시스템 호출을 사용하여 하위 프로세스를 생성하면 fork()
상위 프로세스의 주소 공간이 하위 프로세스에 복사됩니다. 아래 코드는 이를 명확하게 보여줍니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
int *mem = (int*)malloc( sizeof(int) * 1 );
pid_t pid = fork();
if( pid == 0 ){ // child process
printf("Child address = %ld\n", mem);
}
else{ // parent process
printf("Parent address = %ld\n", mem);
}
return 0;
}
그러나 이것은 가상 주소 공간입니다. 즉, 이 코드가 출력하는 주소는 가상 주소이다.
가상 주소를 통해 실제 주소를 얻을 수 있는 기회가 있는지 궁금합니다.
실행 중인 프로세스의 시작 물리적 주소를 저장하는 기본 주소 레지스터가 있는 것 같아요. 이 가상 주소를 기본 레지스터 값에 추가하면 변수의 물리적 주소를 찾을 수 있습니다. 이게 진짜야?
답변1
예, 프로세스 자체가 직접 보는 모든 것은 가상 주소입니다.
일반적으로 페이징되는 시스템에는 가상 주소와 실제 주소의 매핑이 페이지 단위로 이루어지고 순차적일 필요가 없기 때문에 "기본 주소 레지스터"가 없습니다. (예를 들어 가상 페이지 1은 물리적 페이지 4563에 설정할 수 있지만 가상 페이지 2는 물리적 페이지 2413에 설정할 수 있습니다.)페이지 테이블의 Wikipedia 페이지.
나는 프로세스가 페이지 테이블에 직접 접근할 수 없다고 생각하지만 Linux는 다음의 .kernel 문서를 통해 그렇게 하는 것 같습니다.
/proc/<pid>/pagemap
Documentation/vm/pagemap.txt
. 페이지 맵을 읽을 때 또 다른 문제가 있습니다.프로세스의 페이지 테이블 보기.
답변2
특정 가상 주소가 고유한 물리적 주소에 매핑된다는 보장은 없습니다. 특정 가상 주소가 매핑된다는 보장은 없습니다.어느실제 주소. 가상 주소와 일부 실제 주소 간의 매핑이 흥미로운 시간 동안 일관되게 유지된다는 보장은 없습니다.
따라서 귀하의 질문은 실제로 가상 메모리 작동 방식을 반영하지 않습니다. 실제로 가상 주소를 작업하고 있습니다. 그러나 커널은 어떤 지점이 어디에 있는지 변경하려고 할 때마다 MMU와 같은 것을 자유롭게 수정할 수 있으므로 물리적 주소를 알고 있더라도 이를 사용하여 아무것도 할 수 없습니다. 제어 프로세스의 가시적 커널로부터 무언가가 있을 수 있는 위치를 추론할 만큼 충분한 정보를 얻더라도, 현재 가상 머신이 아닌 다른 가상 머신이 있다는 것을 확신할 수 없습니다. 간접 수준에서 - 따라서 물리적 주소라고 생각하는 것은 실제로는 일부 가상 머신 호스트 소프트웨어 내의 가상 주소일 뿐입니다.
귀하의 가상 주소는 페이지별로 그룹화되어 있습니다. MMU는 프로그래밍을 위해 일부 페이지 테이블을 사용하므로 일부 매핑이 있습니다. MMU 내부에 오프셋이 있는 단순 레지스터가 있으면 ISA의 일부인 CPU 레지스터가 아니기 때문에 MMU에서 꺼낼 수 없습니다. (이전 시스템에서 MMU는 CPU와 완전히 별개의 물리적 칩입니다.) 당신이 할 수 있는 유일한 일은 아키텍처에 대한 많은 MMU 문서를 읽고 커널의 페이지 테이블 구성에 액세스하여 "시뮬레이션"을 단계별로 진행하는 것입니다. 특정 입력에 대한 MMU의 동작. CPU 자체는 간접 주소 지정에 대해 (분명히/직접적으로) 알지도 못합니다.
그렇다면 당신이 정말로 하고 싶은 일은 무엇입니까?