Compartilhar memória entre uma máquina virtual e o host

5

Através de shmget e shmat , consigo acessar os dados armazenados em um programa de outro programa. Aqui está a essência do código:

key=ftok("shared.c",'c');
shmid=shmget(key,1024,0644|IPC_CREAT);
data=shmat(shmid,(void *)0,0);
printf("Enter the data");
gets(data);

Similarmente eu posso escrever outro programa e usar shmat lá para acessar os dados.

Agora eu queria saber como posso acessá-lo a partir do sistema operacional do host. Como o ID da memória compartilhada será diferente na memória do host, shmat não funcionará. Como posso acessar a memória compartilhada da máquina host?

podemos fazer assim: sabemos que existe uma tabela de páginas em relação a cada sistema operacional em um hipervisor que mapeará o endereço lógico para o endereço físico, há uma tabela pmap que mapeia o endereço físico do hypervisor com o endereço físico da máquina host, e também existem tabelas de páginas de sombra no hypervisor que mapeiam o endereço do convidado lógico para hospedar o físico endereço. Existe alguma maneira de acessar as tabelas de páginas de sombra ou pagetable correspondente ao sistema operacional

    
por user44977 04.02.2012 / 22:58

5 respostas

1

Você não pode; esse é o ponto de uma máquina virtual: ela pensa que é o único sistema operacional em execução.

    
por 05.02.2012 / 00:09
1

Não funciona assim: a máquina virtual e o host não compartilham a mesma memória. É por isso que é chamado de máquina virtual . A memória compartilhada, como você a usou, é um conceito em nível de sistema operacional; você não pode usá-lo para compartilhar memória com algo que está fora do controle do sistema operacional (guest).

Em princípio, a tecnologia de máquina virtual poderia oferecer uma maneira de compartilhar a memória entre o convidado e o host. Mas isso frustraria o propósito da virtualização: permitiria que os programas convidados escapassem da máquina virtual.

Se você quiser compartilhar dados entre uma máquina virtual e seu host, use um arquivo no host, em um diretório montado na máquina virtual (por exemplo, através do vboxsf no VirtualBox); ou mais geralmente usam um arquivo em algum lugar que seja acessível em ambos os lados.

    
por 05.02.2012 / 01:20
1

Embora eu ache que deveria ser possível, você precisa alinhar segmentos de memória. Esse alinhamento pode mudar sem aviso prévio após uma atualização da tecnologia da VM.

Como Gilles apontou - você deve usar outros meios. O SLES11 tem uma maneira "agradável" de compartilhar informações entre Host e Guest (s): O Host gera um disco RAM e atualiza seu conteúdo em intervalos regulares. O Guest (s) monta este disco-RAM RO e lê o conteúdo. Por padrão, ele é usado para passar informações sobre o status do host para os convidados (RAM disponível, nome do host, etc.)

    
por 05.02.2012 / 22:58
0

Um shared memory IPC só pode ser usado no caso de 1 computador, onde todos os processos acessando a mesma memória compartilhada estão sob um sistema operacional comum.

No entanto, em virtual machine você não pode fazer isso. Porque existe o sistema operacional convidado rodando dentro da VM. Às vezes, a VM fornece suporte para memória compartilhada, mas isso é para algumas finalidades, como cópia de área de transferência, mouse, etc ... Um usuário não pode criar memória compartilhada no sistema operacional host / guest que é acessado no outro sistema operacional. Para este caso, podemos implementar outra técnica de IPC, chamada socket programming .

    
por 17.05.2015 / 22:29
0

Próximo aos outros, aqui está uma ideia.

A memória compartilhada (e os outros recursos do sysvipc) são mapeados no linux em um sistema de arquivos interno. Efetivamente, se você criar / anexar / desanexar / excluir um segmento de memória compartilhada, as chamadas de sistema relacionadas estão usando a API do sistema de arquivos para tornar as operações de correspondência semelhantes, como se você trabalhasse em arquivos tmpfs.

Por analogia, minha ideia seria: e se esse "sistema de arquivos" fosse um sistema de arquivos compartilhado, por exemplo, o NFS? É claro que você não poderia usar o padrão "shmat" e outros semelhantes, mas você poderia facilmente implementar wrappers triviais, que criam, abrem, mmap, fecham e deletam arquivos em um volume nfs.

Eu não acho que a biblioteca de invólucros requerida tenha mais de 10-20 kB.

E, claro, você pode compartilhar esses volumes do nfs entre seus anfitriões e convidados como quiser.

Esse volume nfs pode ser armazenado em backup por um ramfs, um tmpfs ou até mesmo por um sistema de arquivos ordenado em disco no host (ou até mesmo em qualquer um dos convidados).

Como efeito colateral, você pode fazer isso mesmo entre os convidados executando em hosts diferentes .

    
por 11.02.2016 / 17:35