In
computing
Computing is any goal-oriented activity requiring, benefiting from, or creating computer, computing machinery. It includes the study and experimentation of algorithmic processes, and the development of both computer hardware, hardware and softw ...
,
ioctl
(an abbreviation of input/output control) is a
system call
In computing, a system call (syscall) is the programmatic way in which a computer program requests a service from the operating system on which it is executed. This may include hardware-related services (for example, accessing a hard disk drive ...
for device-specific
input/output
In computing, input/output (I/O, i/o, or informally io or IO) is the communication between an information processing system, such as a computer, and the outside world, such as another computer system, peripherals, or a human operator. Inputs a ...
operations and other operations which cannot be expressed by regular file semantics. It takes a parameter specifying a request code; the effect of a call depends completely on the request code. Request codes are often device-specific. For instance, a CD-ROM
device driver
In the context of an operating system, a device driver is a computer program that operates or controls a particular type of device that is attached to a computer or automaton. A driver provides a software interface to hardware devices, enabli ...
which can instruct a physical device to eject a disc would provide an
ioctl
request code to do so. Device-independent request codes are sometimes used to give
userspace access to kernel functions which are only used by core system software or still under development.
The
ioctl
system call first appeared in
Version 7 of
Unix
Unix (, ; trademarked as UNIX) is a family of multitasking, multi-user computer operating systems that derive from the original AT&T Unix, whose development started in 1969 at the Bell Labs research center by Ken Thompson, Dennis Ritchie, a ...
under that name. It is supported by most Unix and
Unix-like
A Unix-like (sometimes referred to as UN*X, *nix or *NIX) operating system is one that behaves in a manner similar to a Unix system, although not necessarily conforming to or being certified to any version of the Single UNIX Specification. A Uni ...
systems, including
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
and
macOS
macOS, previously OS X and originally Mac OS X, is a Unix, Unix-based operating system developed and marketed by Apple Inc., Apple since 2001. It is the current operating system for Apple's Mac (computer), Mac computers. With ...
, though the available request codes differ from system to system.
Microsoft Windows
Windows is a Product lining, product line of Proprietary software, proprietary graphical user interface, graphical operating systems developed and marketed by Microsoft. It is grouped into families and subfamilies that cater to particular sec ...
provides a similar function, named "
DeviceIoControl
", in its
Win32 API.
Background
Conventional operating systems can be divided into two layers,
userspace and the
kernel. Application code such as a
text editor
A text editor is a type of computer program that edits plain text. An example of such program is "notepad" software (e.g. Windows Notepad). Text editors are provided with operating systems and software development packages, and can be used to c ...
resides in userspace, while the underlying facilities of the operating system, such as the
network stack, reside in the kernel. Kernel code handles sensitive resources and implements the security and reliability barriers between applications; for this reason, user mode applications are prevented by the operating system from directly accessing kernel resources.
Userspace applications typically make requests to the kernel by means of
system call
In computing, a system call (syscall) is the programmatic way in which a computer program requests a service from the operating system on which it is executed. This may include hardware-related services (for example, accessing a hard disk drive ...
s, whose code lies in the kernel layer. A system call usually takes the form of a "system call vector", in which the desired system call is indicated with an index number. For instance,
exit()
might be system call number 1, and
write()
number 4. The system call vector is then used to find the desired kernel function for the request. In this way, conventional operating systems typically provide several hundred system calls to the userspace.
Though an expedient design for accessing standard kernel facilities, system calls are sometimes inappropriate for accessing non-standard hardware peripherals. By necessity, most hardware peripherals (aka devices) are directly addressable only within the kernel. But user code may need to communicate directly with devices; for instance, an administrator might configure the media type on an
Ethernet
Ethernet ( ) is a family of wired computer networking technologies commonly used in local area networks (LAN), metropolitan area networks (MAN) and wide area networks (WAN). It was commercially introduced in 1980 and first standardized in 198 ...
interface. Modern operating systems support diverse devices, many of which offer a large collection of facilities. Some of these facilities may not be foreseen by the kernel designer, and as a consequence it is difficult for a kernel to provide system calls for using the devices.
To solve this problem, the kernel is designed to be extensible, and may accept an extra module called a
device driver
In the context of an operating system, a device driver is a computer program that operates or controls a particular type of device that is attached to a computer or automaton. A driver provides a software interface to hardware devices, enabli ...
which runs in kernel space and can directly address the device. An
ioctl
interface is a single system call by which userspace may communicate with device drivers. Requests on a device driver are vectored with respect to this
ioctl
system call, typically by a handle to the device and a request number. The basic kernel can thus allow the userspace to access a device driver without knowing anything about the facilities supported by the device, and without needing an unmanageably large collection of system calls.
Uses
Hardware device configuration
A common use of
ioctl
is to control hardware devices.
For example, on
Win32 systems,
ioctl
calls can communicate with
USB
Universal Serial Bus (USB) is an industry standard, developed by USB Implementers Forum (USB-IF), for digital data transmission and power delivery between many types of electronics. It specifies the architecture, in particular the physical ...
devices, or they can discover drive-geometry information of the attached storage-devices.
On
OpenBSD
OpenBSD is a security-focused operating system, security-focused, free software, Unix-like operating system based on the Berkeley Software Distribution (BSD). Theo de Raadt created OpenBSD in 1995 by fork (software development), forking NetBSD ...
and
NetBSD
NetBSD is a free and open-source Unix-like operating system based on the Berkeley Software Distribution (BSD). It was the first open-source BSD descendant officially released after 386BSD was fork (software development), forked. It continues to ...
,
ioctl
is used by the
pseudo-device driver and the
bioctl
utility to implement
RAID
RAID (; redundant array of inexpensive disks or redundant array of independent disks) is a data storage virtualization technology that combines multiple physical Computer data storage, data storage components into one or more logical units for th ...
volume management in a unified vendor-agnostic interface similar to
ifconfig
ifconfig (short for ''interface config'') is a system administration utility in Unix-like operating systems for network interface configuration.
The utility is a command-line interface
A command-line interface (CLI) is a means of inter ...
.
[
*][
*]
On
NetBSD
NetBSD is a free and open-source Unix-like operating system based on the Berkeley Software Distribution (BSD). It was the first open-source BSD descendant officially released after 386BSD was fork (software development), forked. It continues to ...
,
ioctl
is also used by the
sysmon
framework.
Terminals
One use of
ioctl
in code exposed to end-user applications is terminal I/O.
Unix
Unix (, ; trademarked as UNIX) is a family of multitasking, multi-user computer operating systems that derive from the original AT&T Unix, whose development started in 1969 at the Bell Labs research center by Ken Thompson, Dennis Ritchie, a ...
operating systems have traditionally made heavy use of
command-line interface
A command-line interface (CLI) is a means of interacting with software via command (computing), commands each formatted as a line of text. Command-line interfaces emerged in the mid-1960s, on computer terminals, as an interactive and more user ...
s, originally with hardware text terminals such as
VT100s attached to
serial port
A serial port is a serial communication Interface (computing), interface through which information transfers in or out sequentially one bit at a time. This is in contrast to a parallel port, which communicates multiple bits simultaneously in Pa ...
s, and later with
terminal emulator
A terminal emulator, or terminal application, is a computer program that emulates a video terminal within some other display architecture. Though typically synonymous with a shell or text terminal, the term ''terminal'' covers all remote term ...
s and
remote login servers using
pseudoterminals. Serial port devices and pseudoterminals are both controlled and configured using
ioctl
calls. For instance, the display size is set using the
TIOCSWINSZ
call. The TIOCSTI (terminal I/O control, simulate terminal input) ioctl function can push a character into a device stream.
[
]
Kernel extensions
When applications need to extend the kernel, for instance to accelerate network processing,
ioctl
calls provide a convenient way to bridge
userspace code to kernel extensions.
Kernel extensions can provide a location in the filesystem that can be opened by name, through which an arbitrary number of
ioctl
calls can be dispatched, allowing the extension to be programmed without adding system calls to the operating system.
sysctl alternative
According to an
OpenBSD
OpenBSD is a security-focused operating system, security-focused, free software, Unix-like operating system based on the Berkeley Software Distribution (BSD). Theo de Raadt created OpenBSD in 1995 by fork (software development), forking NetBSD ...
developer,
ioctl
and
sysctl
are the two
system call
In computing, a system call (syscall) is the programmatic way in which a computer program requests a service from the operating system on which it is executed. This may include hardware-related services (for example, accessing a hard disk drive ...
s for extending the kernel, with
sysctl
possibly being the simpler of the two.
In
NetBSD
NetBSD is a free and open-source Unix-like operating system based on the Berkeley Software Distribution (BSD). It was the first open-source BSD descendant officially released after 386BSD was fork (software development), forked. It continues to ...
, the
sysmon_envsys
framework for
hardware monitoring uses
ioctl
through
proplib
; whereas
OpenBSD
OpenBSD is a security-focused operating system, security-focused, free software, Unix-like operating system based on the Berkeley Software Distribution (BSD). Theo de Raadt created OpenBSD in 1995 by fork (software development), forking NetBSD ...
and
DragonFly BSD
DragonFly BSD is a free and open-source Unix-like operating system forked from FreeBSD 4.8. Matthew Dillon, an Amiga developer in the late 1980s and early 1990s and FreeBSD developer between 1994 and 2003, began working on DragonFly BSD in ...
instead use
sysctl
for their corresponding
hw.sensors
framework. The original revision of
envsys
in NetBSD was implemented with
ioctl
before
proplib
was available, and had a message suggesting that the framework is experimental, and should be replaced by a
sysctl(8)
interface, should one be developed,
which potentially explains the choice of
sysctl
in OpenBSD with its subsequent introduction of
hw.sensors
in 2003. However, when the
envsys
framework was redesigned in 2007 around
proplib
, the system call remained as
ioctl
, and the message was removed.
Implementations
Unix
The
ioctl
system call first appeared in
Version 7 Unix
Version 7 Unix, also called Seventh Edition Unix, Version 7 or just V7, was an important early release of the Unix operating system. V7, released in 1979, was the last Bell Laboratories release to see widespread distribution before the commerc ...
, as a replacement for the
stty
and
gtty
system calls, with an additional request code argument. An
ioctl
call takes as
parameter
A parameter (), generally, is any characteristic that can help in defining or classifying a particular system (meaning an event, project, object, situation, etc.). That is, a parameter is an element of a system that is useful, or critical, when ...
s:
# an open
file descriptor
In Unix and Unix-like computer operating systems, a file descriptor (FD, less frequently fildes) is a process-unique identifier (handle) for a file or other input/output resource, such as a pipe or network socket.
File descriptors typically h ...
# a request code number
# an untyped
pointer to data (either going to the driver, coming back from the driver, or both).
The
kernel generally dispatches an
ioctl
call straight to the device driver, which can interpret the request number and data in whatever way required. The writers of each driver document request numbers for that particular driver and provide them as
constants
Constant or The Constant may refer to:
Mathematics
* Constant (mathematics), a non-varying value
* Mathematical constant, a special number that arises naturally in mathematics, such as or
Other concepts
* Control variable or scientific const ...
in a
header file
An include directive instructs a text file processor to replace the directive text with the content of a specified file.
The act of including may be logical in nature. The processor may simply process the include file content at the location of ...
.
Request numbers usually combine a code identifying the device or class of devices for which the request is intended and a number indicating the particular request; the code identifying the device or class of devices is usually a single ASCII character. Some Unix systems, including
4.2BSD and later
BSD
The Berkeley Software Distribution (BSD), also known as Berkeley Unix or BSD Unix, is a discontinued Unix operating system developed and distributed by the Computer Systems Research Group (CSRG) at the University of California, Berkeley, beginni ...
releases, operating systems derived from those releases, and
Linux
Linux ( ) is a family of open source Unix-like operating systems based on the Linux kernel, an kernel (operating system), operating system kernel first released on September 17, 1991, by Linus Torvalds. Linux is typically package manager, pac ...
, have conventions that also encode within the request number the size of the data to be transferred to/from the device driver and the direction of the data transfer. Regardless of whether any such conventions are followed, the kernel and the driver collaborate to deliver a uniform error code (denoted by the symbolic constant
ENOTTY
) to an application which makes a request of a driver which does not recognise it.
The mnemonic
ENOTTY
(traditionally associated with the textual message "''
Not a typewriter''") derives from the earliest systems that incorporated an
ioctl
call, where only the
teletype
A teleprinter (teletypewriter, teletype or TTY) is an electromechanical device that can be used to send and receive typed messages through various communications channels, in both point-to-point and point-to-multipoint configurations.
Init ...
(
tty
) device raised this error. Though the symbolic mnemonic is fixed by compatibility requirements, some modern systems more helpfully render a more general message such as "''Inappropriate device control operation''" (or a
localization thereof).
TCSETS
exemplifies an
ioctl
call on a
serial port
A serial port is a serial communication Interface (computing), interface through which information transfers in or out sequentially one bit at a time. This is in contrast to a parallel port, which communicates multiple bits simultaneously in Pa ...
. The normal read and write calls on a serial port receive and send data bytes. An
ioctl(fd,TCSETS,data)
call, separate from such normal I/O, controls various driver options like handling of special
characters, or the output signals on the port (such as the
DTR signal).
Win32
A Win32
DeviceIoControl
takes as parameters:
# an open object handle (the Win32 equivalent of a file descriptor)
# a request code number (the "control code")
# a buffer for input parameters
# length of the input buffer
# a buffer for output results
# length of the output buffer
# an
OVERLAPPED
structure, if
overlapped I/O is being used.
The Win32 device control code takes into consideration the mode of the operation being performed.
There are 4 defined modes of operation, impacting the security of the device driver -
#
METHOD_IN_DIRECT
: The buffer address is verified to be readable by the user mode caller.
#
METHOD_OUT_DIRECT
: The buffer address is verified to be writable by the user mode caller.
#
METHOD_NEITHER
: User mode virtual addresses are passed to the driver without mapping or validation.
#
METHOD_BUFFERED
: IO Manager controlled shared buffers are used to move data to and from user mode.
Alternatives
Other vectored call interfaces
Devices and kernel extensions may be linked to
userspace using additional new system calls, although this approach is rarely taken, because operating system developers try to keep the system call interface focused and efficient.
On Unix operating systems, two other vectored call interfaces are popular: the
fcntl
("file control") system call configures open files, and is used in situations such as enabling
non-blocking I/O
In computer science, asynchronous I/O (also non-sequential I/O) is a form of input/output processing that permits other processing to continue before the I/O operation has finished. A name used for asynchronous I/O in the Windows API is '' over ...
; and the
setsockopt
("set socket option") system call configures open
network sockets, a facility used to configure the
ipfw
packet firewall on
BSD
The Berkeley Software Distribution (BSD), also known as Berkeley Unix or BSD Unix, is a discontinued Unix operating system developed and distributed by the Computer Systems Research Group (CSRG) at the University of California, Berkeley, beginni ...
Unix systems.
Memory mapping
; Unix: Device interfaces and input/output capabilities are sometimes provided using
memory-mapped file
A memory-mapped file is a segment of virtual memory that has been assigned a direct byte-for-byte correlation with some portion of a file or file-like resource. This resource is typically a file that is physically present on disk, but can also b ...
s. Applications that interact with devices open a location on the filesystem corresponding to the device, as they would for an
ioctl
call, but then use memory mapping system calls to tie a portion of their address space to that of the kernel. This interface is a far more efficient way to provide bulk data transfer between a device and a userspace application; individual
ioctl
or read/write system calls inflict overhead due to repeated userspace-to-kernel transitions, where access to a memory-mapped range of addresses incurs no such overhead.
; Win32: Buffered IO methods or named file mapping objects can be used; however, for simple device drivers the standard
DeviceIoControl METHOD_
accesses are sufficient.
Netlink
Netlink
Netlink is a socket family used for inter-process communication (IPC) between both the kernel and userspace processes, and between different userspace processes, in a way similar to the Unix domain sockets available on certain Unix-like operat ...
is a socket-like mechanism for
inter-process communication
In computer science, interprocess communication (IPC) is the sharing of data between running Process (computing), processes in a computer system. Mechanisms for IPC may be provided by an operating system. Applications which use IPC are often cat ...
(IPC), designed to be a more flexible successor to
ioctl
.
Implications
Complexity
ioctl
calls minimize the complexity of the kernel's system call interface. However, by providing a place for developers to "stash" bits and pieces of kernel programming interfaces,
ioctl
calls complicate the overall user-to-kernel API. A kernel that provides several hundred system calls may provide several thousand ioctl calls.
Though the interface to
ioctl
calls appears somewhat different from conventional system calls, there is in practice little difference between an
ioctl
call and a system call; an
ioctl
call is simply a system call with a different dispatching mechanism. Many of the arguments against expanding the kernel system call interface could therefore be applied to
ioctl
interfaces.
To application developers, system calls appear no different from application subroutines; they are simply function calls that take arguments and return values. The core libraries (e.g.
libc
The C standard library, sometimes referred to as libc, is the standard library for the C programming language, as specified in the ISO C standard.ISO/ IEC (2018). '' ISO/IEC 9899:2018(E): Programming Languages - C §7'' Starting from the origina ...
) mask the complexity involved in invoking system calls. The same is true for
ioctl
s, where driver interfaces usually come with a user space library. (E.g.
Mesa
A mesa is an isolated, flat-topped elevation, ridge, or hill, bounded from all sides by steep escarpments and standing distinctly above a surrounding plain. Mesas consist of flat-lying soft sedimentary rocks, such as shales, capped by a ...
for the
Direct Rendering Infrastructure
The Direct Rendering Infrastructure (DRI) is the framework comprising the modern Linux graphics stack which allows unprivileged user-space programs to issue commands to graphics hardware without conflicting with other programs. The main use ...
of graphics drivers.)
Libpcap and
libdnet are two examples of third-party wrapper Unix libraries designed to mask the complexity of
ioctl
interfaces, for packet capture and packet I/O, respectively.
Security
In traditional design, kernels resided in
ring 0, separated from device drivers in ring 1, and in
microkernel
In computer science, a microkernel (often abbreviated as μ-kernel) is the near-minimum amount of software that can provide the mechanisms needed to implement an operating system (OS). These mechanisms include low-level address space management, ...
s, also from each other. This has largely been given up due adding the same overhead of transitioning between rings to driver/kernel interfaces, that syscalls impose on kernel/user space interfaces. This has led to the difficult-in-practice requirement that all drivers, which now reside in ring 0 as well, must uphold the same level of security as the kernel core.
While the user-to-kernel interfaces of mainstream operating systems are often audited heavily for code flaws and security vulnerabilities prior to release, these audits typically focus on the well-documented system call interfaces. For instance, auditors might ensure that sensitive security calls such as changing user IDs are only available to administrative users.
Because the handler for an
ioctl
call also resides directly in ring 0, the input from
userspace should be validated just as carefully. As vulnerabilities in device drivers can be exploited by local users, e.g. by passing invalid buffers to
ioctl
calls.
In practice, this is not the case.
ioctl
interfaces are larger, more diverse, and less well defined, and thus harder to audit than system calls. Furthermore, because
ioctl
calls can be provided by third-party developers, often after the core operating system has been released,
ioctl
call implementations may generally receive less scrutiny and thus harbor more vulnerabilities. Finally, some
ioctl
calls, particularly for third-party device drivers, can be entirely undocumented.
Varying fixes for this have been created, with the goal of achieving an equivalent to the former security, while keeping the gained speed.
Win32 and
Unix
Unix (, ; trademarked as UNIX) is a family of multitasking, multi-user computer operating systems that derive from the original AT&T Unix, whose development started in 1969 at the Bell Labs research center by Ken Thompson, Dennis Ritchie, a ...
operating systems can protect a userspace device name from access by applications with specific access controls applied to the device. Security problems can arise when device driver developers do not apply appropriate access controls to the userspace accessible object.
Some modern operating systems protect the kernel from hostile userspace code (such as applications that have been infected by
buffer overflow exploits) using
system call wrappers. System call wrappers implement
role-based access control
In computer systems security, role-based access control (RBAC) or role-based security is an approach to restricting system access to authorized users, and to implementing mandatory access control (MAC) or discretionary access control, discretion ...
by specifying which system calls can be invoked by which applications; wrappers can, for instance, be used to "revoke" the right of a mail program to spawn other programs.
ioctl
interfaces complicate system call wrappers because there are large numbers of them, each taking different arguments, some of which may be required by normal programs.
Furthermore, such solutions negate the gained reduction of overhead.
Further reading
*
W. Richard Stevens, ''Advanced Programming in the UNIX Environment'' (Addison-Wesley, 1992, ), section 3.14.
Generic I/O Control operationsin the online manual for the
GNU C Library
The GNU C Library, commonly known as glibc, is the GNU Project implementation of the C standard library. It provides a wrapper around the system calls of the Linux kernel and other kernels for application use. Despite its name, it now also dir ...
*
*
*
*
*
"DeviceIoControl Documentationat the
Microsoft Developer Network
Microsoft Developer Network (MSDN) was the division of Microsoft responsible for managing the firm's relationship with developers and testers, such as hardware developers interested in the operating system (OS), and software developers developing ...
References
{{Reflist
Unix
System calls