Linux device-number allocation 2026-11-05
Linux device-number allocation assigns or reserves the numerical identifiers through which device-special interfaces are registered. The relevant identity includes device type together with major device number and minor device number. It is distinct from naming a device node, assigning its inode number, or obtaining a process-local file descriptor.
The kernel's allocated-device list records established assignments. For example, character major 1 includes minor 3 for
/dev/null and minor 5 for /dev/zero. The same integer major 1 has a separate block-device allocation for RAM disks. These entries concern different interface namespaces, not interchangeable interpretations of a single untyped integer.[ref]Linux allocated devices in the Linux kernel documentation. Entry 1, character memory devices and block RAM disks
For character devices, the kernel API separates requesting a particular range with
register_chrdev_region from dynamic character-device number allocation with alloc_chrdev_region. The latter receives a first minor and count, chooses the major dynamically, and returns the first assigned combined device number. The caller must check whether reservation succeeded.[ref]Character-device number registration in the Linux kernel documentation. Char devices, register_chrdev_region and alloc_chrdev_region
An original allocation example requests four minor values starting at 20. If the returned major is , the reserved range in this example isIt does not contain . Code should use the returned rather than guess a major from an earlier machine or boot. A numerical allocation can serve software interfaces as well as physical hardware, so four minors do not necessarily imply four physical peripherals.
Reserving numbers is only one step. The character-device object must also be associated with its operations and added to the kernel;
cdev_add makes it live. Separately, userspace needs an appropriate device node or other naming arrangement. The registration name used for bookkeeping is not itself a pathname under /dev.[ref]Character-device number registration in the Linux kernel documentation. Char devices, cdev_init, cdev_add and __register_chrdev name description
This separation explains a common diagnostic trap. Creating a node containing a chosen major/minor pair does not reserve that range or supply a working device driver. Conversely, allocating a range does not make every invented pathname reach it. Inspect the actual registered interface, file type and stored device number together when identifying a device.
The allocation is also not a persistent hardware serial number. Dynamic assignment can differ between configurations or registration histories. Releasing a number range with
unregister_chrdev_region returns the reservation; a complete driver teardown must also handle the device object's lifetime and existing users. The kernel documentation notes that deleting a character-device object prevents new opens while operations on already open descriptors can remain possible.[ref]Character-device number registration in the Linux kernel documentation. Char devices, unregister_chrdev_region and cdev_del lifetime note
Major device number 2026-11-05
A major device number is the first component of a device number. In Linux interfaces it identifies a device class or registered device-number allocation; the minor device number distinguishes interfaces within that context.
major(d) extracts the major component from the combined dev_t value.[ref]The device type is also significant. The Linux registry assigns character major1 to memory-related interfaces, including
/dev/null, while block major1 describes RAM disks. Reusing the integer1 across these two types does not equate their behavior.[ref]Linux allocated devices in the Linux kernel documentation. Entry1, character and block allocations
An original metadata example makes the components explicit. Suppose a character-special node represents . Renaming that node within the file system does not by itself change its stored pair. A second node can represent the same pair, while a node with pair has a different major context despite matching minor12.
Linux device-number allocation can be dynamic, so a major number should not automatically be treated as a permanent hardware serial number or a universally fixed driver label.[ref]
Linux allocated devices in the Linux kernel documentation. Opening notes, dynamic allocation and naming
Its role is part of the device interface and registration scheme.The structured conversion satisfiesfor supported values. An inode number identifies a file-system object, while the represented device's major/minor pair answers a different question. The containing file system's own device identity is another distinct field.[ref]
Device file metadata in the Linux man-pages project. inode(7), Inode number, Device where inode resides and Device ID
Minor device number 2026-11-05
A minor device number is the second component of a device number. In the Linux interface,
minor(d) extracts it from a value of type dev_t; the matching major device number supplies its device-class context.[ref]A concrete Linux allocation distinguishes two character-special interfaces sharing major1:
/dev/null has minor3, while /dev/zero has minor5.[ref]Linux allocated devices in the Linux kernel documentation. Entry1, character memory devices
The former supplies end-of-file when read, while the latter supplies zero-valued bytes. Their different minor values select different interface behavior within the same major allocation.[ref]For an original pair comparison, let two registered character-device interfaces have numbers and . Both have minor7, but their complete device numbers differ. Conversely, and share a major while selecting different minor values within it. A minor value alone is therefore insufficient to identify the interface.
Minor numbers are interpreted in the relevant device allocation; there is no universal rule that every minor counts disks, partitions or physical pieces of hardware. The device may also be a purely virtual interface. The conversion functions preserve the structured components:for supported component values. Extracting the component with the documented interface avoids assuming an implementation-specific bit packing.