Common questions about UEFI include:
-
How are programs in UEFI implemented?
-
What makes UEFI programming different from an operating system?
-
What makes UEFI different from other firmware environments?
-
In particular, what is the programming model for a UEFI Driver?
Key points about writing UEFI-conformant drivers are that:
-
UEFI Drivers are relocatable PE/COFF images whose format is defined by the Microsoft Portable Executable and Common Object File Format Specification.
-
UEFI Drivers may be compiled for any of the CPU architectures supported by the UEFI Specification.
-
UEFI Drivers run on a single CPU thread.
-
The driver support infrastructure does not extend beyond the boot processor.
-
Drivers sit above some interfaces (for example, bus abstractions) and below other interfaces: They are both consumers and producers. The UEFI Specification defines the interfaces and they are extensible.
-
Each driver is expected to cooperate with other drivers, other modules and the underlying core services.
-
The communicating modules bind together to create stacks of cooperating drivers to accomplish tasks.
-
Inter-module communication is enabled via interfaces known as protocols and via events.
-
Tables provided at invocation provide access to core services.
-
The operating environment is non-preemptive and polled. There are no tasks per se. Instead, modules execute sequentially.
-
There is only one interrupt: the timer. This means that data structures accessed by both in-line code and timer-driven code must take care to synchronize access to critical paths. This is accomplished via privilege levels.