관리 메뉴

맨땅에 코딩

"플러그인 개발"이 와닿지 않아 본문

낙서장

"플러그인 개발"이 와닿지 않아

나는 푸딩 2025. 10. 26. 21:20

지금 우리 팀이 하려는 건 QEMU 플러그인 개발인데,

도대체 이게 뭘 하는 건지 전혀 감이 오지 않습니다.

 

그래서 이해하려고 노력해보겠습니다(?)

 

1. 플러그인이라는 게 뭘까?

이미 존재하는 프로그램에 새로운 기능을 '끼워 넣는' 조각 코드

 

예시로 봅시다.

프로그램 플러그인 예시
Chrome 광고 차단기, 번역기
VS Code Python 문법 하이라이트, 자동완성
Photoshop 필터 효과, AI 리터치
QEMU CPU 실행 추적, 메모리 감시, 스냅샷 로깅
  • 본체(Host) = 원래 프로그램 (QEMU)
  • 플러그인(Plugin) = 본체의 동작 중간에 끼워지는 "부가 기능"

목적: 원래 QEMU에는 없는 "내가 필요한 기능"을 직접 추가 하는 것

 

2. QEMU 플러그인은 정확히 뭘하는 걸까?

QEMU는 "가상 머신(Guest OS)"을 실행하는 프로그램이다.

예를 들어, 내 PC(Fedora)안에서 Windows 11을 띄우는 것이다.

 

근데 QEMU는 원래 그냥 "돌리가만"한다.

CPU 안에서 무슨 명령이 실행됐는지, 메모리가 어떻게 바뀌는지는 알려주지 않는다.

 

연구자 입장에서는...

 CPU 내부에서 실제 어떤 명령이 돌고, 언제 인터럽트가 터지고,
메모리가 어떻게 변했는지 보고 싶은데 QEMU는 그걸 보여주지 않아...

 

이때 필요한 것이 바로 플러그인(Plugin)

 

3. 플러그인은 QEMU 안쪽에 "끼워 넣는 코드 조각"

플러그인은 QEMU가 CPU 명령어를 실행하거나 메모리에 접근할 때 그 순간의 데이터를 가로채서 내보낼 수 있다.

 

즉, 플러그인은...

QEMU야, CPU가 명령어를 실행할 때마다 나한테 그 주소랑 레지스터 값 좀 알려줘!

 

라고 말하는 것과 같은 것...

 

4. 그래서 우리가 과연 뭘 하는 걸까?

QEMU 안에서 CPU, 메모리, 인터럽트 같은 가상 하드웨어 동작을 감시하고,
그걸 데이터로 수집하고,
필요할 때 스냅샷을 찍거나 되돌리고(QMP),
나중에 그것을 Qt GUI로 시각화 하는 시스템을 만드는 것

 

“QEMU 안에 감시 센서를 꽂고 → 데이터를 모아서 → 돌려보고 → 시각화하는” 플러그인을 만드는 프로젝트

 

<락 안 걸고 스레드 조임>

  • 멀티스레드 환경(vCPU 여러 개)에서 동시 로그 수집을 할 때 mutex를 쓰지 않고, 성능을 유지하면서 안전하게 데이터 수집하는 구조를 짜겠다는 뜻..

음...

  • vCPU마다 thread-local buffer를 만들어서 충돌 피하기
  • 일정 주기로 각 버퍼를 병합
  • 락 없이도 안전하게 로그 수집

<필요한 정보 가져오기>

  • 플러그인이 QEMU에서 무슨 정보를 추적할지 결졍하는..

수집 대상이...

  • RIP: 어떤 주소에서 어떤 명령어가 실행됐는지
  • 레지스터 값: RAX, RBX 등 레지스터 변화
  • 메모리 접근: 어떤 주소를 읽고/썼는지
  • 인터럽트 발생: IRQ 번호, 시점
  • 스냅샷 시점: 저장 및 복원 시간

정도가 될까? 이 데이터를 로그로 남기거나 실시간으로 분석...하겠지?

 

<플러그인 간 통신>

  • 음.. 서로 다른 플러그인 또는 스레드가 정보를 교환하도록 만드는..

구현 방식은 음... 몰라....

 

<QMP로 롤백시키기>

  • 이전에 QMP가 뭐냐면.. QEMU에 JSON으로 명령을 보낼 수 있는 제어 인터페이스..
{ "execute": "stop" }           // 일시정지
{ "execute": "savevm", "arguments": { "name": "snap1" } } // 스냅샷 저장
{ "execute": "loadvm", "arguments": { "name": "snap1" } } // 스냅샷 복원
{ "execute": "cont" }           // 재개

 

플러그인에서 QMP 명령을 자동으로 날려서 VM을 원하는 시점으로 돌리거나 정지시키자..

 

<Qt랑 연결하기>

  • Qt Creater IDE에서 QEMU 플러그인 코드를 불러와서 QEMU 빌드 환경과 연동되게 설정.. 한다
  • 별도의 GUI가 필요..없다.....