Introduction
Software in complex hardware ecosystems is divided into distinct categories, with application software being the most prominent. This software, which can run locally or as web-based applications, forms the backbone of modern digital experiences and spans various specialties, programming languages, and development approaches. In contrast, firmware operates on smaller hardware like microcontrollers. Software is typically organized in layers, with higher-level components relying on lower-level ones for functionality. Professionals often specialize in specific sub-domains, such as medical device software, where expertise in standards, coding practices, and system architecture is critical. Similar specialization occurs in fields like automotive, finance, and industrial automation.
System Software
System software serves as the essential link between hardware and application software. This article examines the differences between software domains, explores system software’s unique traits, and discusses the role of System on Chip (SoC) manufacturers in supplying foundational system software for embedded systems. Unlike application software, system software interacts directly with hardware or its virtualized equivalent, providing the infrastructure that enables other software to function by abstracting hardware complexities.
Embedded Linux
Embedded Linux is a prime example of system software. A Linux distribution includes key components like the kernel and its subsystems—device drivers, filesystems, networking, and CPU architecture support—which are central to system software. Developers often specialize in areas like the PCI subsystem or storage stacks. System software also encompasses specialized operating systems running on different SoC cores, whether on separate microcontroller units or varying privilege levels on a single microprocessor core. While languages like C, C++, and Rust are used in both application and system software, system software development focuses on speed, low memory usage, fault tolerance, and hardware efficiency, unlike application development’s emphasis on high-level abstractions and domain-specific concerns.
The diagram below illustrates the approximate boundaries between application software, system software, and hardware. While the boundaries in the below image are similar to the userspace, kernel, and hardware layers in a typical representation of MPU running Embedded Linux, there are nuances—some userspace components, like low-level libraries and compilers, fall under system software. FPGA programming, using languages like VHDL and Verilog, is considered hardware development due to its reliance on electronics knowledge.

Developing System Software
Writing system software, such as a Linux device driver, demands a deep understanding of operating system principles, kernel internals, and the Linux driver model, as well as expertise in handling multiprocessing environments, interrupts, and power states. Unlike user-space applications, which run in isolated memory spaces, the kernel operates in a single address space, making it highly susceptible to errors that can crash the system or impair performance. System software thus functions as both a service provider for applications and a manager of hardware resources.
System Software from SoC Manufacturers
In embedded systems, system software is closely tied to hardware, operating systems, and low-level programming. SoC, System on Module (SoM), and Single Board Computer (SBC) vendors like the Raspberry Pi Foundation, STMicroelectronics, NXP, Xilinx and Texas Instruments provide reference operating systems and Board Support Packages (BSPs), often based on Yocto project distributions. These serve as starting points for development, though many customers use them with minimal changes due to the expertise, time, and cost required for customization.
Conclusion
Application software development focuses on software design, frameworks, and proficiency in scripting or compiled languages. In contrast, system software development requires knowledge of operating system constructs, hardware, and the ability to write efficient, compact code. Debugging system software is typically more challenging than debugging application software, underscoring its critical role in bridging hardware and higher-level applications.