Device Node Management
Overview
The Device Node Management system provides automatic creation and management of device nodes in the /dev filesystem. It integrates udev (device manager) with DevFS (device filesystem) to automatically create device nodes when hardware is detected.
Status: ✅ Fully Implemented
Complete device node management system with:
Complete device node management system with:
- Automatic device node creation on device detection
- Integration between udev and DevFS
- Support for block and character devices
- Hotplug device node creation
- Device node removal on device removal
Architecture
The Device Node Management system consists of:
- udev Device Nodes (
kernel/services/udev_device_nodes.asm) - Device node creation for udev - DevFS Node Creation (
kernel/fs/devfs_create.asm) - DevFS device node creation functions - udev Integration (
kernel/services/udev.asm) - udev device manager integration - DevFS (
kernel/fs/devfs.asm) - Device filesystem implementation
Device Node Types
| Type | Value | Description | Example |
|---|---|---|---|
DEVFS_TYPE_BLOCK |
1 | Block device (storage devices) | /dev/sda, /dev/sdb |
DEVFS_TYPE_CHAR |
2 | Character device (terminals, serial ports) | /dev/tty0, /dev/ttyS0 |
DEVFS_TYPE_DIR |
3 | Directory node | /dev/disk, /dev/input |
Device Node Creation
udev_create_device_node_64_impl
Creates a device node in /dev when a device is detected by udev.
; RDI: Device pointer (from udev.asm DEVICE structure) ; Returns: RAX = 0 on success, -1 on error global udev_create_device_node_64_impl udev_create_device_node_64_impl:
Process:
- Extracts device information (name, type, major/minor numbers)
- Builds device node path (/dev/<name>)
- Determines DevFS node type (block or character)
- Calls
devfs_create_node_64to create the node
devfs_create_node_64
Creates a device node in the DevFS filesystem.
; RDI: Device node path (e.g., "sda", "tty0") ; RSI: Device type (DEVFS_TYPE_BLOCK or DEVFS_TYPE_CHAR) ; RDX: Major number ; RCX: Minor number ; Returns: RAX = 0 on success, -1 on error global devfs_create_node_64 devfs_create_node_64:
Process:
- Allocates DEVFS_NODE structure
- Initializes node with name, type, major/minor numbers
- Assigns inode number
- Sets parent to root node
- Adds node to root's children list
Device Node Removal
udev_remove_device_node_64_impl
Removes a device node from /dev when a device is removed.
; RDI: Device pointer (from udev.asm DEVICE structure) ; Returns: RAX = 0 on success, -1 on error global udev_remove_device_node_64_impl udev_remove_device_node_64_impl:
devfs_remove_node_64
Removes a device node from the DevFS filesystem.
; RDI: Device node path ; Returns: RAX = 0 on success, -1 on error global devfs_remove_node_64 devfs_remove_node_64:
Integration Flow
The device node creation flow:
- Device Detection - udev detects a new device (via PCI, USB, etc.)
- Device Registration - udev registers the device in its device list
- Node Creation Request - udev calls
udev_create_device_node_64 - Path Building - Device node path is built (/dev/<name>)
- DevFS Creation -
devfs_create_node_64creates the node in DevFS - Node Available - Device node is now accessible in /dev filesystem
Device Structure
The device structure (DEVICE) from udev contains:
struc DEVICE
.name: resb 256 ; Device name
.syspath: resb 512 ; Sysfs path
.devpath: resb 512 ; Device path
.devnode: resb 256 ; Device node path
.major: resd 1 ; Major number
.minor: resd 1 ; Minor number
.type: resd 1 ; Device type
.state: resd 1 ; Device state
.vendor_id: resw 1 ; Vendor ID
.product_id: resw 1 ; Product ID
.serial: resb 64 ; Serial number
.properties: resq 1 ; Properties list
.rules: resq 1 ; Matching rules
.next: resq 1 ; Next device
endstruc
DevFS Node Structure
The DevFS node structure (DEVFS_NODE) contains:
struc DEVFS_NODE
.name: resb 256 ; Device name
.type: resd 1 ; Device type (block/char)
.major: resd 1 ; Major number
.minor: resd 1 ; Minor number
.inode: resq 1 ; Inode number
.parent: resq 1 ; Parent entry pointer
.ops: resq 1 ; Device operations
.next: resq 1 ; Next sibling
.children: resq 1 ; First child
endstruc
Device Types
| Type | Value | Description |
|---|---|---|
DEVICE_TYPE_BLOCK |
0 | Block device (storage) |
DEVICE_TYPE_CHAR |
1 | Character device (terminals, serial) |
DEVICE_TYPE_NETWORK |
2 | Network device |
DEVICE_TYPE_USB |
3 | USB device |
DEVICE_TYPE_PCI |
4 | PCI device |
DEVICE_TYPE_INPUT |
5 | Input device |
Hotplug Support
The device node management system supports hotplug events:
- Device Addition - When a device is hotplugged, udev detects it and creates a device node
- Device Removal - When a device is removed, udev removes the device node
- Event Notification - Hotplug events trigger device node creation/removal
Example: Storage Device
When a SATA disk is detected:
- AHCI driver detects the disk
- udev receives hotplug notification
- udev creates DEVICE structure with:
- name: "sda"
- type: DEVICE_TYPE_BLOCK
- major: 8 (block device major)
- minor: 0 (first disk)
- udev calls
udev_create_device_node_64 - Device node
/dev/sdais created in DevFS - Applications can now access the disk via
/dev/sda
Files
kernel/services/udev_device_nodes.asm- Device node creation for udevkernel/fs/devfs_create.asm- DevFS device node creationkernel/services/udev.asm- udev device manager (calls device node creation)kernel/fs/devfs.asm- DevFS filesystem implementation
See Also
- File System - Filesystem documentation
- Filesystem Drivers - DevFS driver documentation
- Storage Drivers - Storage device drivers
- USB System - USB device management