The kernel has two major responsibilities:
-
To interact with and control the system’s
hardware components.
-
To provide an environment in which the
application can run.
All the low-level hardware interactions are hidden from the
user mode applications. The operating system evaluates each request and
interacts with the hardware component on behalf of the application.
Contrary to the expectations around subsystems, the Linux
kernel is monolithic. All of the subsystems are tightly integrated to form the
whole kernel. This differs from microkernel architecture where the kernel
provides bare minimal functionality, and the operating system layers are
performed on top of microkernels as processes. Microkernels are generally
slower due to message passing between various layers. But Linux kernels support
modules which allow it to be extended. A module is an object that can be linked
to the kernel at runtime.
System calls are what an application uses to interact with
kernel resources. They are designed to ensure security and stability. An API
provides a wrapper over the system calls so that the two can vary
independently. There is no relation between the two and they are provided as
libraries to applications.
The /proc file system provides the user with a view of the
internal kernel data structures. It is a virtual file system used to fine tune
the kernel’s performance as well as the overall system.
The various aspects of memory management in Linux includes
address space, physical memory, memory mapping, paging and swapping.
One of the advantages of virtual memory is that each process
thinks it has all the address space it needs. The isolation enables processes
to run independently of one another. The virtual memory can be much larger than
physical memory in the system. The application views the address space as a
flat linear address space. It is divided into two parts: the user address space
and the kernel address space. The range between the two depends on the system
architecture. For 32 bit, the user space is 3GB and the kernel space is 1GB.
The location of the split is determined by the PAGE_OFFSET kernel configuration
variable.
The physical memory is architecture-independent and can be
arranged into banks, with each bank being a particular distance from the
processor. Linux VM represents this arrangement as a node. Each node is divided
into blocks called zones that represent ranges within memory. There are three
different zones: ZONE_DMA, ZONE_NORMAL, and ZONE_HIGHMEM. Each zone has its own
use with the one named normal for kernel and the one named highmem for user
data.
When memory mapping occurs, the kernel has one GB address
space. The DMA and NORMAL ranges are directly mapped to this address space.
This leaves only 128 MB of virtual address space and used for vmalloc and kmap.
With systems that allow Physical Address Extension, handling physical memories
in tens of gigabytes can be hard for Linux. The kernel handles high memory on a
page-by-page basis. It maps the page
into a small virtual address space (kmap) window, operates on that page and
unmaps the page. The 64 bit architecture do not have this problem because their
address space is huge.
The virtual memory is implemented depending on the hardware.
It is divided into fixed size chunks called pages. Virtual memory references
are translated into addresses in physical memory using page tables. Different
architectures and page sizes are accommodated using three-level paging mechanism
involving Page Global Directory, Page Middle Directory, and Page Table. This
address translation provides a way to separate the virtual address space of a
process from the physical address space. If an address is not in virtual
memory, it generates a page fault, which is handled by the kernel. The kernel handles the fault and brings the
page into main memory even if it involves replacement.
Swapping is the moving of an entire process to and from the
secondary storage when the main memory is low but is generally not preferred
because context switches are expensive. Instead, paging is preferred. Linux
performs swapping at page level rather than at the process level and is used to
expand the process address space and to circulate pages by discarding some of
the less frequently used or unused pages and bringing in new pages. Since it
writes to disk, the disk I/O is slow.
No comments:
Post a Comment