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:
  • 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:

  1. Extracts device information (name, type, major/minor numbers)
  2. Builds device node path (/dev/<name>)
  3. Determines DevFS node type (block or character)
  4. Calls devfs_create_node_64 to 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:

  1. Allocates DEVFS_NODE structure
  2. Initializes node with name, type, major/minor numbers
  3. Assigns inode number
  4. Sets parent to root node
  5. 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:

  1. Device Detection - udev detects a new device (via PCI, USB, etc.)
  2. Device Registration - udev registers the device in its device list
  3. Node Creation Request - udev calls udev_create_device_node_64
  4. Path Building - Device node path is built (/dev/<name>)
  5. DevFS Creation - devfs_create_node_64 creates the node in DevFS
  6. 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:

  1. AHCI driver detects the disk
  2. udev receives hotplug notification
  3. udev creates DEVICE structure with:
    • name: "sda"
    • type: DEVICE_TYPE_BLOCK
    • major: 8 (block device major)
    • minor: 0 (first disk)
  4. udev calls udev_create_device_node_64
  5. Device node /dev/sda is created in DevFS
  6. Applications can now access the disk via /dev/sda

Files

  • kernel/services/udev_device_nodes.asm - Device node creation for udev
  • kernel/fs/devfs_create.asm - DevFS device node creation
  • kernel/services/udev.asm - udev device manager (calls device node creation)
  • kernel/fs/devfs.asm - DevFS filesystem implementation

See Also