---

UPDATED: Joe Pranevich — Wonderful World of Linux 2.4 – “Back on the Table Edition”

By Joe
Pranevich

(Sun, 06 Feb 2000: I have updated my Linux 2.4
document. As I indicated, I’m going to try and keep the file
updated now with only relatively minor changes until 2.4 is really
released. This will only work for me if there aren’t any major
changes– and we both know how likely that is.

Changes in this version: spelling and punctuation, khttpd,
Merced, scheduler, and I tried to clarify some texts that people
were asking me questions about. — Joe Pranevich)

In the beginning, there was Linus and his 386. For reasons far
too complicated to be discussed here, he decided not to use the
commonly available Operating System of the time and instead decided
to write his own. Several years and many thousands of lines of code
later, Linux 2.2 was released. Linux 2.2 was a milestone in and of
itself and I wrote an article about it which I am quite happy with.
Unfortunately for me however (and fortunately for the rest of the
world), Linus (and company) continued to hack away at the Linux OS
and the 2.4 release of the Linux kernel is almost completed.
Submitted for your approval, this document describes some of the
new features in Linux 2.4. (This document is based on Linux 2.3.42,
the most recent developers kernel to date. When the development
series reaches maturity, it will become Linux 2.4.0. I have not
gone through all the patches to Linux 2.3 yet. In specific, I have
read through many recent patches and most of the oldest ones but
have not been able to get to the ones “in the middle.” If there are
any glaring omissions, they are likely in there and I will attempt
to get those remedied before the final revision of this
document.)

Unlike the pre-release announcements of some other
Operating Systems, the features described in this document already
exist in the Linux 2.3 (developers) kernel. As Linux is true to the
Open Source philosophy, features are added by largely independent
developers as they discover a particular need or a bug in the
existing code. These submissions are checked out by Linus and by
his unofficial lieutenants for quality; this filtering process is
what keeps Linux cohesive even with its potentially huge developer
base. (It is probably on the basis of quality that I personally
have never gotten any sizable patches into the kernel
myself.)

Also in the spirit of the Open Source movement,
products are released “when they are ready” and generally do not
have announced release dates. Currently, Linux 2.3 is in a light
code freeze but several new large features and API changes have
been added relatively recently. My personal feeling is that we will
soon enter a “real” code freeze and we may be able to expect a
Linux 2.4 within a few months. (Keep in mind that it may be several
months longer before distributions pick up the new kernel for
wide-spread release as they have to do their own rounds of
testing.)

A disclaimer: not all of the features in this document
will be production quality when 2.4 is released. In the past, some
drivers and other features have been flagged as experimental in the
kernel configuration system. These drivers and features are
available for anyone to use but are often not included in the
pre-packaged distributions. These drivers and features also may not
be up to the same high-quality as the rest of the Linux kernel
however your feedback and bug reports can help them to
mature.

This draft of the WWOL2.4 is subtitled the “Back on the
Table” edition and will most likely be followed by several later
drafts which will probably also be somewhat final. If I missed a
change that you feel is important, please let me know and I’ll
think really hard about adding it.

Joe - [email protected]   (Home) 
      [email protected]        (Work)

< Many thanks to linuxtoday for providing me
with the spiffy email addy. Other than the email, I’m in no way
associated with nor speak for Linux Today. This work also has
absolutely nothing to do with Lycos, my employer. The views here
are all mine and this article does not constitute an endorsement
from Lycos or any other such thing. They are however a pretty damn
fine company to work for. >

Linux Internals

Linux 2.2 was a major improvement over Linux 2.0 and the Linux
1.x series. It supported many new filesystems, a new system of file
caching, and it was much more scalable. Linux 2.4 builds on these
things and more to be the best darned Linux kernel yet in a variety
of situations.

The Linux kernel is an assortment of modular components and
subsystems including device drivers, protocols, and other component
types. These are glued to the core of the Linux kernel by APIs,
programming interfaces, that provide a standard method by which the
Linux kernel can be expanded. Most of this document will focus on
these components of the Linux OS as these are the components that
seem to do the most work. These are the components that drive your
disks, read your files, and do all of the obvious and physical
things. Linux 2.4 is however much more than just these components.
These assorted drivers and APIs all revolve around a common center
of the Linux kernel. This center includes such fundamental features
as the scheduler, the memory manager, the virtual filesystem, and
the resource allocator.

