The BSD portion of the Mac OS X kernel is derived primarily from FreeBSD, a version of 4.4BSD that offers advanced networking, performance, security, and compatibility features. BSD variants in general are derived (sometimes indirectly) from 4.4BSD-Lite Release 2 from the Computer Systems Research Group (CSRG) at the University of California at Berkeley. BSD provides many advanced features, including the following:
Preemptive multitasking with dynamic priority adjustment. Smooth and fair sharing of the computer between applications and users is ensured, even under the heaviest of loads.
Multiuser access. Many people can use a Mac OS X system simultaneously for a variety of things. This means, for example, that system peripherals such as printers and disk drives are properly shared between all users on the system or the network and that individual resource limits can be placed on users or groups of users, protecting critical system resources from overuse.
Strong TCP/IP networking with support for industry standards such as SLIP, PPP, and NFS. Mac OS X can interoperate easily with other systems as well as act as an enterprise server, providing vital functions such as NFS (remote file access) and email services, or Internet services such as HTTP, FTP, routing, and firewall (security) services.
Memory protection. Applications cannot interfere with each other. One application crashing does not affect others in any way.
Virtual memory and dynamic memory allocation. Applications with large appetites for memory are satisfied while still maintaining interactive response to users. With the virtual memory system in Mac OS X, each application has access to its own 4 GB memory address space; this should satisfy even the most memory-hungry applications.
Support for kernel threads based on Mach threads. User-level threading packages are implemented on top of kernel threads. Each kernel thread is an independently scheduled entity. When a thread from a user process blocks in a system call, other threads from the same process can continue to execute on that or other processors. By default, a process in the conventional sense has one thread, the main thread. A user process can use the POSIX thread API to create other user threads.
SMP support. Support is included for computers with multiple CPUs.
Source code. Developers gain the greatest degree of control over the BSD programming environment because source is included.
The facilities that are available to a user process are logically divided into two parts: kernel facilities and system facilities implemented by or in cooperation with a server process.
The facilities implemented in the kernel define the virtual machine in which each process runs. Like many real machines, this virtual machine has memory management, an interrupt facility, timers, and counters.
The virtual machine also allows access to files and other objects through a set of descriptors. Each descriptor resembles a device controller and supports a set of operations. Like devices on real machines, some of which are internal to the machine and some of which are external, parts of the descriptor machinery are built into the operating system, while other parts are often implemented in server processes.
The BSD component provides the following kernel facilities:
processes and protection
host and process identifiers
process creation and termination
user and group IDs
process groups
text, data, stack, and dynamic shared libraries
mapping pages
page protection control
POSIX synchronization primitives
POSIX shared memory
signal types
signal handlers
sending signals
timing and statistics
real time
interval time
files
pipes
sockets
resource controls
process priorities
resource utilization and resource limits
quotas
system operation support
bootstrap operations
shut-down operations
accounting
BSD system facilities (facilities that may interact with user space) include
generic input/output operations such as read and write, nonblocking, and asynchronous operations
file-system operations
interprocess communication
handling of terminals and other devices
process control
networking operations
Although the BSD portion of Mac OS X is primarily derived from FreeBSD, some changes have been made:
The sbrk()
system call for memory management is deprecated. Its use is not recommended in Mac OS X.
The Mac OS X runtime model uses a different object file format for executables and shared objects, and a different mechanism for executing some of those executables.
The primary native format is Mach-O. This format is supported by the dynamic link editor (dyld).
The PEF binary file format is supported by the Code Fragment Manager (CFM).
The kernel supports execve()
with Mach-O binaries. Mapping and management of Mach-O dynamic shared libraries, as well as launching of PEF-based applications, are performed by user-space code.
Mac OS X does not support memory-mapped devices through the mmap()
function. (Graphic device support and other subsystems provide similar functionality, but using different APIs.) In Mac OS X, this interface should be done through user clients. See the Apple I/O Kit documents for additional information.
The swapon()
call is not supported; macx_swapon()
is the equivalent call from the Mach pager.
The Unified Buffer Cache implementation in Mac OS X differs from that found in FreeBSD.
Mach provides a number of IPC primitives that are not traditionally found in UNIX. See “Boundary Crossings” for more information on Mach IPC. Some System V primitives are supported, but their use is discouraged in favor of POSIX equivalents.
Several changes have been made to the BSD security model to support single-user and multiple-administrator configurations, including the ability to disable ownership and permissions on a volume-by-volume basis.
The locking mechanism used throughout the kernel differs substantially from the mechanism used in FreeBSD.
The kernel extension mechanism used by Mac OS X is completely different. The Mac OS X driver layer, the I/O Kit, is an object-oriented driver stack written in C++. The general kernel programming interfaces, or KPIs, are used to write non-driver kernel extensions. These mechanisms are described more in “I/O Kit Overview” and KPI Reference, respectively.
In addition, several new features have been added that are specific to the Mac OS X (Darwin) implementation of BSD. These features are not found in FreeBSD.
enhancements to file-system buffer cache and file I/O clustering
adaptive and speculative read ahead
user-process controlled read ahead
time aging of the file-system buffer cache
enhancements to file-system support
implementation of Apple extensions for ISO-9660 file systems
multithreaded asynchronous I/O for NFS
addition of system calls to support semantics of Mac OS Extended (HFS+) file systems
additions to naming conventions for pathnames, as required for accessing multiple forks in Mac OS Extended file systems
The BSD component of the Mac OS X kernel is complex. A complete description is beyond the scope of this document. However, many excellent references exist for this component. If you are interested in BSD, be sure to refer to the bibliography for further information.
Although the BSD layer of Mac OS X is derived from 4.4BSD, keep in mind that it is not identical to 4.4BSD. Some functionality of 4.4 BSD has not been included in Mac OS X. Some new functionality has been added. The cited reference materials are recommended for additional reading. However, they should not be presumed as forming a definitive description of Mac OS X.
Last updated: 2006-11-07