The BIOS (Basic Input/Output System) is typically programmed using low-level languages because it interacts directly with hardware and needs to run before an operating system is loaded. The most common languages used for BIOS development are:
1. Assembly Language (x86 Assembly)
- Used for low-level hardware control and initialization.
- Essential for early boot stages before higher-level languages can be used.
- Example: BIOS interrupt calls (INT 13h for disk access, INT 10h for display control).
2. C Language
- Used for more complex parts of the BIOS after the system has initialized enough hardware to support C execution.
- Provides better readability and maintainability compared to Assembly.
- Most modern BIOS/UEFI firmware is written in C.
3. UEFI BIOS – C and Assembly
- Modern BIOS implementations use UEFI (Unified Extensible Firmware Interface) instead of traditional BIOS.
- UEFI is primarily written in C with some Assembly for low-level hardware setup.
- It follows the UEFI specification, which is typically implemented using EDK2 (EFI Development Kit 2), an open-source UEFI firmware development environment.
4. Scripting Languages for BIOS Configuration
- Python, Perl, and Lua are sometimes used for BIOS testing and configuration automation.
- Not used in the BIOS firmware itself but for development and debugging purposes.
Firmware Development Tools
- TianoCore (EDK2): Open-source implementation of UEFI firmware.
- GCC, LLVM/Clang, and Microsoft Visual Studio: Common compilers used for UEFI firmware development.
In summary, traditional BIOS firmware is mainly written in Assembly and C, while modern UEFI firmware is almost entirely written in C with minimal Assembly for early-stage initialization.