Linux 2.4 is the first release of the Linux kernel which will
include a full-featured resource management subsystem. Previous
incarnations of Linux included some vestiges of support, but it was
considered kludgy and did not provide the functionality needed for
the “Plug and Play” world. Unlike many of the other internal
changes, many users will be able to directly experience this change
as it impacts the way resources are allocated and reported in the
kernel. As part of this change, the PCI card database deprecated in
Linux 2.2 has been un-deprecated so that all resources can have an
associated device name, rather than just an associated driver.

The new release of the Linux kernel also fixes some problems
with the way the VFS (virtual filesystem layer) and the file caches
were handled. In older versions of Linux, file caching was
dependent on a dual-buffer system which simplified some issues, but
caused many headaches for kernel developers who had to make sure
that it was not possible for these buffers to be out of synch.
Additionally, the presence of the redundant buffer increased memory
use and slowed down the system as the kernel would have to do extra
work to keep things in synch.

Linux’s ability to handle processes and users have also been
vastly expanded in the 2.4. Older versions of Linux included
relatively low limits on the number of simultaneously executing
processes and number of unique users on a system– two conditions
that were definitely hurting Linux’s entrance into Enterprise
environments. Linux 2.4 fixes these problems by providing a
scalable and configurable process limit and increasing the maximum
number of users to about 4.2 billion (2^32.) Additionally, the
scheduler’s efficiency has been improved somewhat and Linux may be
able to better handle systems with a large number of concurrent
processes.

Linux 2.4 can also handle much larger “enterprise-class”
hardware than could previous Linux kernel revisions. For example,
Linux 2.4 now includes support for more than 4 gigabytes of RAM on
any hardware that can support it, (including Intel hardware,) more
than 16 ethernet cards, more than 10 IDE controllers, multiple
IO-APICs, and other seemingly pointless abuses of good hardware.
Linux 2.4 also includes a much larger assortment of device drivers
and supported hardware than any other Linux revision and any
particular device you care to name has a decent shot at working
under Linux 2.4. (Of course, you should consult the documentation
before you go out and buy any new hardware, just in case. New
hardware especially may not be supported yet.)

Linux has become more ready for the Enterprise in more ways than
in sheer numbers, however. Many components of Linux 2.4 including
the all-important filesystem and network layers have been
completely rewritten for scalability. Linux 2.4 should scale much
better with many subsystems being optimized for 8 processors or
more. Additionally, the work which began in Linux 2.2’s removal of
the global spin lock has continued and many kernel locks have
become much more precise enabling even more scalability in
milti-processor environments. Linux 2.4 will be more standards
compliant and includes POSIX clocks support, the latest revision of
the NFS filesystem (NFSv3), and other changes that will allow it to
be more useful in enterprise environments. Linux 2.4 could be
called the “Enterprise Linux” although an argument could be put
forward for it being “the” Linux in several other categories, as
well.

One frequently asked question about Linux 2.4 is how much memory
it will require. Many operating systems seem to require more and
more memory and resources as they mature, but Linux 2.4 will
largely buck that trend by actually requiring less memory in
certain situations. Of course, Linux 2.4 includes much more
functionality than does Linux 2.2 and many of these features do
take up space so your mileage many vary. (Remember that most kernel
components can be disabled at compile-time, unlike many other
Operating Systems.)

The Many Flavors of Linux

In terms of sheer lines of code, the Linux kernel is
predominantly drivers. In fact, the size of the Linux core has not
increased much over the last several revisions. Some of these
drivers are architecture independent such as the IDE driver. That
is, these drivers have been written to work on multiple platforms.
Other drivers are very dependent on architecture, especially on
hardware that is not applicable on more than one platform. Linux
kernel developers strive to make drivers as general as possible, so
as to allow a driver to be reused with relatively little effort on
a different platform if a device for it becomes available. The
Linux OS is a multi-headed beast with facets similar to but
different from each other, depending on the platform you are
using.

Having said this, this document will mostly stick to Intel
hardware as that is the hardware that I use most often at home.
While I won’t go into the specifics of each individual port, Linux
2.4 adds support for two new processor families. I have no
experience with these platforms so am unsure as to their level of
hardware support, etc. (Or even what class of hardware they
represent.) It is likely that they will mature over the years just
as the other Linux ports have. Exact feature support is different
from port to port and certain limitations on hardware, memory, etc.
will differ depending on the underlying architecture.

