kvm / qemu VMゲストとホストを実装して、共有メモリ接続を介してそれらの間でデータを収集してキャッシュすることは可能ですか?

kvm / qemu VMゲストとホストを実装して、共有メモリ接続を介してそれらの間でデータを収集してキャッシュすることは可能ですか?

構成:

  • ホスト:Ubuntu:20.04オペレーティングシステム
  • ゲスト:Ubuntu20.04オペレーティングシステム
  • これら2つのファイルは9pファイルシステムを使用して互いに通信します。

マウントコマンドは次のとおりです。

mount -t 9p -o trans=virtio tmp_shared /mnt -oversion=9p2000.l

現在の進行状況は次のとおりです。

  • C言語の関数は、mmap9pファイルシステムを介して同じファイルのメモリをマッピングするために使用されます。
  • 現在、ホストはファイルメモリに書き込むことができますが、ゲストはリアルタイムで変更を読み取ることはできません。
  • ホスト側:(write.cこのコードはファイルメモリを変更することです)
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #define _GBU_SOURCE
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define FILE_PATH "/tmp/shared/test.txt" //file path
    
    int main()
    {
        int fd;
        struct stat fa;
        char *mapped;
    
        // open
        if ((fd = open(FILE_PATH, O_CREAT | O_RDWR)) < 0){
            perror("open");
            exit(1);
        }
    
        // attr
        if ((fstat(fd, &fa)) == -1){
            perror("fstat");
            exit(1);
        }
    
        // map
        if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE,MAP_SHARED, fd, 0)) == (void *)-1){
            perror("mmap");
            exit(1);
        }
    
        // close
        close(fd);
    
        printf("before :\n%s\n", mapped);
    
        mapped[3] = 'P';
    
        printf("\nafter:\n%s\n", mapped);
    
    
        if (munmap(mapped, fa.st_size) == -1)
        {
            perror("munmap");
            exit(1);
        }
    
        return 0;
    }
    
    
  • ゲスト側:(read.cこのコードはファイルを読み続けるためのものです)
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <error.h>
    
    #define FILE_PATH "/mnt/test.txt" // file path
    
    int main()
    {
        int fd;
        struct stat fa;
        char *mapped;
    
        // open
        if ((fd = open(FILE_PATH, O_RDWR)) < 0)
        {
            perror("open");
            exit(1);
        }
    
        // attr
        if ((fstat(fd, &fa)) == -1)
        {
            perror("fstat");
            exit(1);
        }
    
        // map
        if ((mapped = (char *)mmap(NULL, fa.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == (void *)-1)
        {
            perror("mmap");
            exit(1);
        }
    
        // close
        close(fd);
    
        // read
        while (1)
        {
            printf("%s\n", mapped);
            sleep(2);
        }
    
        return 0;
    }
    

ベストアンサー1

おすすめ記事