0

virtio에서 게스트가 호스트에 알리려고 할 때 장치 io 주소에 씁니다.이 주소로 인해 vm-exit가 발생하고 하이퍼 바이저가 캡처합니다. 쓰기 작업은 eventfd 구조체로 신호를 보내고, sleep 대기중인 vhost_worker 스레드를 활성화하여 virtqueue의 패킷을 처리합니다.virtio에서 게스트 알리미 및 호스트 알리미가 각각 ioeventfd 및 irqfd를 사용하는 이유는 무엇입니까?

호스트가 게스트에 알리려고하면 eventfd를 사용하여 인터럽트 주입을 트리거하고 VM 종료가 필요합니다.

제 질문은 :이 두 과정이 너무 복잡해야합니까? virtio 프론트 엔드와 백엔드 사이의 공유 메모리에 eventfd 구조체를 넣는 것이 어떻습니까? 그런 다음 게스트가 호스트에 알리려고하면 eventfd로 신호를 보냅니다. 그런 다음 vhost_worker 스레드가 활성화되어 vm-exit가 필요하지 않은 것처럼 보입니다. 게스트 알리미는 동일한 방식으로 수행 할 수 있습니다. 왜 우리는이 간단한 방법으로 알릴 수 없습니까?

답변

0

내 질문은 :이 두 프로세스가 너무 복잡해야합니까?

짧은 대답 : 가상 컴퓨터가 복잡하기 때문에. :)

우리는 단지 virtio 프론트 엔드와 백엔드 사이의 공유 메모리에 eventfd 구조체를 넣지 마십시오.

eventfd는 구조가 아닙니다. 다른 모든 파일 설명자와 마찬가지로 정수입니다.

게스트는 호스트에게 통보하려고하면 다음에,이 eventfd에 신호를

...

그것은 그렇게 할 수 없습니다. eventfd에 쓰려면 게스트 커널이 호스트 시스템에서 시스템 호출을해야합니다. 이것은 수행 할 수있는 것이 아닙니다. 마찬가지로 eventfd가 호스트 시스템에 없기 때문에 호스트는 게스트 커널에 의해 생성 된 eventfd에 신호를 보낼 수 없습니다.

게스트 시스템이 Linux 커널을 실행하고 있지 않을 수 있습니다. virtio 인터페이스는 커널과 관련이 없습니다. 가상화 된 모든 OS에 적용 할 수 있습니다.