A logic component can be implemented using two kinds of components from the physical layer: software solutions external to the solution, and the hardware on which a software solution can rest.
External solutions can be proprietary systems when their implementation is known or non- proprietary when the external solution is considered as a black box for a given solution. The hardware includes physical peripherals, such as disks and network cards; there is then no software layer separating the software from the underlying hardware.
The abstraction layer nearest the devices is the first software layer that receives information from these devices. This layer usually consists of drivers provided by device manufacturers. They complement the devices and permit interpretation of the information by the operating system.
In addition to the peripherals, the central processing unit of a computer, complemented by related hardware such as the motherboard, presents an instruction set that can be used by software. Apart from embedded software solutions, these instructions are generally used by an operating system. 
An initial abstraction, that of the instruction set, is already made, as much by the operating system as by the device drivers. These drivers simplify communication between software components and the underlying devices.
In the context of software development, drivers are generally used by the hardware abstraction layer implemented by the operating system . This abstraction layer, inside the operating system, allows uniform access to devices; the operating system provides programming interfaces (APIs) that can be used by software solutions.
When using a software solution, the combination of interactions between device drivers and the operating system is abstracted by an API. This allows access to device abstraction and the additional level of functionality provided by the operating system.
This API is then a contract in which the operating system offers functionalities to the software solution. Interaction is possible thanks to device drivers that allow communication with the specific interface provided by the device in question.
The software solution then only depends on this API. This software layer comprises the specific implementation made by the devices and the internal implementation of the functionality offered by the operating system.
In order to enrich the interface provided by the operating system, virtual machine applications were created. In particular, the CLR and the Java Virtual Machine (JVM) interact as much with the operating system as with certain device drivers in order to offer a set of features.
The virtual machine applications create a level of abstraction between the code and the operating system API. They allow the client code to run on any environment where a virtual machine is available, insofar as the client code has been designed for that virtual machine. 
The level of abstraction provided by the virtual machine complements the operating system API. Virtual machine applications provide an API that enhances those of the operating system. They can be used in the same manner, and are considered equivalent.
The availability of virtual machine applications impact the availability of the logic components that depend on them. So when evaluating the availability of a logic component, we must take account of the set of components on which the logic component relies. These layers therefore include the operating system and the virtual machine.
The different layers separating the software solution from devices can be complex. Nevertheless, these layers are abstracted together by one virtual component. This software layer constitutes an external dependency of the software solution. This layer, which abstracts physical components, is comprised of the virtual components which are abstractions of one or many physical components in the physical layer of the architecture.
These virtual components constitute all the hardware and software external to a logic component that is abstracted in order to have flexibility during the implementation of the solution. The availability of other physical components on which a logic component relies is then included in the availability of this logic component.
An example would be a logic component that depends on the Microsoft CLR virtual machine and an operating system, and which has a second dependence on a physical server having memory, physical disks, and a network card. This logic component would be composed of the virtual machine, operating system, and memory. There would be two virtual components: for the physical disks, and the network card. Conversely, if the same context must take into account flexibility of the physical implementation of the memory, there could be an abstraction of this physical component to make a virtual component on which the logic component depends.
Any software or hardware layer that is not included in a virtual component is implicitly included in the logic component. If a layer is shared by multiple virtual components, it can be included in the logic component when it is shared between all virtual components of this logic component. If this layer is not shared between all virtual components of a logic component, it must be added to each of the virtual components. If a layer is shared by multiple logic components, it must be included in all the logic components.