blob: 1c56948fb3e8d4a003a189ee436792a2e84d4dc6 [file] [log] [blame] [view] [edit]
# Emulator Engine Configuration Types
This crate contains a suite of data structures we've designed to carry all
of the parameters needed to define a virtual device, the guest OS running on the
device, and host-specific configuration for multiple emulation backends. To
ensure a consistent approach to defining these data types, our philosophy is
documented here. Please be sure you understand the roles of each type before
making changes to the structures herein.
## The Types
An emulation engine requires four distinct types to define its operation:
- GuestConfig: This defines the operating system that will be running within
the emulated environment. The guest OS is primarily defined by the disk
images which are loaded to the virtual disks. This data structure includes
information such as the virtual disk files, kernel files and arguments, etc.
- VirtualDevice: This defines the virtual hardware the emulation backend will
expose to the guest OS. The virtual hardware includes information about the
system memory, screen size, peripheral devices, and CPU type and count, etc.
- HostConfig: This provides information to the emulator about the host it will
be running on which impacts how it initializes and performs the emulation.
This can include host-side interfaces to attach to the virtual hardware, disk
locations for logs or companion programs, terminal environment variables,
etc.
- RuntimeConfig: This holds parameters that are specific to one instance of
emulation which directly impact the behavior of the program. This can include
logging verbosity levels, selectors for attaching to a debugger or emulated
consoles or whether to open the GUI, etc.
## The Justification
The primary justification for this grouping of parameters is reuse. The ffx
emulator launcher is designed to support multiple backing emulation programs,
such as Qemu, Aemu, Google Cloud Engine, or Vanadium. Each of these engines can
emulate various devices, and each of those devices can potentially run various
operating systems.
The goal of our design is to be able to define a set of virtual devices (think
a Nest Hub, a Chromebook, a smart speaker), and run the same OS on each of
them just by swapping out the VirtualDevice configuration; or, build a set of
sample OS versions and run them on identical emulated hardware just by swapping
out the GuestConfig, which points to the image files for each version.
## The Code
The code in this crate is primarily type definitions, and all the fields are
public. The data for those types may come from anywhere: a test can populate a
GuestConfig with test input files, a developer can write code which defines a
VirtualDevice on-the-fly, and a RuntimeConfig will usually be populated by
command-line flags.
The primary expected use case, though, is to get configuration data from a
Product Bundle Manifest (PBM). The PBM is a well-defined set of configuration
parameters designed to emulate a specific system and device, and is included in
the Fuchsia SDK for public use. It is also generated by the build system for
in-tree users, according to the parameters supplied to the build.
This crate contains utility functions which call into the PBM library to
retrieve configuration data, and convert it from the PBM library's data
structures into the emulator data structures. The result of these functions will
be checked for internal consistency - for example, if the virtual device has no
audio interface defined, the host shouldn't contain physical device
configuration either. The specific guarantees on each field will be documented
by the internal doc comments for each type.
## The Takeaway
Each of the types laid out in this document serves a specific purpose, and while
they are closely related, they should not have any overlap. If a user attempting
to run identical guest systems on two devices has to change more than just the
VirtualDevice configs for those devices, something is in the wrong place.
On the back end, these types will probably be manipulated by the emulation
engine, combined and adjusted to fit that back-end's design, and ultimately used
to form a single command-line to invoke the emulator. This crate has no interest
in how that happens; the details of how the engine uses the config types are
specific to the engine itself and so out of scope here.