Tux the penguin, mascot of Linux
| |
Linux kernel 3.0.0 booting
| |
Developer | Linus Torvalds and thousands of collaborators |
---|---|
Written in | C and assembly |
OS family | Unix-like |
Initial release | 0.01 (17 September 1991 |
Latest release | 5.0.9 (20 April 2019) |
Latest preview | 5.1-rc6 (21 April 2019) |
Available in | English |
Kernel type | Monolithic |
License | GPLv2 with optional binary blobs |
Official website | kernel |
The Linux kernel is a free and open-source, monolithic, Unix-like operating system kernel. The Linux family of operating systems is based on this kernel and deployed on both traditional computer systems such as personal computers and servers, usually in the form of Linux distributions, and on various embedded devices such as routers, wireless access points, PBXes, set-top boxes, FTA receivers, smart TVs, PVRs, and NAS appliances. While the adoption of the Linux kernel in desktop computer operating system is low, Linux-based operating systems dominate nearly every other segment of computing, from mobile devices to mainframes. As of November 2017, all of the world's 500 most powerful supercomputers run Linux. The Android operating system for tablet computers, smartphones, and smartwatches also uses the Linux kernel.
The Linux kernel was conceived and created in 1991 by Linus Torvalds for his personal computer and with no cross-platform intentions, but has since expanded to support a huge array of computer architectures, many more than other operating systems or kernels. Linux rapidly attracted developers and users who adopted it as the kernel for other free software projects, notably the GNU Operating System, which was created as a free, non-proprietary operating system, and based on UNIX as a by-product of the fallout of the Unix wars.
The Linux kernel API, the application programming interface (API) through which user programs interact with the kernel, is meant to be very stable and to not break userspace programs (some programs, such as those with GUIs, rely on other APIs as well). As part of the kernel's functionality, device drivers control the hardware; "mainlined" device drivers are also meant to be very stable. However, the interface between the kernel and loadable kernel modules (LKMs), unlike in many other kernels and operating systems, is not meant to be very stable by design.
The Linux kernel, developed by contributors worldwide, is a prominent example of free and open source software. Day-to-day development discussions take place on the Linux kernel mailing list (LKML). The Linux kernel is released under the GNU General Public License version 2 (GPLv2), with some firmware images released under various non-free licenses.
History
In April 1991, Linus Torvalds, at the time a 21-year-old computer science student at the University of Helsinki, Finland, started working on some simple ideas for an operating system. He started with a task switcher in Intel 80386 assembly language and a terminal driver. On 25 August 1991, Torvalds posted the following to comp.os.minix, a newsgroup on Usenet:
I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since April, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).
I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months [...] Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.
[...] It's mostly in C, but most people wouldn't call what I write C. It uses every conceivable feature of the 386 I could find, as it was also a project to teach me about the 386. As already mentioned, it uses a MMU, for both paging (not to disk yet) and segmentation. It's the segmentation that makes it REALLY 386 dependent (every task has a 64Mb segment for code & data - max 64 tasks in 4Gb. Anybody who needs more than 64Mb/task - tough cookies). [...] Some of my "C"-files (specifically mm.c) are almost as much assembler as C. [...] Unlike minix, I also happen to LIKE interrupts, so interrupts are handled without trying to hide the reason behind them.
After that, many people contributed code to the project. Early on, the MINIX community contributed code and ideas to the Linux kernel. At the time, the GNU Project had created many of the components required for a free operating system, but its own kernel, GNU Hurd, was incomplete and unavailable. The Berkeley Software Distribution had not yet freed itself from legal encumbrances. Despite the limited functionality of the early versions, Linux rapidly gained developers and users.
In September 1991, Torvalds released version 0.01 of the Linux
kernel on the FTP server (ftp.funet.fi) of the Finnish University and
Research Network (FUNET). It had 10,239 lines of code. On 5 October 1991, version 0.02 of the Linux kernel was released. Torvalds assigned version 0 to the kernel to indicate that it was mainly for testing and not intended for productive use.[18] In December 1991, Linux kernel 0.11 was released. This version was the first to be self-hosted
as Linux kernel 0.11 could be compiled by a computer running the same
kernel version. When Torvalds released version 0.12 in February 1992, he
adopted the GNU General Public License version 2 (GPLv2) over his previous self-drafted license, which had not permitted commercial redistribution.
On 19 January 1992, the first post to the new newsgroup alt.os.linux was submitted. On 31 March 1992, the newsgroup was renamed comp.os.linux. The fact that Linux is a monolithic kernel rather than a microkernel was the topic of a debate between Andrew S. Tanenbaum, the creator of MINIX, and Torvalds. This discussion is known as the Tanenbaum–Torvalds debate and started in 1992 on the Usenet discussion group comp.os.minix as a general debate about Linux and kernel architecture.
Tanenbaum argued that microkernels were superior to monolithic kernels
and that therefore Linux was obsolete. Unlike traditional monolithic
kernels, device drivers in Linux are easily configured as loadable kernel modules and are loaded or unloaded while running the system. This subject was revisited on 9 May 2006,[24] and on 12 May 2006 Tanenbaum wrote a position statement.
In March 1992, the last version 0 Linux kernel was released.
Linux version 0.95 was the first to be capable of running X, as the X Window System had been ported to Linux. In March 1994, the first production version of the Linux kernel was released. Linux kernel 1.0.0 had 176,250 lines of code. Linux kernel 1.0.0 started a standard v.x.y versioning system for the kernel, where x
represents a major version release. Odd-numbered releases were for
tests and development. At the time, only even numbered version releases
were production releases. The y is incremented as minor patches are released within a major version release. In March 1995, the Linux kernel 1.2.0 was released, with 310,950 lines of code.
After kernel version 1.3, Torvalds decided that enough changes
had been made to the Linux kernel to warrant the release of a new
version. Version 2.0.0 of the Linux kernel was released in June 1996. In contrast to Unix, all source files of the Linux kernel are freely available, including device drivers, runtime libraries and development tools.
The initial success of the Linux kernel was driven by the support of
programmers and testers across the world. By structuring the Linux
kernel along POSIX standards, it was compatible with a range of free software and applications that had been developed for universities.
The developers contributing to the Linux kernel have thought it
important that the kernel which Torvalds had written for Intel PCs
supported different hardware architectures. The kernel can now run on
CPUs from Intel (80386, 80486, 80686), Digital Equipment Corporation (Alpha), Motorola (MC680x0 and PowerPC), Silicon Graphics (MIPS) and Sun Microsystems (SPARC). Through an integrated FPU emulator, the Linux kernel can even run on hardware architectures that lack a floating point math coprocessor.
Developer teams were established for different architectures and with
the release of Linux kernel version 2.0 the sources of the kernel
include all components to configure the kernel for different
architectures before compiling it. Making the Linux kernel compatible with different file systems has also been a priority. The Linux kernel can operate file systems that have been formatted for Minix, Xenix or System V, while the umsdos format even allows for Linux to be installed within an MS-DOS partition. In December 1999, IBM mainframe patches for 2.2.13 were published, allowing Linux kernel to be used on enterprise-class machines.
In December 2003, with the release of kernel version 2.6.0,
Torvalds regarded the Linux kernels to be so stable that he started the
2.6.x.y release cycle. Every 2.6 release was a kernel for production,
development releases were indicated with -rc ("release
candidate") appended to the version number. Stable 2.6 kernel releases
started coming out on a regular schedule every 2–3 months, up through
2.6.39 in May 2011.
The shorter release cycle was the result of discussions among kernel
developers regarding the release and version scheme in 2004.
As a response to the lack of a stable kernel tree where people could coordinate the collection of bug fixes as such, in December 2005 Adrian Bunk announced that he would keep releasing 2.6.16.y kernels when the stable team moved on to 2.6.17.
He also included some driver updates, making the maintenance of the
2.6.16 series very similar to the old rules for maintenance of a stable
series such as 2.4.
Since then, the "stable team" had been formed, and it would keep
updating kernel versions with bug fixes. In October 2008 Adrian Bunk
announced that he would maintain 2.6.27 for a few years as a replacement
of 2.6.16. The stable team picked up on the idea and as of 2010 they continue to maintain that version and release bug fixes for it, in addition to others. Andrew Morton decided to repurpose his -mm tree
from memory management to serve as the destination for all new and
experimental code. In September 2007, Morton decided to stop maintaining
this tree. In February 2008 Stephen Rothwell created the linux-next tree to serve as a place where patches aimed to be merged during the next development cycle are gathered. Several subsystem maintainers also adopted the suffix -next for trees containing code which is meant to be submitted for inclusion in the next release cycle. As of January 2014, the in-development version of the Linux kernel is held in an unstable branch named linux-next.
The Linux kernel source code used to be maintained without the help of an automated source code management system, mostly because of Torvalds' dislike of centralized SCM systems. In 2002, Linux kernel development switched to BitKeeper,
an SCM system which satisfied Torvalds' technical requirements.
BitKeeper was made available to Torvald and several others free of
charge but was not free software, which was a source of controversy. The system did provide some interoperability with free SCM systems such as CVS and Subversion.[citation needed] In April 2005, efforts to reverse-engineer the BitKeeper system by Andrew Tridgell
led BitMover, the company which maintained BitKeeper, to stop
supporting the Linux development community. In response, Torvalds and
others wrote a new source code control system for the purpose, called Git. The new system was written within weeks, and in two months the first official kernel release was made using Git.
In 2008 Greg Kroah-Hartman said that since 2005 over 3,700 individual developers from over 200 different companies have contributed to the kernel. The 20th anniversary of the Linux kernel was celebrated by Torvalds in July 2011 with the release of the 3.0.0 kernel version. The Linux Foundation
celebrated the 20th anniversary of the kernel in the 2011 edition of
its kernel development study. Kernel 3.0 had 15 million lines of code
and over 1,300 individual developers had contributed to this version of
the Linux kernel. Volunteer developers contributed 16 percent of the
total changes to the kernel in 2011. The other changes were
contributions by professional software developers who were paid by a
company to submit code to the kernel. In 2011 Red Hat developers contributed 10 percent of the changes made to the kernel, the second largest corporate contributor being Intel, followed by IBM and Novell. While Nokia had by that time abandoned its Linux kernel based smartphone operating system MeeGo, in 2011 Nokia developers still contributed more code to the kernel than the developers employed by Google, which had released Android in 2007 and Chrome OS in 2009. By 2011 Microsoft
ranged as the 17th most prolific corporate contributor to the kernel.
Its developers had first started contributing to the kernel in 2009 to
improving the performance of Linux virtual machines running on top of the Windows Hyper-V hypervisor.
Stable 3.x.y kernels were released until 3.19 in February 2015, with development releases carrying the -rc
designation. To account for the occasional special patch release, the
version 3 series of the kernel added a fourth digit to the version
numbering. In April 2015, Torvalds released kernel version 4.0.
By February 2015 the Linux kernel had received contributions from
nearly 12,000 programmers from more than 1,200 companies, including some
of the world's largest software and hardware vendors.
Version 4.1 of the Linux kernel, released in June 2015, containes over
19.5 million lines of code contributed by almost 14,000 programmers.
Popularity
Linux distributions that bundle the Linux kernel with applications, Unix programs and application packages are responsible for the rising popularity of Linux operating systems among users. The popularity of the Android operating system, which includes the Linux kernel, has made the kernel the most popular choice for mobile devices, rivaling the installed base of all other operating systems.
Many consumer routers also use the Linux kernel, as well as a wide variety of other embedded devices, such as smart TVs, set-top boxes, and webcams. Many desktop Linux distributions including the Linux kernel exist, but the usage share of Linux distributions is low in comparison to other operating systems.
Architecture
The Linux kernel is a monolithic kernel, supporting true preemptive multitasking (both in user mode and, since the 2.6 series, in kernel mode), virtual memory, shared libraries, demand loading, shared copy-on-write executables (via KSM), memory management, the Internet protocol suite, and threading.
Device drivers and kernel extensions run in kernel space (ring 0 in many CPU architectures), with full access to the hardware, although some exceptions run in user space, for example, filesystems based on FUSE/CUSE, and parts of UIO. The graphics system
most people use with Linux does not run within the kernel. Unlike
standard monolithic kernels, device drivers are easily configured as modules,
and loaded or unloaded while the system is running. Also, unlike
standard monolithic kernels, device drivers can be pre-empted under
certain conditions; this feature was added to handle hardware interrupts correctly and to better support symmetric multiprocessing. By choice, the Linux kernel has no binary kernel interface.
The hardware is also incorporated into the file hierarchy. Device drivers interface to user applications via an entry in the /dev or /sys directories. Process information as well is mapped to the file system through the /proc directory.
User mode | User applications | For example, bash, LibreOffice, GIMP, Blender, 0 A.D., Mozilla Firefox, etc. | ||||
---|---|---|---|---|---|---|
Low-level system components: | System daemons: systemd, runit, logind, networkd, PulseAudio, ... |
Windowing system: X11, Wayland, SurfaceFlinger (Android) |
Other libraries: GTK+, Qt, EFL, SDL, SFML, FLTK, GNUstep, etc. |
Graphics: Mesa, AMD Catalyst, ... | ||
C standard library | open(), exec(), sbrk(), socket(), fopen(), calloc(), ... (up to 2000 subroutines) glibc aims to be POSIX/SUS-compatible, uClibc targets embedded systems, bionic written for Android, etc. | |||||
Kernel mode | Linux kernel | stat, splice, dup, read, open, ioctl, write, mmap, close, exit, etc. (about 380 system calls) The Linux kernel System Call Interface (SCI, aims to be POSIX/SUS-compatible) | ||||
Process scheduling subsystem |
IPC subsystem |
Memory management subsystem |
Virtual files subsystem |
Network subsystem | ||
Other components: ALSA, DRI, evdev, LVM, device mapper, Linux Network Scheduler, Netfilter Linux Security Modules: SELinux, TOMOYO, AppArmor, Smack | ||||||
Hardware (CPU, main memory, data storage devices, etc.) |
Programming language
The Linux kernel is written in the version of the C programming language supported by GCC (which has introduced a number of extensions and changes to standard C), together with a number of short sections of code written in the assembly language
(in GCC's "AT&T-style" syntax) of the target architecture. Because
of the extensions to C it supports, GCC was for a long time the only
compiler capable of correctly building the Linux kernel.
Compiler compatibility
GCC is the default compiler for the Linux kernel source. In 2004, Intel claimed to have modified the kernel so that its C compiler was also capable of compiling it. There was another such reported success in 2009, with a modified 2.6.22 version of the kernel.
Since 2010, effort has been underway to build the Linux kernel with Clang, an alternative compiler for the C language; as of 12 April 2014, the official kernel could almost be compiled by Clang. The project dedicated to this effort is named LLVMLinux after the LLVM compiler infrastructure upon which Clang is built.
LLVMLinux does not aim to fork either the Linux kernel or the LLVM,
therefore it is a meta-project composed of patches that are eventually
submitted to the upstream projects. By enabling the Linux kernel to be
compiled by Clang that, among other advantages, is known for faster
compilation compared with GCC, kernel developers may benefit from a
faster workflow due to shorter compilation times.
Interfaces
Conformance to standards is a general policy for the Linux kernel's
internals. Another rule is that a kernel component is not accepted into
the Linux kernel mainline if there is only proprietary user-space
software using that component.
Kernel-to-userspace API
Source code portability ensures that a C program written by
conforming to a standard can be successfully compiled and run on any
system that also conforms to the same standard. The relevant standards,
aiming to achieve source code portability of programs, that the
development of the Linux kernel, the GNU C Library, and associated utilities try to adhere to, are POSIX and the Single UNIX Specification.
The Linux kernel API of the Linux kernel, representing the kernel's system call interface, is composed of the available system calls.
Kernel-to-userspace ABI
Binary portability shall guarantee that any program once compiled for
a given hardware platform, can be run in its compiled form on any other
hardware platform that conforms to the standard. Binary portability is
an essential requirement for the commercial viability of independent software vendor
(ISV) applications built for the operating systems based on the Linux
kernel. Binary compatibility is much more demanding than source code
portability; as of February 2014, the only standard concerning itself
with binary compatibility is the Linux Standard Base (LSB).
In-kernel API
There is a couple of kernel internal APIs utilized between the
different subsystems and subsystems of subsystems. Some of them have
been kept stable over several releases, others have not. There are no
guarantees regarding the in-kernel APIs. Maintainers and contributors
are free to augment or change them at any time.
Examples of in-kernel APIs include software frameworks/APIs for the following classes of device drivers:
- Video4Linux – for video capture hardware
- Advanced Linux Sound Architecture (ALSA) – for sound cards
- New API – for network interface controllers
- Direct Rendering Manager – for graphics accelerators
- KMS driver – for display controllers
- mac80211 – for wireless network interface controllers
- WEXT – for wireless network interface controllers (obsolete).
In-kernel ABI
The Linux kernel developers choose not to maintain a stable in-kernel ABI.
Technical features
Preemption
The Linux kernel provides preemptive scheduling
under certain conditions. Until kernel version 2.4, only user processes
were preemptive, i.e., in addition to time quantum expiration, an
execution of current process in user mode would be interrupted if higher dynamic priority processes entered
TASK_RUNNING
state. Toward 2.6 series of the Linux kernel, an ability to interrupt a task executing kernel code was added, although with that not all sections of the kernel code can be preempted.
The Linux kernel contains different scheduler classes. By default the kernel uses a scheduler mechanism called the Completely Fair Scheduler introduced in the 2.6.23 version of the kernel. Internally this default-scheduler class is also known as
SCHED_OTHER
, but the kernel also contains two POSIX-compliant real-time scheduling classes named SCHED_FIFO
(realtime first-in-first-out) and SCHED_RR
(realtime round-robin), both of which take precedence over the default class.
Through the use of the real-time Linux kernel patch
PREEMPT_RT
, support for full preemption of critical sections, interrupt handlers, and "interrupt disable" code sequences can be supported. Partial mainline integration of the real-time Linux kernel patch already brought some functionality to the kernel mainline. Preemption improves latency, increases responsiveness, and makes Linux more suitable for desktop and real-time applications. Older versions of the kernel had a so-called big kernel lock for synchronization across the entire kernel, which was finally removed by Arnd Bergmann in 2011.
Additional scheduling policy known as
SCHED_DEADLINE
, implementing the earliest deadline first algorithm (EDF), was added in kernel version 3.14, released on 30 March 2014.
Portability
While not originally designed to be portable, Linux is now one of the most widely ported operating system kernels, running on a diverse range of systems from the ARM architecture to IBM z/Architecture mainframe computers. The first port beyond Linux's original 386 architecture was performed on the Motorola 68000 platform by Amiga
users, who accomplished this by replacing major parts of the kernel.
The modifications to the kernel were so fundamental that Torvalds viewed
the Motorola version as a fork and a "Linux-like operating system"
rather than as an actual port. It was, however, the impetus that
Torvalds needed to lead a major restructure of the kernel code to
facilitate porting to competing computing architectures. The first Linux
endorsed port was to the DEC Alpha AXP 64-bit platform which was demonstrated at DECUS in May, 1995m supporting both 386 and Alpha in a single source tree. DEC was responsible for supplying the hardware necessary to Torvalds to enable a port of Linux to 64 bits that same year.
Linux runs as the main operating system on IBM's Blue Gene and other fastest supercomputers, including the top American one. As of January 2019, all of the world's 500 fastest supercomputers run some variant of Linux. Linux has also been ported to various handheld devices such as Apple's iPod and iPhone.
Kernel variants
There are certain variants of the Linux kernel that provide
additional functionality but do not belong to the Linux kernel mainline.
Such variants of the Linux kernel include Linux-libre, Compute Node Linux, Cooperative Linux, Longene, grsecurity, INK, L4Linux, MkLinux, RTLinux, and User-mode Linux. Some of these variants have been partially merged into the mainline.
Some operating systems developed for mobile phones initially used
heavely modified versions of the Linux kernel, including Google Android, Firefox OS, HP webOS, Nokia Maemo and Jolla Sailfish OS. In 2010 the Linux kernel community criticised Google for effectively starting its own kernel tree:
This means that any drivers written for Android hardware platforms, can not get merged into the main kernel tree because they have dependencies on code that only lives in Google's kernel tree, causing it to fail to build in the kernel.org tree. Because of this, Google has now prevented a large chunk of hardware drivers and platform code from ever getting merged into the main kernel tree. Effectively creating a kernel branch that a number of different vendors are now relying on.
— Greg Kroah-Hartman, 2010
Today Android uses a slightly customised Linux kernel
were changes are implemented in device drivers so that little or no
change to the core kernel code is required. Android developers also
submit patches to the mainline Linux kernel and the mainline kernel can
boot the Android operating system. A Nexus 7 can boot and run a mainline Linux kernel.
Kernel panic and oopses
In Linux, a "panic" is an unrecoverable system error detected by the kernel, as opposed to similar errors detected by user space code. It is possible for kernel code to indicate such a condition by calling the
panic
function located in the header file sys/system.h. However, most panics are the result of unhandled processor exceptions in kernel code, such as references to invalid memory addresses. These are typically indicative of a bug
somewhere in the call chain leading to the panic. They can also
indicate a failure of hardware, such as a failed RAM cell or errors in
arithmetic functions in the processor caused by a processor bug, overheating/damaged processor, or a soft error.
A report of a non-fatal bug in the kernel is called an "oops"; such deviations from correct behavior of the Linux kernel may allow continued operation with compromised reliability. These crash reports are automatically collected and can be sent upstream by various software, such as kerneloops, ABRT (Fedora) and apport (Ubuntu). KernelOops.org collects these reports and publishes statistics on their website.
The kernel panic message might not be printed visibly in some
conditions, such as when using a graphical desktop. To debug such
conditions, other methods such as attaching a serial port console can be
used.
Live patching
Rebootless updates can even be applied to the kernel by using live patching technologies such as Ksplice, kpatch and kGraft.
Minimalistic foundations for live kernel patching were merged into the
Linux kernel mainline in kernel version 4.0, which was released on 12
April 2015. Those foundations, known as livepatch and based primarily on the kernel's ftrace functionality, form a common core capable of supporting hot patching by both kGraft and kpatch, by providing an application programming interface (API) for kernel modules that contain hot patches and an application binary interface (ABI) for the userspace management utilities. However, the common core included into Linux kernel 4.0 supports only the x86 architecture and does not provide any mechanisms for ensuring function-level consistency while the hot patches are applied. As of April 2015, there is ongoing work on porting kpatch and kGraft to the common live patching core provided by the Linux kernel mainline.
Security
Computer security
is a much-publicized topic in relation to the Linux kernel because a
large portion of the kernel bugs present potential security flaws. For
example, they may allow for privilege escalation or create denial-of-service attack vectors. Over the years, numerous such flaws were found and fixed in the Linux kernel. New security features are frequently implemented to improve the Linux kernel's security.
Critics have accused kernel developers of covering up security
flaws or at least not announcing them; in 2008, Linus Torvalds responded
to this with the following:
I personally consider security bugs to be just "normal bugs". I don't cover them up, but I also don't have any reason what-so-ever to think it's a good idea to track them and announce them as something special...one reason I refuse to bother with the whole security circus is that I think it glorifies—and thus encourages—the wrong behavior. It makes "heroes" out of security people, as if the people who don't just fix normal bugs aren't as important. In fact, all the boring normal bugs are way more important, just because there's a lot more of them. I don't think some spectacular security hole should be glorified or cared about as being any more "special" than a random spectacular crash due to bad locking.
Linux distributions typically release security updates to fix vulnerabilities in the Linux kernel. Many offer long-term support releases that receive security updates for a certain Linux kernel version for an extended period of time.
Feature history
Version 1.0 of the Linux kernel was released on 14 March 1994. This release of the Linux kernel only supported single-processor i386-based computer systems. Portability became a concern, and so version 1.2 (released 7 March 1995) gained support for computer systems using processors based on the Alpha, SPARC, and MIPS architectures.
Version 2.0 was released on 9 June 1996. The series included 41 releases. The major feature of 2.0 was support for symmetric multiprocessing (SMP) and support for more types of processors.
Version 2.2, released on 20 January 1999, removed the global spinlock and provided improved SMP support, added support for the m68k and PowerPC architectures, and added new file systems (including read-only support for Microsoft's NTFS).
Version 2.4.0, released on 4 January 2001, contained support for ISA Plug and Play, USB, and PC Cards. It also included support for the PA-RISC processor from Hewlett-Packard. Development for 2.4.x changed a bit in that more features were made available throughout the duration of the series, including support for Bluetooth, Logical Volume Manager (LVM) version 1, RAID support, InterMezzo and ext3 file systems.
Version 2.6.0 was released on 17 December 2003. The development for 2.6.x
changed further towards including new features throughout the duration
of the series. Among the changes that have been made in the 2.6 series
are: integration of µClinux into the mainline kernel sources, PAE support, support for several new lines of CPUs, integration of Advanced Linux Sound Architecture (ALSA) into the mainline kernel sources, support for up to 232 users (up from 216), support for up to 229 process IDs (64-bit only, 32-bit arches still limited to 215), substantially increased the number of device types and the number of devices of each type, improved 64-bit support, support for file systems which support file sizes of up to 16 terabytes, in-kernel preemption, support for the Native POSIX Thread Library (NPTL), User-mode Linux integration into the mainline kernel sources, SELinux integration into the mainline kernel sources, InfiniBand support, and considerably more. Also notable are the addition of several file systems throughout the 2.6.x releases: FUSE, JFS, XFS, ext4
and more. Details on the history of the 2.6 kernel series can be found
in the ChangeLog files on the 2.6 kernel series source code release area
of kernel.org.
Version 3.0 was released on 22 July 2011.
On 30 May 2011, Torvalds announced that the big change was "NOTHING.
Absolutely nothing." and asked, "...let's make sure we really make the
next release not just an all new shiny number, but a good kernel too." After the expected 6–7 weeks of the development process, it would be released near the 20th anniversary of Linux.
In December 2012, Torvalds decided to reduce kernel complexity by removing support for i386 processors, making the 3.7 kernel series the last one still supporting the original processor. The same series unified support for the ARM processor.
Version 3.11, released on 2 September 2013, adds many new features such as new
O_TMPFILE
flag for to reduce temporary file vulnerabilities, experimental AMD Radeon dynamic power management, low-latency network polling, and zswap (compressed swap cache).
Version 4.15, released on 28 January 2018 includes some fixes for the Spectre and Meltdown hardware vulnerabilities affecting Intel x86 microprocessors, IBM POWER processors, and some ARM-based microprocessors.
The numbering change from 2.6.39 to 3.0, and from 3.19 to 4.0,
involved no meaningful technical differentiation. The major version
number was increased to avoid large minor numbers.
Development
Developer community
As
of 2007, the development of the kernel had shifted from the top 20 most
active developers writing 80% of the code to the top 30 writing 30% of
the code, with top developers spending more time reviewing changes.
Developers can also be categorized by affiliation; in 2007, the top
category was unknown while the top corporation was Red Hat with 12% of
contributions, and known amateurs at 3.9%.
The kernel changes made in the year 2007 have been submitted by over
1900 developers, which may be a significant underestimate because
developers working in teams usually count as one.
It is generally assumed that the community of Linux kernel developers comprises 5000 or 6000 members. Update from the 2016 Linux Kernel Development Report,
issued by the Linux Foundation, covering the period from 3.18 (December
2014) to 4.7 (July 2016): About 1500 developers are contributing to
each release from about 200-250 companies on average per release. The
top 30 developers contributed a little more than 16% of the code. As of
companies, the top contributors are Intel (12.9%) and Red Hat (8.0%),
the third and fourth places are held by the 'none' (7.7%) and 'unknown'
(6.8%) categories.
Instead of a roadmap, there are technical guidelines. Instead of a central resource allocation, there are persons and companies who all have a stake in the further development of the Linux kernel, quite independently from one another: People like Linus Torvalds and I don’t plan the kernel evolution. We don’t sit there and think up the roadmap for the next two years, then assign resources to the various new features. That's because we don’t have any resources. The resources are all owned by the various corporations who use and contribute to Linux, as well as by the various independent contributors out there. It's those people who own the resources who decide...
— Andrew Morton, 2005
Submitting code to the kernel
A
developer who wants to change the Linux kernel starts with developing
and testing that change. Depending on how significant the change is and
how many subsystems it modifies that change will either consist of a
single patch or of multiple patches of source code.
In case of a single subsystem that is maintained by a single
maintainer, these patches are sent as e-mails to the maintainer of the
subsystem with the appropriate mailing list in Cc. The maintainer and
the readers of the mailing list will review the patches and provide
feedback. Once the review process has finished the maintainer accepts
the patches in his Git
kernel tree. If these changes are bug fixes that are considered
important enough a pull request that includes the patches will be sent
to Torvalds within a few days. Otherwise, a pull request will be sent to
Torvalds during the next merge window. The merge window usually lasts
two weeks and starts immediately after the release of the previous
kernel version. The Git kernel source tree names all developers who have contributed to the Linux kernel in the Credits directory and all subsystem maintainers are listed in Maintainers.
Development model
The Linux kernel project integrates new code on a rolling basis. Software checked into the project must work and compile
without error. For each kernel subsystem there is a maintainer who is
responsible for reviewing patches against the kernel code standards and
keeps a queue of patches that can be submitted to Linus Torvalds within a
merge window of several weeks. Patches are merged by Torvalds into the
source code of the prior stable Linux kernel release, creating the -rc
release candidate for the next stable kernel. Once the merge window is
closed only fixes to the new code in the development release are
accepted. The -rc development release of the kernel goes through regression tests
and once it is judged to be stable by Torvalds and the kernel subsystem
maintainers a new Linux kernel is released and the development process
starts all over again.
Developers who feel treated unfairly can report this to the Linux Foundation's Technical Advisory Board. In July 2013 the maintainer of the USB 3.0 driver Sarah Sharp
asked Torvalds to address the abusive commentary in the kernel
development community. In 2014 Sharp backed out of Linux kernel
development, saying that "The focus on technical excellence, in
combination with overloaded maintainers, and people with different
cultural and social norms, means that Linux kernel maintainers are often
blunt, rude, or brutal to get their job done".
At the linux.conf.au (LCA) conference in 2018 developers expressed the
view that the culture of the community has gotten much better in the
past few years. Daniel Vetter, the maintainer of the Intel drm/i915
graphics kernel driver, commented that the "rather violent language and
discussion" in the kernel community has decreased or disappeared.
Laurent Pinchart asked developers for feedback on their
experience with the kernel community at the 2017 Embedded Linux
Conference Europe. The issues brought up were a few days later discussed
at the Maintainers Summit. Concerns over the lack of consistency in how
maintainers responded to patches submitted by developers were echoed by
Shuah Khan,
the maintainer of the kernel self-test framework. Torvalds contended
that there would never be consistency in the handling of patches because
different kernel subsystems have over time adopted different
development processes. Therefore it was agreed upon that each kernel
subsystem maintainer would document the rules for patch acceptance.
Development community conflicts
There have been several notable conflicts among Linux kernel developers. Examples of such conflicts are:
- In July 2007 Con Kolivas announced that he would cease developing for the Linux kernel. Discussing his reasons in an interview, he expressed frustration with aspects of the mainline kernel development process, which he felt did not give sufficient priority to desktop interactivity, in addition to hacking taking a toll on his health, work and family.
- In July 2009 Alan Cox quit his role as the TTY layer maintainer after disagreement with Linus Torvalds about the scope of work required to fix an error in that subsystem.
- In December 2010 there was a discussion between Linux SCSI maintainer James Bottomley and SCST maintainer Vladislav Bolkhovitin about which SCSI target stack should be included in the Linux kernel - SCST or LIO. Although at that time SCST was considered technically superior, LIO was merged upstream. This made some Linux users upset.
- In June 2012 Torvalds made it very clear that he did not agree with NVIDIA releasing its drivers as closed source drivers by showing the middle finger gesture.
- In April 2014 Torvalds banned Kay Sievers from submitting batches to the Linux kernel for failing to deal with bugs that caused systemd to negatively interact with the kernel.
- In October 2014 Lennart Poettering accused Torvalds of tolerating the rough discussion style on Linux kernel related mailing lists and of being a bad role model.
- In March 2015 Christoph Hellwig filed a lawsuit against VMware for infringement of the copyright on the Linux kernel. Linus Torvalds made it clear that he did not agree with this and similar initiatives by calling lawyers a festering disease.
Prominent Linux kernel developers have been aware of the importance of avoiding conflicts between developers. For a long time there has been no code of conduct for kernel developers due to opposition by Linus Torvalds. However, a Linux Kernel Code of Conflict was introduced on 8 March 2015. It was replaced on 16 September 2018 by a new Code of Conduct based on the Contributor Covenant. This coincided with a public apology by Linus and a brief break from kernel development. Later the word that potentially can be offensive have been automatically replaced with less offensive one. .
Codebase
As of 2013,
the 3.10 release of the Linux kernel had 15,803,499 lines of code. As
of 2007, roughly 5% of the code is part of the "core" while 52% is
drivers.
Linux is evolution, not intelligent design!
— Linus Torvalds, 2005
Estimated cost to redevelop
The cost to redevelop the Linux kernel version 2.6.0 in a traditional
proprietary development setting has been estimated to be US$612 million
(€467M, £394M) in 2004 prices using the COCOMO man-month estimation model.
In 2006, a study funded by the European Union put the redevelopment
cost of kernel version 2.6.8 higher, at €882M ($1.14bn, £744M).
This topic was revisited in October 2008 by Amanda McPherson,
Brian Proffitt, and Ron Hale-Evans. Using David A. Wheeler's
methodology, they estimated redevelopment of the 2.6.25 kernel now costs
$1.3bn (part of a total $10.8bn to redevelop Fedora 9).
Again, Garcia-Garcia and Alonso de Magdaleno from University of Oviedo
(Spain) estimate that the value annually added to kernel was about €100M
between 2005 and 2007 and €225M in 2008, it would cost also more than
€1bn (about $1.4bn as of February 2010) to develop in the European
Union.
As of 7 March 2011, using then-current LOC
(lines of code) of a 2.6.x Linux kernel and wage numbers with David A.
Wheeler's calculations it would cost approximately $3bn (about €2.2bn)
to redevelop the Linux kernel as it keeps getting bigger. An updated
calculation As of 26 September 2018, using then-current 20,088,609 LOC
(lines of code) for the 4.14.14 Linux kernel and the current US National
average programmer salary of $75,506 show it would cost approximately
$14,725,449,000 dollars (£11,191,341,000 pounds) to rewrite the existing
GPL-2.0 code that existing contributors still have claimed to if they
decided to rescind the grant of license to the kernel source tree.
Maintenance and long-term support
The
latest kernel version and older kernel versions are maintained
separately. Most latest kernel releases were supervised by Linus
Torvalds. Current versions are released by Greg Kroah-Hartman.
The Linux kernel developer community maintains a stable kernel by applying fixes for software bugs
that have been discovered during the development of the subsequent
stable kernel. Therefore www.kernel.org will always list two stable
kernels. The next stable Linux kernel is now released only 8 to 12 weeks
later. Therefore the Linux kernel maintainers have designated some
stable kernel releases as longterm, these long-term support Linux kernels are updated with bug fixes for two or more years. In March 2019 there were six longterm Linux kernels: 4.19.32, 4.14.109, 4.9.166, 4.4.177, 3.18.137 and 3.16.64.
Versions 2.6.16 and 2.6.27 of the Linux kernel were unofficially supported in a long-term support (LTS) fashion, before a 2011 working group in the Linux Foundation started a formal long-term support initiative.
Relation with Linux distributions
Most Linux users run a kernel supplied by their Linux distribution. Some distributions ship the "vanilla" or "stable" kernels. However, several Linux distribution vendors (such as Red Hat and Debian)
maintain another set of Linux kernel branches which are integrated into
their products. These are usually updated at a slower pace compared to
the "vanilla" branch, and they usually include all fixes from the
relevant "stable" branch, but at the same time they can also add support
for drivers or features which had not been released in the "vanilla"
version the distribution vendor started basing their branch from.
Source code management
The Linux kernel development community uses Git to manage the kernel source code. Linus Torvalds initially developed this version control system
with speed in mind and as a distributed system. Git users can obtain
the latest pushed version of Torvalds' tree and keep up to date with the
official kernel tree using the git pull. The kernel source code is distributed in GNU zip (gzip) and bzip2
format. Source code contributions by developers are submitted as
patches and incremental changes to the kernel source code means
developers can seamlessly move from one Linux kernel version to the
next.
Timeline
Legal aspects
GPLv2 licensing terms
The Linux kernel is released under the GNU General Public License version 2 (GPLv2), with some firmware images released under various non-free licenses. Initially, Torvalds released Linux under a license which forbade any commercial use. This was changed in version 0.12 by a switch to the GNU General Public License version 2 (GPLv2).
This license allows distribution and sale of possibly modified and
unmodified versions of Linux but requires that all those copies be
released under the same license and be accompanied by the complete
corresponding source code. Torvalds has described licensing Linux under the GPLv2 as the "best thing I ever did".
The Linux kernel is licensed explicitly only under version 2 of the GPL,
without offering the licensee the option to choose "any later version",
which is a common GPL extension. There was considerable debate about
how easily the license could be changed to use later GPL versions
(including version 3), and whether this change is even desirable. Torvalds himself specifically indicated upon the release of version 2.4.0 that his own code is released only under version 2. However, the terms of the GPL state that if no version is specified, then any version may be used, and Alan Cox pointed out that very few other Linux contributors had specified a particular version of the GPL.
In September 2006, a survey of 29 key kernel programmers
indicated that 28 preferred GPLv2 to the then-current GPLv3 draft.
Torvalds commented, "I think a number of outsiders... believed that I
personally was just the odd man out because I've been so publicly not a
huge fan of the GPLv3." This group of high-profile kernel developers, including Torvalds, Greg Kroah-Hartman and Andrew Morton, commented on mass media about their objections to the GPLv3. They referred to clauses regarding DRM/tivoization, patents, "additional restrictions" and warned a Balkanisation of the "Open Source Universe" by the GPLv3. Linus Torvalds, who decided not to adopt the GPLv3 for the Linux kernel, reiterated his criticism even years later.
Loadable kernel modules
It is debated whether loadable kernel modules (LKMs) are to be considered derivative works under copyright law, and thereby fall under the terms of the GPL.
Torvalds has stated his belief that LKMs using only a limited,
"public" subset of the kernel interfaces can sometimes be non-derived
works, thus allowing some binary-only drivers and other LKMs that are
not licensed under the GPL. A good example for this is the usage of dma_buf by the proprietary Nvidia graphics drivers. dma_buf is a recent
kernel feature (like the rest of the kernel, it is licensed under the
GPL), which allows multiple GPUs to quickly copy data into each other's
framebuffers. One possible use case would be Nvidia Optimus that pairs a fast GPU with an Intel integrated GPU, where the Nvidia GPU writes into the Intel
framebuffer when it is active. But, Nvidia cannot use this
infrastructure because it uses a technical means to enforce the rule
that it can only be used by LKMs that are also GPL. Alan Cox replied on LKML, rejecting a request from one of their engineers to remove this technical enforcement from the API.
Not all Linux kernel contributors agree with this interpretation,
however, and even Torvalds agrees that many LKMs are clearly derived
works, and indeed he writes that "kernel modules ARE derivative 'by
default'".
On the other hand, Torvalds has also said that "one gray area in
particular is something like a driver that was originally written for
another operating system (i.e. clearly not a derived work of Linux in
origin). [...] THAT is a gray area, and _that_ is the area where I
personally believe that some modules may be considered to not be derived
works simply because they weren't designed for Linux and don't depend
on any special Linux behaviour". Proprietary
graphics drivers, in particular, are heavily discussed. Ultimately, it
is likely that such questions can only be resolved by a court.
Firmware binary blobs
One point of licensing controversy is the use of firmware "binary blobs"
in Linux kernel to support several hardware devices. These files are
under a variety of licenses, out of which many are restrictive and their
exact underlying source code is usually unknown.
In 2002, Richard Stallman stated why, in his point of view, such blobs make the Linux kernel partially non-free software, and that distributing Linux kernel "violates the GPL", which requires "complete corresponding source code" to be available. In 2008, Free Software Foundation Latin America started Linux-libre
as a project that creates a completely free variant of the Linux kernel
without proprietary objects; it is used by certain completely free
Linux distributions, such as those endorsed by the Free Software Foundation, while it can also be used on most distributions.
On 15 December 2010, the Debian Project announced that the next Debian stable version "6.0 Squeeze" would come with a kernel "stripped of all non-free firmware bits". This policy continued to be applied in later stable Debian releases.
Trademark
Linux is a registered trademark of Linus Torvalds
in the United States and some other countries. This is the result of an
incident in which William Della Croce, Jr., who was not involved in the
Linux project, trademarked the name and subsequently demanded royalties for its use.
Several Linux backers retained legal counsel and filed suit against
Della Croce. The issue was settled in August 1997 when the trademark was
assigned to Linus Torvalds.
SCO litigation
In early 2007, SCO filed the specific details of a purported
copyright infringement. Despite previous claims that SCO was the
rightful owner of 1 million lines of code, they specified only 326 lines
of code, most of which were uncopyrightable. In August 2007, the court in the Novell case ruled that SCO did not actually own the Unix copyrights, to begin with, though the Tenth Circuit Court of Appeals ruled in August 2009 that the question of who owned the copyright properly remained for a jury to answer. The jury case was decided on 30 March 2010 in Novell's favour.