In terms of Intel-like hardware, Linux 2.4 is very similar in
support to Linux 2.2. All Intel chips since the 386 are still
supported, up to the Pentium III. Compatible chips such as those
produced by AMD and Cyrix are also supported. Additionally, Linux
2.4 will include support for other hardware often present on newer
chips including non-Intel varieties of the MTRRs (Memory Type Range
Registers) (aka MCRs) which will improve performance on some kinds
of high bandwidth devices. While Linux 2.2 included support for the
IO-APIC (Advanced Programmable Interrupt Controller) on
multi-processor systems, Linux 2.4 will support these on
uni-processor systems and also support machines with multiple
IO-APICs. The support for multiple IO-APICs will allow Linux 2.4 to
scale much better than previous incarnations of Linux on high-end
hardware.

Linux 2.4 and Merced (ia64)

While not yet delivered to the starving masses, Intel’s 64-bit
replacement to the x86 line is coming down the pipeline. While
Linux 2.4 does not yet include any support for the unreleased chip,
multiple groups are working on the port to ensure that Linux will
be available for Merced immediately after its release. The first
fruits of these efforts have been released as a patch to the
kernel, however this patch has not be adopted yet into the official
tree. (This document generally won’t refer to projects outside the
main tree.) This porting process is no doubt simplified by Linux’s
existing support for 64-bit processors (including Compaq’s Alpha
chips and the Sparc64) which are already merged into the main Linux
tree. This means that much of the grunt work in making 64-bit Linux
on Merced a reality (making sure that the kernel and all its
drivers do not believe that they “know” what the size of datatypes
are and how numbers are stored internally, etc.) is already
completed.

I do not want to imply that there are no remaining problems that
keep Linux from being “perfect” on 64-bit systems; that is not the
case. However a vast majority of the difficult and subtle parts are
completed and all that remains are problems derived from a legacy
world.

Linux 2.4 and Crusoe

As Linus works at Transmeta, the Crusoe chips will
definitely support Linux when the first Crusoe-based products come
to market. In fact, Linux on the Crusoe has already been
conclusively demonstrated using the Quake test. (Arguably, the most
important test for any new processor.) As Crusoe emulates i386,
there won’t be an explicit port for the processor family but
features (especially power management and maybe a new “virtual”
keyboard layer) are expected to be in the release kernel by the
time Linux 2.4 ships.

Linux 2.4 and Pre-386 Intel Chips

Surprisingly, I do get a number of questions about pre-386
Linux. The answer, at least right now, is that there is no such
animal. A sister project, ELKS (Embedable Linux Kernel Subset) is
working to make a Linux-like operating system run on these
machines, including protected mode support for chips that support
it. This project is separate from Linux-proper however and is
outside the scope of this document.

A separate port of the Linux kernel, called uLinux, also exists
and is working to provide Linux on similar (older) processors,
including processors without MMUs. It has not yet been integrated
with the mainstream Linux kernel but may eventually provide some
“real Linux” functionality on older hardware.

Buses – ISA, PCI, USB, MCA, etc.

Processors are just one small part of the nifty world that
exists inside your computer. Equally important is the computer’s
bus architecture, the component(s) of the system that is often
responsible for internal and external devices. Some bus
architectures, such as the original ISA, are more irresponsible
towards their hardware than anything else– they don’t provide any
resource management functionality, just a place to put in cards.
Others, such as PCI, support much more advanced levels of
configuration and allow for devices to be relocated and other
things. As all primary internal Intel-hardware busses were
supported by Linux 2.2 ((E)ISA, VLB, PCI, MCA), there’s no really
amazing announcements to be made in this area. Linux 2.4 does
however improve on each of these busses by stringing them into
Linux’s new resource subsystem.

There are two major improvement that was made in this area,
however. Linux 2.4 includes, for the first time in the kernel,
support for ISA Plug-and-Play devices. Previously, Linux could
support these devices through a user-mode utility and some elbow
grease on the part of the user or distribution. Linux 2.4 however
will allow these devices to be used during the boot process (for
example, booting from an ISAPnP IDE controller) and the
configuration of these devices now happen auto-magically. Linux 2.4
also includes I2O support in the kernel. I2O (Intelligent
Input/Output) is a superset of PCI that attempts to allow OS
independent drivers to be written for many devices. Between these
two changes, many users will find that Linux 2.4 supports many more
pieces of PC-class hardware.

