2015-02-04 2 views

답변

4

http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf

객체를

Object *o = object_new(TYPE_RNG_BACKEND_RANDOM); 
object_property_set_str(o, "filename", "/dev/random", NULL); 
object_property_set_bool(o, "opened", "true", NULL); 
object_property_add_child(container_get("/somewhere"), "my-rng", o, NULL); 
object_unref(o); 

내부 속성

static bool rng_get_opened(Object *obj, Error **errp) 
{ 
    RngBackend *s = RNG_BACKEND(obj); 
    return s->opened; 
} 
static void rng_set_opened(Object *obj, bool value, Error **errp) 
{ 
    RngBackend *s = RNG_BACKEND(obj); 
    RngBackendClass *k = RNG_BACKEND_GET_CLASS(s); 
    ... 
    if (k->opened) { 
     k->opened(s, errp) 
    } 
} 
static void rng_backend_init(Object *obj) 
{ 
    object_property_add_bool(obj, "opened", 
     rng_get_opened, rng_set_opened, NULL); 
} 
static const TypeInfo rng_backend_info = { 
    .name = TYPE_RNG_BACKEND, 
    .parent = TYPE_OBJECT, 
    .instance_size = sizeof(RngBackend), 
    .instance_init = rng_backend_init, 
    .class_size = sizeof(RngBackendClass), 
    .abstract = true, 
}; 

만들기에서 "콤의 주해와 종말"2014 프리젠 테이션의 예를 몇 가지 부분이 있습니다 (비교 실제 코드 : http://code.metager.de/source/xref/qemu/backends/rng.c 및 하나의 impl RNG_BACKEND http://code.metager.de/source/xref/qemu/backends/rng-random.c)의 ementation는

이 두 페이지가있을 수 있습니다 유용한 너무 : * http://wiki.qemu.org/Features/QOM * http://wiki.qemu.org/QOMConventions

포스트 시로 Mugabi에 의해 "필수 QEMU의 PCI의 API"http://nairobi-embedded.org/001_qemu_pci_device_essentials.html (http://web.archive.org/web/20151116022950/http://nairobi-embedded.org/001_qemu_pci_device_essentials.html)는 콤 기반의 완전한 예제를 가지고 PCI 드라이버.

QEMU 개체 모델 (QOM)은 사용자가 만들 수있는 유형을 등록하기위한 프레임 워크를 제공합니다. QOM은 버스, 인터페이스, 장치 등을 유형으로 모델링합니다. QOM에서 사용자 유형별 정보는 ObjectClass 인스턴스와 해당 Object 인스턴스를 만드는 데 사용됩니다. 이 정보는 TypeInfo 구조 (include/qom/object.h)로 지정됩니다. 예를 들면 :

/* hw/misc/pci-testdev.c */ 

static const TypeInfo pci_testdev_info = { 
     .name   = TYPE_PCI_TEST_DEV, 
     .parent  = TYPE_PCI_DEVICE, 
     .instance_size = sizeof(PCITestDevState), 
     .class_init = pci_testdev_class_init, 
}; 

여기서

  • .name 사용자 유형을 나타내는 문자열.
  • .parent이 사용자 유형의 파생되는 유형을 지정하는 문자열.
  • .instance_size Type의 Object 인스턴스 크기입니다. 할당은 QOM에 의해 내부적으로 수행됩니다. 오브젝트에 대해서는 오브젝트 인스턴스화 절에서 자세히 설명합니다.
  • .class_init 생성자 후크. 이 함수는 Type의 ObjectClass 인스턴스를 초기화 할 책임이 있습니다.
5

edu에서 나무 교육 PCI 장치

매우 이해하기 쉽게 잘 설명되어 있습니다, 그래서 당신이 공부를하는 것이 좋습니다 그것.

기본 IO, 인터럽트 생성 및 DMA가있는 최소 PCI 장치를 제공합니다.

나는 최소한의 리눅스 커널 모듈 + 유저 랜드 테스트를 작성했습니다

은 그것으로 재생 :

최소 PCI 장치

나 ' 내 QEMU 포크의 크기의 1/4까지 에듀를 최소화했습니다 : https://github.com/cirosantilli/qemu/blob/22e7e210d6fbe54c35a5ae32450a4419df25a13b/hw/misc/lkmc_pci_min.c DMA가 없습니다.

커널 드라이버 : https://github.com/cirosantilli/linux-kernel-module-cheat/blob/1cd55ebf53542208f7a614a856066123b93d303d/kernel_module/pci_min.c

내 Buildroot 래퍼 이미 단지 복제 및 ./run, 서브 모듈과 QEMU 포크를 통합합니다.

ARM 플랫폼 디바이스 TYPE_SYS_BUS_DEVICE

따른 SoC 대지 여기 대신 PCI의 실리콘 중의 대부분의 장치 굽는 최소 실행 가능한 예이다

DTC 수정과 리눅스 포크가 Buildroot 래퍼의 repo의 서브 모듈입니다와 QEMU의 펌웨어에 전달.

아웃 - 오브 - 트리 장치

나는 그것을 밖으로 -의 - 트리 장치를 만들 수있는 경우 질문 : How to create out-of-tree QEMU devices?하지만 그것처럼 보이지 않는다.

관련 문제