를 사용하면 shmget
한 shmat
프로그램에 저장된 데이터를 다른 프로그램에서 액세스할 수 있습니다. 코드의 요점은 다음과 같습니다.
key=ftok("shared.c",'c');
shmid=shmget(key,1024,0644|IPC_CREAT);
data=shmat(shmid,(void *)0,0);
printf("Enter the data");
gets(data);
마찬가지로, 다른 프로그램을 작성하고 shmat
이를 사용하여 데이터에 액세스할 수 있습니다.
이제 호스트 OS에서 액세스하는 방법을 알고 싶습니다. 호스트 메모리에서는 공유 메모리 ID가 다르기 때문에 shmat
작동하지 않습니다. 호스트에서 공유 메모리에 액세스하는 방법은 무엇입니까?
우리는 이것을 할 수 있습니까? 우리는 하이퍼바이저의 모든 운영 체제에 대해 논리적 주소를 물리적 주소로 매핑하는 페이지 테이블이 있고 하이퍼바이저의 물리적 주소를 호스트 물리적 주소의 물리적 주소로 매핑하는 pmap 테이블이 있다는 것을 알고 있습니다. , 논리적 게스트 주소를 호스트 물리적 주소에 매핑하는 섀도우 페이지 테이블도 하이퍼바이저에 존재합니다. 운영체제에 맞는 섀도우 페이지 테이블이나 페이지 테이블에 접근할 수 있는 방법이 있나요?
답변1
실제로 그렇게 할 수 있지만 임베디드 소프트웨어 개발 경험이 필요하며 호스트와 게스트가 가상 PCI 장치를 사용할 수 있게 함으로써 달성되는 가상 머신 간 통신 개념을 사용할 수 있습니다. 다음에서 몇 가지 세부정보를 확인할 수도 있습니다. [업데이트]https://github.com/qemu/qemu/blob/master/docs/specs/ivshmem-spec.txt
도움이 되었기를 바랍니다! 감사해요
답변2
하지만 그렇지 않습니다. 가상 머신과 호스트 머신은 동일한 메모리를 공유하지 않습니다. 그래서 가상이라고 하는거임기계. 지금까지 작업해 왔던 것처럼 공유 메모리는 운영 체제 수준 개념이므로 (게스트) 운영 체제의 제어 범위를 벗어나는 항목과 메모리를 공유하는 데 사용할 수 없습니다.
원칙적으로 가상 머신 기술은 게스트와 호스트 간에 메모리를 공유하는 방법을 제공할 수 있습니다. 그러나 이렇게 하면 가상화의 목적이 무산됩니다. 즉, 게스트 프로그램이 가상 머신에서 벗어날 수 있게 됩니다.
가상 머신과 해당 호스트 간에 데이터를 공유하려면 가상 머신에 마운트된 디렉터리에 있는 호스트의 파일을 사용하거나(예: VirtualBox의 vboxsf를 통해) 더 일반적으로 파일을 사용하세요.어딘가에양쪽에서 접근 가능합니다.
답변3
내 생각에는 메모리 세그먼트를 정렬해야 할 수도 있다고 생각합니다. 이 정렬은 VM 기술이 업그레이드됨에 따라 예고 없이 변경될 수 있습니다.
Giles가 지적했듯이 다른 수단을 사용해야 합니다. SLES11에는 호스트와 게스트 간에 정보를 공유하는 "좋은" 방법이 있습니다. 즉, 호스트는 RAM 디스크를 생성하고 해당 내용을 주기적으로 업데이트합니다. 게스트는 이 RAM 디스크 RO를 마운트하고 내용을 읽습니다. 기본적으로 호스트 상태에 대한 정보(사용 가능한 RAM, 호스트 이름 등)를 게스트에 전달하는 데 사용됩니다.
답변4
이 LXD에 관심이 있으실 수도 있습니다. 호스트와 게스트 간에 디스크, 메모리 등을 공유할 수 있습니다. 그런데 자원을 통제하고 제한하는 것은 여전히 가능합니다.