However, Linux 2.4 does increase support for external devices.
PCMCIA (aka PC Card) support has been added into Linux 2.4. This
support was available in many distributions from an outside source
and most distributions included it by default. Linux 2.4 supports
better integration with the PCMCIA driver set and should ease the
installation and configuration process for these devices for many
users. Like previous versions of this driver however, Linux 2.4
will still require an external daemon and components to get the
most out of PCMCIA devices.

Perhaps the most exciting news on this front is the Universal
Serial Bus, an external bus that is coming into prominence for
devices such as keyboards, mice, sound systems, scanners, and
printers. USB is a popular option on many new pieces of hardware,
including non-Intel hardware. Linux’s support for these devices is
still in early stages but a large percentage of common USB hardware
(including keyboards, mice, speakers, etc.) is already supported in
the kernel.

Much more recently, Firewire support has been added into the
Linux kernel. Firewire is a popular option for many high-bandwidth
devices. Not many drivers (or devices) exist for this hardware
architecture yet, but this support is likely to improve over
time.

Block Devices – Disk Drives, RAID Controllers, etc.

In its simplest form, block devices are devices which can be
expressed as an array of bytes that can be accessed
non-sequentially. This would include devices such as disks (where
you can read any sector you want) but not serial ports (because you
can only read what is at the end of the wire.) Extensions to this
concept (such as ejecting a disk, etc.) are handled in Linux
through ioctls (I/O Controls). The concept of block devices hasn’t
changed in quite a while and support for things such as IDE and
SCSI disk drives has been present since the first revisions of the
Linux kernel.

In Linux 2.4, all the block device drivers have been rewritten
somewhat as the block device API has been changed to remove legacy
garbage from the interface and to completely separate the block API
from the file API at the kernel level. The changes required for
this API rewrite have not been major however module maintainers who
have modules outside the main tree may need to update their
code.

On the desktop at least, disk devices that use the IDE bus are
most prevalent. Linux has supported IDE since the earliest kernels
but Linux 2.4 has improved on previous versions of Linux’s support
for these devices in a number of ways. First off, high-end systems
that have multiple IDE controllers may benefit as the number of
supported IDE controllers has been increased to a maximum of 10.
(Previous versions of Linux allowed you to have 4.) As most
motherboards shipped with a maximum of two, this is not likely to
impact many desktop users. Secondly, there have been changes in the
IDE driver which will improve Linux 2.4’s support for PCI and PnP
IDE controllers, IDE floppies and tapes, DVDs and CD-ROM
changers.And finally, Linux 2.4 includes driver updates which
should work around bugs present in some IDE chipsets and better
support the advanced features of others.

The SCSI subsystem has not changed as much as the IDE subsystem
at this point however a number of new SCSI controllers are
supported. It is generally hoped that the SCSI subsystem will be
cleaned up sometime in the 2.5 development cycle.

One completely new feature in the Linux 2.4 kernel is the
implementation of a “raw” I/O device. A raw device is one whose
accesses are not handled through the caching layer, instead going
right to the low-level device itself. A raw device could be used in
cases where a sophisticated application wants complete control over
how it does data caching and the expense of the usual cache is not
wanted. Alternatively, a raw device could be used in data critical
situations where we want to ensure that the data gets written to
the disk immediately so that, in the event of a system failure, no
data will be lost. Previous incarnations of this support were not
fit for inclusion as they required literally doubling the number of
device nodes so that every block device would also have a raw
device node. (This is the implementation that many commercial
UNIXes use.) The current implementation uses a pool of device nodes
which can be associated with any arbitrary block device.

In addition to many of the other block device changes, Linux 2.4
also features an updated loopback and ramdisk drivers which fix
some bugs in certain situations.

Filesystems and Partition Tables

Block filesystems can be used in many ways. The most common way
to use a block devices is to mount a filesystem on it. (Internally,
the filesystem code is like an overlay on the block device driver.)
Other ways that a block device can be used include partitioning
(which is a lot like a filesystem, just handled in a completely
different way), and using it raw.

Linux 2.4 includes all of the filesystems present in Linux 2.2.
Those filesystems include FAT (for the assorted DOSes), NTFS (for
Windows NT), VFAT and FAT32 (for Windows 9x), HFS (for MacOS), HPFS
(for OS/2), and a variety of others. New filesystems have been
added, most notably the UDF filesystem used on DVD disks and the
efs filesystem used by IRIX. All filesystems have been rewritten to
some extent to support the new page caching system and will be more
efficient because of this change.

