Linux kernel interfaces
The Linux kernel provides multiple interfaces to user-space and kernel-mode code. The interfaces can be classified as either application programming interface or application binary interface, and they can be classified as either kernel-user space or kernel-internal.
Linux API
The Linux API includes the kernel-user space API, which allows code in user space to access system resources and services of the Linux kernel. It is composed of the system call interface of the Linux kernel and the subroutines in the C standard library. The focus of the development of the Linux API has been to provide the usable features of the specifications defined in POSIX in a way which is reasonably compatible, robust and performant, and to provide additional useful features not defined in POSIX, just as the kernel-user space APIs of other systems implementing the POSIX API also provide additional features not defined in POSIX.The Linux API, by choice, has been kept stable over the decades through a policy of not introducing breaking changes; this stability guarantees the portability of source code. At the same time, Linux kernel developers have historically been conservative and meticulous about introducing new system calls.
Much available free and open-source software is written for the POSIX API. Since so much more development flows into the Linux kernel as compared to the other POSIX-compliant combinations of kernel and C standard library, the Linux kernel and its API have been augmented with additional features. Programming for the full Linux API, rather than just the POSIX API, may provide advantages in cases where those additional features are useful. Well-known current examples are udev, systemd and Weston. People such as Lennart Poettering openly advocate to prefer the Linux API over the POSIX API, where this offers advantages.
At FOSDEM 2016, Michael Kerrisk explained some of the perceived issues with the Linux kernel's user-space API, describing that it contains multiple design errors by being non-extensible, unmaintainable, overly complex, of limited purpose, in violation of standards, and inconsistent. Most of those mistakes cannot be fixed because doing so would break the ABI that the kernel presents to the user space.
System call interface of the Linux kernel
The system call interface of a kernel is the set of all implemented and available system calls in a kernel. In the Linux kernel, various subsystems, such as the Direct Rendering Manager, define their own system calls, all of which are part of the system call interface.Various issues with the organization of the Linux kernel system calls are being publicly discussed. Issues have been pointed out by Andy Lutomirski, Michael Kerrisk and others.
The C standard library
A C standard library for Linux includes wrappers around the system calls of the Linux kernel; the combination of the Linux kernel system call interface and a C standard library is what builds the Linux API. Some popular implementations of the C standard library areAlthough the landscape is shifting, amongst these options, glibc remains the most popular implementation, to the point of many treating it as the default and the term equivalent to libc.
Additions to POSIX
As in other Unix-like systems, additional capabilities of the Linux kernel exist that are not part of POSIX:- cgroups subsystem, the system calls it introduces and libcgroup
- The system calls of the Direct Rendering Manager, especially the driver-private ioctls for the command submission, are not part of the POSIX specifications.
- Advanced Linux Sound Architecture could set system calls, which are not part of the POSIX specifications
- The system calls
futex,epoll,splice,dnotify,fanotify, andinotifyhave been exclusive to the Linux kernel so far. - The system call
getrandomwas introduced in version 3.17 of the Linux kernel mainline -
memfdwas proposed by the kdbus developers - *
memfd_createwas merged into the Linux kernel mainline in kernel version 3.17 -
readaheadinitiates a file "read-ahead" into page cache
Further libraries
- libdrm
- libnl
- libevdev
- libasound
Linux ABI
An ABI has to be defined for every instruction set, such as x86, x86-64, MIPS, ARMv7-A, ARMv8-A, etc. with the endianness, if both are supported.
It should be able to compile the software with different compilers against the definitions specified in the ABI and achieve full binary compatibility. Compilers that are free and open-source software are e.g. GNU Compiler Collection, LLVM/Clang.
In-kernel APIs
Many kernel-internal APIs exist, allowing kernel subsystems to interface with one another. These are being kept fairly stable, but there is no guarantee for stability. A kernel-internal API can be changed when such a need is indicated by new research or insights; all necessary modifications and testing have to be done by the author.The Linux kernel is a monolithic kernel, hence device drivers are kernel components. To ease the burden of companies maintaining their device drivers outside of the main kernel tree, stable APIs for the device drivers have been repeatedly requested. The Linux kernel developers have repeatedly denied guaranteeing stable in-kernel APIs for device drivers. Guaranteeing such would have faltered the development of the Linux kernel in the past and would still in the future and, due to the nature of free and open-source software, are not necessary. Ergo, by choice, the Linux kernel has no stable in-kernel API.
In-kernel ABIs
Since there are no stable in-kernel APIs, there cannot be stable in-kernel ABIs.Abstraction APIs
For many use cases, the Linux API is considered too low-level, so APIs of higher abstraction must be used. Higher-level APIs must be implemented on top of lower-level APIs. Examples:- Implementation of the OpenGL and Vulkan specifications in proprietary Linux graphics drivers and the free and open-source implementation in Mesa.
- Implementation of the OpenAL specification.
- Simple DirectMedia Layer: abstraction API for input/sound/etc. available for many operating systems.
- Simple and Fast Multimedia Library: like above.