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)++;
} 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 ;
} 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 ;
} 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

proc文件系统、sysfs文件系统、kobject操作的更多相关文章

  1. Linux设备模型——设备驱动模型和sysfs文件系统解读

    本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的 ...

  2. sysfs文件系统

    3 sysfs文件系统 sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用.该文件系统的目录层次结构严格按照内核的数据结构组织.除了二进制文件外(只有特殊场合才使用 ...

  3. sysfs文件系统的建立【转】

    http://blog.csdn.net/dndxhej/article/details/7434615 对sysfs和设备模型有了解的都会知道sysfs实际是为了将设备模型导出到用户空间的一个内存文 ...

  4. sysfs文件系统学习--sysfs

    一.sysfs简介1.sysfs就是利用VFS的接口去读写kobject的层次结构,建立起来的文件系统.其更新与删除是那些xxx_register()/unregister()做的事 情.从sysfs ...

  5. [中英对照]The sysfs Filesystem | sysfs文件系统

    The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...

  6. 概述sysfs文件系统【转】

    转自:http://blog.csdn.net/npy_lp/article/details/78933292 内核源码:linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 sys ...

  7. Sysfs文件系统与Linux设备模型

    转:http://www.360doc.com/content/11/1218/16/1299815_173168170.shtml sysfs把连接在系统上的设备和总线组织成为一个分级的目录及文件, ...

  8. Linux 内核sysfs 文件系统符号连接

    sysfs 文件系统有通常的树结构, 反映它代表的 kobjects 的层次组织. 但是内核中对象 间的关系常常比那个更加复杂. 例如, 一个 sysfs 子树 (/sys/devices )代表所有 ...

  9. Node.js文件系统、路径的操作详解

    17173 17173 2 75 2014-12-12T05:06:00Z 2014-12-12T05:06:00Z 21 2735 15595 www.17173.com 129 36 18294 ...

随机推荐

  1. 05 Zabbix triggers--action--event

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 05 Zabbix triggers--action--event 动作action: 在配置好监 ...

  2. 自学Linux Shell16.3-函数递归+创建库

    点击返回 自学Linux命令行与Shell脚本之路 16.3-函数递归+创建库 1. 函数递归 递归调用函数是指函数调用自身进行求解. 通常,递归函数有基值,函数最终递推到达该值. 许多高级数学算法使 ...

  3. 自学Aruba6.1-基本网络参数配置(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.1-基本网络参数配置(web页面配置) 1 配置VLAN 1.1  新建VLAN Configuration---VLANs中,VLANID选项卡下的A ...

  4. 对STM32库函数中 assert 函数的认知

    > 本段代码取自 <stm32f4xx_gpio.c> > 可以看出进入函数第一件事就是做 assert 输入参数检查,参数合法后,根据参数做相应操作 /** * @brief ...

  5. suoi08 一收一行破 (tarjanLca+树状数组)

    用一个差分树状数组维护一下每个深度的和,然后每次拿着路径端点和lca加一加减一减就行了 #include<bits/stdc++.h> #define pa pair<int,int ...

  6. c++纯虚函数在父类中调用的规避

    构造和析构函数不允许调用纯虚函数,可以先调用虚函数,里面再调用纯虚函数实现. class Base{public:    virtual void foo()=0;    Base() { call_ ...

  7. Ubuntu安装Atom编辑器

    安装方法 执行以下命令 sudo add-apt-repository ppa:webupd8team/atom sudo apt-get update udo apt-get install ato ...

  8. BSGS

    北上广深/拔山盖世算法. yaT+b = z mod p p为质数,Hash表存b,枚举a,复杂度p0.5 记得特判y = 0的情况. inline void solve3() { Hash::cle ...

  9. es6/es7/es8常用新特性总结(超实用)

    本文标题有误导性,因为我其实想写node8的新特性,说实话一下子从node v1.x跳跃到node 8.x+ 真有点受宠若惊的感觉.一直觉得node 数组. 对象.序列等的处理没有python方便,因 ...

  10. 洛谷 P1064 金明的预算方案(01背包问题)

    传送门:Problem 1064 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 这道题是 “01”背包问题的变形. 如果不考虑买附件必 ...