There are a number of improvements which will improve
compatibility with other systems. OS/2 users will finally be able
to write to their filesystems from within Linux. (This change is a
long time in coming and I hope that there are still OS/2 users out
there to enjoy it.) NT users do not have this luxury yet as their
driver is still in the experimental stage. NextStep users will be
able to mount their CD-ROMs under Linux as Linux supports an
extension to the UFS filesystem that NextStep uses.

Linux 2.4 does not yet include a journaling filesystem, although
several projects are close to providing this functionality in a
stable fashion. Of the two main ones, ReiserFS is the closest and
may actually make it into 2.4. ext3, the long awaited next
generation of the ext2 filesystem used standard in most Linux
distributions, is not yet close enough to be feature complete. Once
a journaling filesystem is in the kernel, Linux users will be able
to have shorter fsck times and overall safer data.

Additionally, the partition table handling code has been
rewritten and now allows for a much larger selection of non-native
partition table types to be used. This would be useful if you are
have, for example, an external SCSI drive from a Macintosh and you
want to use it on your Linux PC. A number of new partition table
types have been added, including the format for IRIX machines.

Not all filesystems are mounted over block devices however.
Some, like the proc filesystem, are completely virtual. Others are
“mounted” over the network. There are a number of ways to
accomplish this end and many OSes provide their own methods of
doing this.

The Windows world uses the Server Message block protocol for
their network filesystems. The new Linux kernel removes the
compile-time workaround that required you to choose whether you
would be mounting drives from Windows 9x or NT. This updated Linux
kernel will be able to auto-detect the remote system type and
enable the bug fix on an as-needed basis. This will vastly improve
Linux’s ability to operate in networks with multiple versions of
Windows.

In the UNIX world, the Network Filesystem (NFS) protocol is the
method of choice for sharing files. Linux 2.4 includes for the
first the the ability to access filesystem shares over the most
recent version of the NFS protocol, NFSv3. NFSv3 includes many
advantages over previous versions and is one of Linux’s most
requested features. It should be noted however the kernel NFS
daemon will still only be exporting NFSv2 shares from Linux.

Video Cards – Framebuffer Devices

Another, more complicated variety of block device is the
frame-buffer. A frame-buffer is simply a section of memory that
represents (or is) video memory to such an extent that writing to
this memory affects the colors of the pixels on a screen. This is
more complicated than some other block devices because it supports
ioctls to change the palette and other functions associated to
video. (Which it might be possible to “format” this device and
mount a filesystem from it, I wouldn’t recommend you try.)

Linux 2.4 includes a number of new drivers and improvements to
old drivers. Especially important here is Linux’s support for many
more “standard” VGA cards and configurations, at least in some
modes. (Even if the mode is only 16 colors– at least it works.)
Please remember that this feature can be bypassed and (on i386) is
only necessary for people with certain systems which cannot be
supported in any other way. At this time, the XFree project
provides many more drivers to many more video cards than the kernel
can support so it is not necessary to use this feature to get X
Windows support. (SVGAlib and other libraries allow you to do
direct video manipulation on supported hardware, however the use of
these libraries must be done carefully as there are some security
concerns.)

One of the biggest changes in this respect is the addition of
the Direct Rendering Manager to the Linux kernel. The DRM cleans up
access to the graphics hardware and eliminates many ways in which
multiple processes which write to your video cards at once could
cause a crash. This should improve stability in many situations.
The DRM also works as an entry point for DMA accesses for video
cards. In total, these changes will allow Linux 2.4 (in conjunction
with Xfree4.x and other compatible programs) to be more stable and
more secure when doing some types of graphics-intensive work. These
changes should also make some kinds of television tuner cards more
workable under Linux.

Character Devices – Keyboards, Mice, Consoles, and
Ports

The class of devices which can only be accessed sequentially is
the character device. These are devices, such as serial devices,
which allow you to read from a stream or push data onto it, but not
to “skip” ahead or behind. This includes serial and parallel ports,
keyboards, mice, and terminal devices. There have been several
major improvements in this area for the latest incarnation of the
Linux kernel.

