QOM 방식을 사용하여 qemu
에 새 장치를 에뮬레이션/추가하는 방법은 무엇입니까?QEMU 소스 코드에 새 장치를 추가하는 방법은 무엇입니까?
DeviceState/BusState 및 기타 속성과 관련된 변경 사항은 어디서 무엇일까요?
QOM 방식을 사용하여 qemu
에 새 장치를 에뮬레이션/추가하는 방법은 무엇입니까?QEMU 소스 코드에 새 장치를 추가하는 방법은 무엇입니까?
DeviceState/BusState 및 기타 속성과 관련된 변경 사항은 어디서 무엇일까요?
이 http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf
만들기에서 "콤의 주해와 종말"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는객체를
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, };
이 두 페이지가있을 수 있습니다 유용한 너무 : * 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
인스턴스를 초기화 할 책임이 있습니다.
edu
에서 나무 교육 PCI 장치
매우 이해하기 쉽게 잘 설명되어 있습니다, 그래서 당신이 공부를하는 것이 좋습니다 그것.
기본 IO, 인터럽트 생성 및 DMA가있는 최소 PCI 장치를 제공합니다.
나는 최소한의 리눅스 커널 모듈 + 유저 랜드 테스트를 작성했습니다은 그것으로 재생 :
최소 PCI 장치
나 ' 내 QEMU 포크의 크기의 1/4까지 에듀를 최소화했습니다 : https://github.com/cirosantilli/qemu/blob/22e7e210d6fbe54c35a5ae32450a4419df25a13b/hw/misc/lkmc_pci_min.c DMA가 없습니다.
내 Buildroot 래퍼 이미 단지 복제 및 ./run
, 서브 모듈과 QEMU 포크를 통합합니다.
ARM 플랫폼 디바이스 TYPE_SYS_BUS_DEVICE
따른 SoC 대지 여기 대신 PCI의 실리콘 중의 대부분의 장치 굽는 최소 실행 가능한 예이다
-M versatilepb
: 유형의 장치를 필요로하는 sysbus_create_simple
을 사용합니다.platform_driver.name
일치 QEMU의 versatilepb.c
compatible
의 매개 변수와 일치하고있는 모듈이 커널을 알린다 이 장치를 처리 할 것입니다. ./run -a arm
,
-dtb
DTC 수정과 리눅스 포크가 Buildroot 래퍼의 repo의 서브 모듈입니다와 QEMU의 펌웨어에 전달.
아웃 - 오브 - 트리 장치
나는 그것을 밖으로 -의 - 트리 장치를 만들 수있는 경우 질문 : How to create out-of-tree QEMU devices?하지만 그것처럼 보이지 않는다.
산, 어떤 종류의 장치입니까? – osgx