Heng30的博客
搜索 分类 关于 订阅

在Linux驱动如何在sys目录创建文件?

2025-03-05

/sys/kernel是Linux系统中的一个虚拟文件系统目录,位于sysfs文件系统下,主要用于提供内核相关的信息和配置接口。通过它,用户和应用程序可以访问和调整内核的某些运行时参数和行为。

主要功能

  • 内核参数查看与调整:/sys/kernel提供了许多内核参数的接口,允许用户查看和修改这些参数,如调试选项、内存管理等。

  • 调试与监控:该目录包含与内核调试相关的信息,如kexec、mm等,帮助开发者监控和调试内核行为

  • 安全与权限控制:通过security子目录,可以查看和配置内核的安全模块,如SELinux、AppArmor等。

  • 实时信息: 提供内核的实时信息,如uptime、version等,方便用户了解系统状态。

实例代码

// simple.c

#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/module.h>
#include <linux/string.h>

static struct kobject *dummy_obj = NULL;

static ssize_t _read(struct kobject *kobj, struct kobj_attribute *attr,
                     char *buffer) {
    pr_info("simple_read\n");

    return sprintf(buffer, "read from /sys/kernel/%s/%s", kobj->name,
                   attr->attr.name);
}

static ssize_t _write(struct kobject *kobj, struct kobj_attribute *attr,
                      const char *buffer, size_t size) {
    pr_info("write '%s' to /sys/kernel/%s/%s", buffer, kobj->name,
            attr->attr.name);

    return (ssize_t)size;
}

static struct kobj_attribute dummy_attr = __ATTR(dummy, 0664, _read, _write);

static int __init simple_init(void) {
    pr_info("simple_init\n");

    dummy_obj = kobject_create_and_add("hello", kernel_kobj);
    if (!dummy_obj) {
        pr_err("kobject_create_and_add hello folder failed\n");
        return -ENOMEM;
    }

    if (sysfs_create_file(dummy_obj, &dummy_attr.attr)) {
        pr_err("sysfs_crate_file failed\n");
        kobject_put(dummy_obj);
        return -ENOMEM;
    }

    return 0;
}

static void __exit simple_exit(void) {
    pr_info("simple_exit\n");
    sysfs_remove_file(dummy_obj, &dummy_attr.attr);
    kobject_put(dummy_obj);
}

module_init(simple_init);
module_exit(simple_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("heng30");
MODULE_VERSION("v0.0.1");
MODULE_DESCRIPTION("A simple kernel module");

Makefile编译脚本

#!/bin/sh

top-dir = $(shell pwd)
kernel-version = $(shell uname -r)
kernel-dir ?= /lib/modules/$(kernel-version)/build

obj-m += simple.o

all:
        make -C $(kernel-dir) modules M=$(top-dir)

clean:
        rm -f *.o *.ko *.mod *.mod.c *.order *.symvers
        make -C $(kernel-dir) clean m=$(top-dir)

测试

  • 安装驱动:insmod simple.ko

  • 移除驱动:rmmod simple.ko

  • 查看文件属性:ls -al /sys/kernel/hello/dummy

-rw-rw-r-- 1 root root 4096 Mar  4 17:57 /sys/kernel/hello/dummy
  • 写入内容:echo "hello" > /sys/kernel/hello/dummy

  • 读取内容:head -n 1 /sys/kernel/hello/dummy