One of the largest improvements in this area is in regards to
Linux 2.4’s support for keyboards and mice. Previous incarnations
of Linux included support for serial and PS/2 mice and keyboards
(and ADB, for instance, on the Macintosh.) Linux 2.4 also supports
using keyboards and mice attached to the USB ports. Additionally,
Linux 2.4 also supports keyboards on some systems where the
keyboard is not initialized by the BIOS and systems that have
trouble determining whether a keyboard is attached or not. And
finally, Linux 2.4 includes expanded support for digitizer pads and
features an emulation option to allow them to be used as normal
mice.

Linux’s support for serial ports has not changed much since the
days of Linux 2.2. Linux 2.4 (and some later versions of Linux 2.2)
supports sharing IRQs on PCI serial boards; previously, this
feature was limited to ISA and on-board serial ports. Additionally,
Linux 2.4 has added a number of new drivers for multi-port serial
cards. It is hoped that these changes and others will make using
your serial ports under Linux 2.4 easier than before.

In a separate department, there has been some work since 2.2 on
supporting so-called “WinModems” (or “soft modems” or “LinModems”).
These are modems which exist largely in software and whose drivers
are often only provided by the manufacturer for Windows. (Often the
DSP or other parts of the hardware must be in software rather than
on the board.) While no code has been submitted to Linus for the
support of these beasts, several independent driver projects have
been working to get some support for these beasts in and the first
fruits of these labors are becoming usable outside the main tree.
While it will be a long time before we see most of these devices
supported under Linux, for the first time it actual appears that
the Open Source snowball is beginning to roll in this
direction.

In contrast to to the serial driver, Linux 2.4 includes a
largely rewritten parallel port subsystem. One of the major changes
in this area is support for so-called “generic” parallel devices.
This could be used by programs which access the parallel ports in
unusual ways or, more likely, just want to probe the port for PnP
information. Additionally, this rewrite allows Linux 2.4 users to
access all the enhanced modes of their parallel ports, including
using UDMA (for faster I/O) if supported by the hardware. Under the
new Linux kernel, it is also possible to direct all console
messages to a parallel port device such as a printer. This allows
Linux to match the functionality of many commercial UNIXes by being
able to put kernel and debug messages on a line printer.

Infra-red support has progressed since Linux 2.2 and there have
been many changes in this area, including better network
support.

Accessibility

When thinking of Linux, the words “user friendly” do not
generally come immediately to mind. Therefore, one might be
surprised to learn that Linux 2.4 (and some later editions of the
Linux 2.2 kernel) supports speech synthesizer cards. This driver
and the appropriate hardware will allow vision-impaired Linux users
to hear all Linux output, including messages very early in the boot
process. Very few Operating Systems can boast such low level
support for these devices. (There will be other patches and
utilities that will be required for full use of these devices, this
kernel driver is only a component of the system.)

Multimedia: Sound, TV, Radio, etc.

On the complicated side of the character device list, we have
some of the “fluffier” devices to be supported by Linux. Linux, in
its emerging role as a desktop platform, tries very hard to support
sound cards, TV and radio tuners, and other sound and video output
devices. To be honest, Linux 2.4 does not include as many
ground-breaking changes as Linux 2.2 did in this respect. Linux 2.4
does however include updates and new drivers for a variety of sound
and video cards, including full duplex support. Linux 2.4 and some
later versions of Linux 2.2 also include code which will allow some
sound devices to more easily allocate memory in required ranges;
this should make the configuration and use of some cards much
easier.

Networking and Protocols

Networking and network hardware is one of the major areas where
Linux has always excelled. These devices are neither “character”
nor “block” but inhabit a special space free of the need for device
nodes. Linux 2.4 will include many improvements to this layer
including new drivers, bug fixes, and new functionality added on to
existing drivers.

The Linux model of network sockets is one which is standard
across most UNIX variants. Unfortunately however, the standard does
have some correctable deficiencies. Under Linux 2.2 and previous
versions, if you have a number of processes all waiting on an event
from a network socket (a web server, for instance), they will all
be woken up when activity if detected. So, for every web page
request received, Linux would wake up a number of processes which
would each try and get at the request. As it does not make sense
for multiple processes to serve the same request, only one will get
to the data; the remainder will notice that it doesn’t have
anything to process and fall back asleep. Linux is quite efficient
at making this all happen as quickly as possible, however it could
still be made more efficient by removing the redundant wakeups.
Linux 2.4 includes changes which implement “wake one” under Linux
which will allow us to completely remove the “stampede effect” of
multiple processes. In short, “wake one” does exactly as its name
indicates: wakes up only one process in the case of activity. This
will allow applications such as Apache to be even more efficient
and make Linux an even better choice as a web server.

