2015-02-04 20 views
7

Phương pháp tiếp cận khôn ngoan từng bước để mô phỏng/thêm thiết bị mới trong qemu bằng cách sử dụng phương pháp QOM là gì?Cách thêm thiết bị mới vào mã nguồn QEMU?

Điều gì và ở đâu có thể là thay đổi đối với DeviceState/BusState và các thuộc tính khác?

+0

San, loại thiết bị nào? – osgx

Trả lời

4

Có một số bộ phận của ví dụ trong "Qom khoa chú giải và ngày tận thế" năm 2014 trình bày tại http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf

Tạo một đối tượng

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); 

tính Bên

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, 
}; 

(so sánh với mã thực tế: http://code.metager.de/source/xref/qemu/backends/rng.c và một hàm ementation của RNG_BACKEND http://code.metager.de/source/xref/qemu/backends/rng-random.c)

Hai trang có thể hữu ích quá: * http://wiki.qemu.org/Features/QOM * http://wiki.qemu.org/QOMConventions

Các bài "Essential QEMU PCI API" bởi Siro Mugabi: 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) có ví dụ hoàn chỉnh của Qom-enabled Trình điều khiển PCI.

Mô hình đối tượng QEMU (QOM) cung cấp khuôn khổ để đăng ký loại người dùng có thể tạo. QOM mô hình xe buýt, giao diện, thiết bị, vv như các loại. Trong QOM, thông tin của người dùng Type được sử dụng để tạo ra cá thể ObjectClass cũng như đối tượng Object của nó. Thông tin này được chỉ định trong cấu trúc TypeInfo (include/qom/object.h). Ví dụ:

/* 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, 
}; 

nơi:

  • .name một chuỗi cho biết Type dùng.
  • .parent một chuỗi chỉ định Loại mà từ đó Kiểu người dùng này bắt nguồn từ đó.
  • .instance_size kích thước của đối tượng Kiểu của đối tượng. Việc phân bổ sẽ được QOM thực hiện nội bộ. Các đối tượng sẽ được thảo luận chi tiết hơn trong phần Object Object Instantiation.
  • .class_init móc xây dựng. Chức năng này sẽ chịu trách nhiệm khởi tạo phiên bản ObjectClass của Type.
5

edu trong cây thiết bị PCI giáo dục

Nó là rất dễ dàng để hiểu và tài liệu tốt, vì vậy tôi khuyên bạn nên nghiên cứu nó.

Nó cho thấy thiết bị PCI tối thiểu, với IO cơ bản, thế hệ ngắt và DMA.

Tôi đã viết một module kernel + Userland tối thiểu kiểm tra Linux để chơi với nó tại địa chỉ:

tối thiểu thiết bị PCI

tôi đã giảm thiểu edu thậm chí còn hơn một phần tư kích thước trên ngã ba QEMU của tôi: https://github.com/cirosantilli/qemu/blob/22e7e210d6fbe54c35a5ae32450a4419df25a13b/hw/misc/lkmc_pci_min.c Không có DMA.

Kernel tài xế: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/1cd55ebf53542208f7a614a856066123b93d303d/kernel_module/pci_min.c

Buildroot wrapper của tôi đã tích hợp các ngã ba với một submodule QEMU, chỉ cần sao chép và ./run.

nền tảng ARM thiết bị TYPE_SYS_BUS_DEVICE

SoC-đất bakes hầu hết điện thoại trong silicon thay vì PCI, đây là một ví dụ Runnable tối thiểu:

Các ngã ba Linux với việc sửa đổi DTC là một submodule của wrapper repo Buildroot, vì vậy chỉ cần sao chép và ./run -a arm.

Out-of-cây thiết bị

tôi hỏi nếu chúng ta có thể làm cho out-of-cây thiết bị tại địa chỉ: How to create out-of-tree QEMU devices? nhưng nó không giống như nó.

Các vấn đề liên quan