Совместное использование памяти между виртуальной машиной и хостом

Через 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 для доступа к данным.

Теперь я хотел знать, как получить доступ к нему из операционной системы хоста. Поскольку идентификатор общей памяти будет отличаться в памяти хоста, shmat не будет работать. Как я могу получить доступ к общей памяти с главной машины?

мы можем сделать это следующим образом: мы знаем, что существует таблица страниц по каждой операционной системе в гипервизоре, которая будет отображать логический адрес на физический адрес, есть таблица pmap, которая отображает физический адрес гипервизора с помощью физический адрес хост-машины, а также существуют таблицы теневых страниц в гипервизоре, которые сопоставляют логический гостевой адрес для размещения физического адреса. Есть ли способ доступа к таблицам теневой страницы или pagetable, соответствующим ОС

Вы не можете; это своего рода точка виртуальной машины: она думает, что это единственная работающая ОС.

Это не так: виртуальная машина и хост не используют одну и ту же память. Вот почему он называется виртуальной машиной . Общая память, поскольку вы ее используете, представляет собой концепцию уровня ОС; вы не можете использовать его для обмена памятью с чем-то, что находится вне контроля (гостевой) ОС.

В принципе, технология виртуальных машин может предложить способ обмена памятью между гостем и хостом. Но это победит цель виртуализации: это позволит гостевым программам выходить из виртуальной машины.

Если вы хотите обмениваться данными между виртуальной машиной и ее хостом, используйте файл на хосте, в каталоге, установленном на виртуальной машине (например, через vboxsf на VirtualBox); или, в общем, использовать файл где-нибудь , доступный с обеих сторон.

Хотя я думаю, что должно быть возможно, вам нужно выровнять сегменты памяти. Это выравнивание может измениться без уведомления после обновления технологии VM.

Как указал Жиль, вы должны использовать другие средства. SLES11 имеет «хороший» способ обмениваться информацией между хостом и гостем (-ами): хост генерирует RAM-диск и регулярно обновляет его содержимое. Гость (ы) монтируют этот RAM-диск RO и читают содержимое. По умолчанию он используется для передачи информации о статусе хоста для гостей (доступная оперативная память, имя хоста, …)

shared memory IPC может использоваться только в случае 1 компьютера, где все процессы, обращающиеся к одной и той же общей памяти, находятся в общей операционной системе.

Однако на virtual machine вы не можете этого сделать. Потому что в VM есть гостевая ОС. Иногда VM обеспечивает поддержку разделяемой памяти, но для некоторых целей, таких как copy-clipboard, mouse и т. Д. Пользователь не может создавать разделяемую память в хост-гостевой ОС, к которой обращается в другой ОС. В этом случае мы можем реализовать еще один метод IPC, называемый socket programming .

Рядом с другими, вот идея.

Общая память (и другие функции sysvipc) отображаются в linux во внутреннюю файловую систему. Эффективно, если вы создаете / присоединяете / отсоединяете / удаляете сегмент разделяемой памяти, связанные системные вызовы используют файловую систему api, чтобы выполнить аналогичные операции, как если бы вы работали над файлами tmpfs.

По аналогии, моя идея была бы такой: что, если эта «файловая система» будет общей файловой системой, например NFS? Конечно, вы не могли использовать стандартные «shmat» и аналогичные системные вызовы, но вы могли бы легко реализовать тривиальные обертки, которые создают, открывают, умеют, закрывают и удаляют файлы на томе nfs.

Я не думаю, что требуемая библиотека обертки будет длиннее 10-20 кБ.

И, конечно же, вы можете делиться этими томами nfs между хостами и гостями, как вы.

Этот том nfs можно скопировать с помощью ramfs, tmpfs или даже упорядоченной файловой системы с дисковой поддержкой на хосте (или даже у любого из гостей).

В качестве побочного эффекта вы можете сделать это даже между гостями, работающими на разных хостах .