Add a New Class to the Linux Kernel: A Step-by-Step Guide

The Linux kernel provides a robust framework for developers to interact with hardware devices and represent them as software objects. One crucial aspect of this framework is the ability to register a kernel driver as a class device. This article provides an in-depth explanation of the process, detailing how to register a Linux kernel driver and add a new class to the Linux kernel.

What is a Class Device in Linux?

A class device in Linux represents a device at the logical level, allowing it to be abstracted and grouped under a broader category, such as block devices, network devices, or input devices. Classes in Linux make it easier to manage and organize hardware components that share similar functionalities.

Why Use a Class Device Framework?

The primary purpose of the class device framework is to provide a standardized way to interact with devices and their drivers. It allows for:

  • Simplified device management.
  • Better organization of similar devices.
  • Consistency in how users and applications access devices.

For example, devices like /dev/sda and /dev/sdb are categorized under the “block” class.

How to Register a Kernel Driver as a Class Device

Registering a driver as a class device involves creating a new device class in the kernel and associating devices with it. Follow the steps below to achieve this.

Step 1: Define and Create the Class

The first step is to define and register the class using the class_create function provided by the kernel:

struct class *my_class;
my_class = class_create(THIS_MODULE, "my_class");
if (IS_ERR(my_class)) {
    printk(KERN_ERR "Failed to create class\n");
    return PTR_ERR(my_class);
}

Here:

  • "my_class" is the name of the class being created.
  • The class_create function registers the class with the kernel.

Step 2: Create Devices in the Class

Once the class is created, devices can be added to it using the device_create function:

struct device *my_device;
my_device = device_create(my_class, NULL, MKDEV(0, 0), NULL, "my_device");
if (IS_ERR(my_device)) {
    printk(KERN_ERR "Failed to create device\n");
    class_destroy(my_class);
    return PTR_ERR(my_device);
}

Here:

  • "my_device" is the name of the device.
  • The MKDEV(0, 0) function specifies the device number.

Step 3: Handle Cleanup

When unloading the driver, ensure proper cleanup by removing devices and destroying the class:

device_destroy(my_class, MKDEV(0, 0));
class_destroy(my_class);

Adding a New Class to the Kernel

Adding a new class to the Linux kernel involves defining its purpose, creating an initialization function, and registering it with the kernel. Here’s how:

Define the Class

To add a new class, start by defining its structure:

static struct class *new_class;

Initialize the Class

The initialization function registers the class:

static int __init new_class_init(void) {
    new_class = class_create(THIS_MODULE, "new_class");
    if (IS_ERR(new_class)) {
        printk(KERN_ERR "Failed to register class\n");
        return PTR_ERR(new_class);
    }
    printk(KERN_INFO "Class created successfully\n");
    return 0;
}
module_init(new_class_init);

Cleanup on Exit

Ensure that the class is properly cleaned up during module exit:

static void __exit new_class_exit(void) {
    class_destroy(new_class);
    printk(KERN_INFO "Class removed successfully\n");
}
module_exit(new_class_exit);

Common Issues and Solutions

1. Class Creation Failure

If class_create fails, check for:

  • Kernel memory availability.
  • Proper naming conventions.

2. Device Creation Failure

When device_create fails:

  • Verify that the major and minor numbers are unique.
  • Ensure the parent class exists.

3. Module Compatibility

Modules must match the kernel version and configuration. Rebuild your kernel module if necessary.


Practical Use Case

Imagine developing a kernel driver for a custom hardware component, such as a temperature sensor. By registering it under a new class (e.g., temp_sensors), you can organize and access all similar sensors under a unified framework.


The Linux kernel’s class device framework simplifies hardware device management, providing developers with a structured approach to organizing and accessing devices. By understanding how to register a kernel driver as a class device and add new classes to the kernel, you can enhance modularity and maintainability in your driver development projects.

Leave a Comment