kvm/qemu VM 게스트와 호스트를 구현하여 공유 메모리 연결을 통해 그들 사이에서 데이터를 수집하고 캐시하는 것이 가능합니까?

kvm/qemu VM 게스트와 호스트를 구현하여 공유 메모리 연결을 통해 그들 사이에서 데이터를 수집하고 캐시하는 것이 가능합니까?

구성:

  • 호스트: Ubuntu:20.04 운영 체제
  • 게스트: Ubuntu20.04 운영 체제
  • 이 두 파일은 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;
    }
    

관련 정보