proc文件系统、sysfs文件系统、kobject操作

简介:

Proc文件系统是提供一个接口给用户,让用户可以查看系统运行的一些状态信息,让用户修改内核的一些参数,比方说printk的打印级别就可以通过proc去修改

 

Sysfs文件系统,

Sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace

--- documentation /filesystems/sysfs.txt

 

Linux2.6 内核引入了sysfs文件系统。Sysfs被看成是与proc同类别的文件系统。Sysfs把连接在系统上的设备和总线组织成分级的文件, 使其从用户空间可以访问到。

 

Sysfs被加载在/sys/目录下,它的子目录包括:

 

Block:   在系统中发现的每个块设备在目录下对应一个子目录。每个子目录中又包含一些属性文件, 它们描述了这个块设备的各方面属性,如:设备大小。(loop块设备是使用文件来模拟的)

 

Bus:  在内核中注册的每条总线在该目录下对应一个子目录, 如:

       ide               pci               scsi       usb       pcmcia

其中每个总线目录内又包含两个子目录:

deviecs和drivers, devices目录包含了在整个系统中发现的属于该总线类型的设备,

drivers目录包含了注册到该总线的所有驱动.

 

Class: 将设备按照功能进行的分类, 如 /sys/class/net 目录下包含了所有网络接口

Devices: 包含系统所有的设备

Kernel: 内核中的配置参数

Module: 系统中所有模块的信息

Firmware: 系统中的固件

Fs 描述系统中的文件系统

Power系统中的电源选项

 

Kobject 实现了基本的面向对象管理机制,是构成linux2.6设备模型的核心结构。它与sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录。

 

void kobject_init(struct kobject *kobj, struct kobj_type *ktype);

--------  初始化kobject结构

 

int kobject_add(struct kobject *kobj, struct kobject *parent,

              const char *fmt, ...)

 ----------  将kobject对象注册到linux系统

 

int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,

                      struct kobject *parent, const char *fmt, ...) 

------  初始化kobject, 并将其注册到linux系统

 

void kobject_del(struct kobject *kobj)

 ---- 从linux系统中删除kobject对象

 

struct kobject *kobject_get(struct kobject *kobj)

---- 将kobject对象的引用计数加1, 同时返回该对象指针

 

void kobject_put(struct kobject *kobj)

 ----  将kobject对象的引用计数减1, 如果引用计数将为0, 则调用release方法释放该kobject对象

 

kobject 的ktype成员是一个指向kobj_type结构的指针,

该结构中记录了kobject对象的一些属性

 

struct kobj_type{

       void (*release)(struct kobject *kobj);

       struct sysfs_ops *sysfs_ops;

       struct attribute **default_attrs;

};

release:  用于释放kobject占用的资源,当kobject的引用计数为0时被调用。

 

struct attribute {

       char * name; /*属性文件名*/

       struct module * owner;

       mode_t mode;  /*属性的保护位*/

};

 

struct  attribute (属性) : 对应与kobject 的目录下的一个文件, Name成员就是文件名。

 

struct sysfs_ops {

       ssize_t (*show) (struct kobject*, struct attribute *, char *);

       ssize_t (*store) (struct kobject *, struct attribute *, const char*, size_t);

};

Show:  当用户读属性文件时,该函数被调用,该函数将属性值存入buffer中返回给用户态;

Store: 当用户写属性文件时,该函数被调用,用于存储用户传入的属性值。

代码如下:

复制代码
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/sysfs.h>
#include <linux/stat.h>

void obj_test_release(struct kobject *kobject);
ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf);
ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count);


struct attribute test_attr = {
    .name = "kobj_config",
    .mode = S_IRWXUGO,
};

static struct attribute *def_attrs[] = {
    &test_attr,
    NULL,
};

struct sysfs_ops obj_test_sysops = {
    .show = kobj_test_show,
    .store = kobj_test_store,
};

struct kobj_type ktype = {
    .release = obj_test_release,
    .sysfs_ops = &obj_test_sysops,
    .default_attrs=def_attrs,
};

void obj_test_release(struct kobject *kobject)
{
    printk("eric_test: release .\n");
}

ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)
{
        printk("have show.\n");
        printk("attrname:%s.\n", attr->name);
        sprintf(buf,"hehe %s\n",attr->name);
        return strlen(attr->name)+2+4;
}

ssize_t kobj_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count)
{
        printk("havestore\n");
        printk("write: %s\n",buf);
        return count;
}

struct kobject kobj;
static int kobj_test_init()
{
        printk("kboject test init.\n");
        kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");
        return 0;
}

static int kobj_test_exit(void)
{
    printk("\033[1;33;40m kobject test exit. \033[0m\r\n");
    kobject_del(&kobj);
    printk(KERN_ALERT "Goodbye, cruel world\n");
    return 0;
}

module_init(kobj_test_init);
module_exit(kobj_test_exit);

MODULE_DESCRIPTION("kmod-demo1 driver");
MODULE_AUTHOR("zhangbh");
MODULE_LICENSE("Dual BSD/GPL");
复制代码

 

 如有转载请注明出处

新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4760909.html,如需转载请自行联系原作者

相关文章
|
3月前
|
存储 安全 Linux
sysfs - 用于导出内核对象的_文件系统 【ChatGPT】
sysfs - 用于导出内核对象的_文件系统 【ChatGPT】
|
存储 缓存 Linux
sysfs文件系统(1)
sysfs是一种虚拟文件系统,旨在提供一种访问内核数据结构的方法,从而允许用户空间程序查看和控制系统的设备和资源。sysfs文件系统通常被挂载在/sys目录下。sysfs提供了一种以树状结构组织的系统信息的方式,其中每个设备都有一个唯一的目录来表示它自己,其中包含有关设备的各种属性和状态信息的文件。这些文件通常是只读的,但有些也可以用于修改设备的某些设置。sysfs还提供了一个机制来通知用户空间程序有关设备状态更改的信息,从而使其能够对这些更改做出反应。sysfs文件系统被广泛用于Linux内核中,它为开发者提供了一种简单的方式来管理和控制系统中的各种设备和资源。
203 0
|
7月前
|
存储 数据可视化 Linux
proc文件系统怎么玩?
proc文件系统怎么玩?
95 0
|
Linux 程序员 Shell
sysfs文件系统与kobject
sysfs文件系统与kobject
165 0
|
Unix Linux 容器
sysfs文件系统(2)
每个内核设备直接或间接嵌入kobject属性。在添加到系统之前,必须使用kobject_ create()函数分配kobject,并将已经分配但尚未初始化的kob ject指针及其kobject_type 指针作为参数。kobject_add()函数用于添加kobject并将其链接到系统,同时根据其层次结构创建目录及其默认属性。功能与之相反的函数是kobject_ del(),将kobject删除链接
122 0
|
固态存储 Linux 内存技术
文件系统与inode
文件系统与inode
文件系统与inode
|
缓存 Linux Shell
虚拟文件系统
Linux内核中的虚拟文件系统用来管理挂接各种具体文件系统。具体的文件系统可设计成可加载模块,在系统需要时进行加载。 挂载具体文件系统时,VFS读取它的超级块,得到具体文件系统的拓扑结构,并将这些信息映射到VFS超级块结构中。
1012 1