• 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 .
    ");
    }
    
    ssize_t kobj_test_show(struct kobject *kobject, struct attribute *attr,char *buf)
    {
            printk("have show.
    ");
            printk("attrname:%s.
    ", attr->name);
            sprintf(buf,"hehe %s
    ",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
    ");
            printk("write: %s
    ",buf);
            return count;
    }
    
    struct kobject kobj;
    static int kobj_test_init()
    {
            printk("kboject test init.
    ");
            kobject_init_and_add(&kobj,&ktype,NULL,"kobject_test");
            return 0;
    }
    
    static int kobj_test_exit(void)
    {
        printk("33[1;33;40m kobject test exit. 33[0m
    ");
        kobject_del(&kobj);
        printk(KERN_ALERT "Goodbye, cruel world
    ");
        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

  • 相关阅读:
    高性能javascript 笔记 第一章 loading and executing (一)
    css 微信webui
    C语言之指针
    Java中的异常
    Java中的接口
    SQL Server中自连接和联合的用法
    SQL Server中多对多关系的实现
    SQL Server中用SQL命令建表和主外键约束
    SQL Server中的分页查询
    SQL Server中的内连接
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4760909.html
Copyright © 2020-2023  润新知