Linux 2.4 also includes a completely rewritten networking layer.
In fact, it has been made an unserialized as possible so that it
will scale far better than any previous version of Linux. In
addition, it contains many optimizations to allow it to work with
the particular quirks of the networking stacks in use in many
common operating systems, including Windows. It should also be
mentioned at this point that Linux is still the only operating
system /completely/ compatible with the letter of the IPv4
specification (Yes, Ipv4; the one we’ve bene using all this time)
and Linux 2.4 boasts an IPv4 implementation that is much more
scalable than its predecessor. As Linux 2.2 became completely
compatible with the specification, the use of “colon mode” for
aliasing was deprecated. This functionality was completely removed
in Linux 2.4 and may require some advanced users or distributions
to partially rewrite scripts.

Next to the new network layer, the next most important
improvement in the Linux 2.4 network layer is the addition of code
to handle the DECNet and ARCNet protocols and hardware. This allows
for better interoperation with specialized systems, including older
Digital/Compaq ones.

For the low-end desktop users, PPP is an important part of day
to day life. Linux 2.4 includes some major rewrites and
modularization of much of the code, including a long awaited
combination of the PPP layers from the ISDN layer and the serial
device PPP layer, such as for dial-up connections with modems. In
addition to the modularity, ISDN has been updated to support many
new cards. The PLIP (PPP over parallel ports) layer has also been
improved and uses the new parallel port abstraction layer.

Binary Types

One often overlooked portion of the Linux kernel is the program
loader; the bit that takes your programs, loads them properly, and
runs them. Many people are not aware however that Linux 2.2 added
support for a “miscellaneous” binary loader, a flexible module
designed to allow you to associate binary types with “helper”
applications in much the same way as Windows or a comparable
operating system would. This would, for example, allow you to
associate all Windows applications on your machine with WINE
(Windows Emulator) so that when you typed “./notepad.exe” the right
thing would happen. (However it is generally not a good idea to
take this concept to the extreme at the kernel level and many of
the “associations” provided by Windows would be best left handled
by your window or file manager. It would be a bad idea, for
example, to be able to run “/etc/passwd” and have it come up in a
text editor. My personal recommendation is to use this
functionality only when the file type is best imagined as
“executable.”) This was considered a big win by many because it
allowed many different groups, such as the WINE and Dosemu (DOS
Emulator) groups, to publish instructions for making their programs
run “native” by the kernel.

Linux 2.2 and Linux 2.0 included built-in support for starting a
Java interpreter (if present) whenever a Java application was
executed. (It was one of the first OSes to do this at the kernel
level.) Linux 2.4 still includes support for loading Java
interpreters as necessary, but the specific Java driver has been
removed and users will need to upgrade their configurations to use
the “Misc.” driver.

The Kernel Web Daemon

One of the most striking features in the Linux 2.4 kernel is the
kernel web daemon, or khttpd. It’s true, Linux actually supports a
kernel module which can process HTTP requests without having
communicate with any user space servers (such as Apache.) This
feature is often misunderstood– it is not designed to replace
Apache or any other web server, it can be used only when serving
raw files (no CGI.) If it receives a request for something that it
cannot handle, it will “pass through” the request to user space
where a web server can snatch it up and process it without ever
being able to know the difference. This feature will make Linux an
even better choice for rapid-fire web serving of static content,
such as dedicated image servers.

Linux 2.4 is continuing to shape up to be the best Linux kernel
yet. As new features are added into the kernel, I will try and keep
this document updated. If you have a suggestion, please do not
hesitate to write me. Most of this document has not been rewritten
from previous editions. I may tweak the layout a bit before then
but unless there’s a lot more to add, this is probably going to be
the way it’s going to look.

Yes, this edition doesn’t have a blurb about ATM support. I’m
working in it for a future edition, but I need to do some more
homework first.

This is the probably not the final version, but it’s close. If
you haven’t commented on it by now and I missed something that you
feel is important, please email me at [email protected] or
[email protected] and
let me know. As I am currently having some trouble with accessing
these two addresses from home, this revision of the documentation
only contains input I received on the LinuxToday talkback and my
own research. (With editorial suggestions from Liz @ Linux Weekly
News.) As an interim solution, I can also get mail at [email protected].

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends, & analysis