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. 自学Linux Shell3.2-切换目录命令cd

    点击返回 自学Linux命令行与Shell脚本之路 3.2-切换目录命令cd 当登录系统并获得shell命令提示符后,你通常位于自己的主目录中. 使用pwd命令验证: pwd命令以绝对路径的方式显示用 ...

  2. 自学Python1.4-Centos内vim中文乱码问题

    自学Python之路 自学Python1.4-Centos内vim中文乱码问题 1. 登陆的系统---区域语言设置 1.1查看安装中文包: 查看系统是否安装中文语言包 (列出所有可用的公共语言环境的名 ...

  3. 胡小兔的 PKUSC2018 游记

    Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...

  4. [luogu1373]小a和uim之大逃离【动态规划】

    传送门:https://www.luogu.org/problemnew/show/P1373 定义状态是:\(f[i][j][h][0..1]\)表示在\([i,j]\)两个人相差为h,让某一个人走 ...

  5. A1100. Mars Numbers

    People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. T ...

  6. windows & gcc & mingw & mysy 编译 openssl

    今天有一个项目需要使用到 https, 以前一直用的都是http请求, 用 socket() 实现 https 请求我还真是头一回遇到. 先网上搜索了一下相关资料,明白了 https 相比较 http ...

  7. java配置、IntelliJ IDEA Ultimate激活、

    1.下载并安装 Java地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html IntelliJ IDEA地址:ht ...

  8. Java 多线程间通信

    JDK 1.5 以后, 将同步和锁封装成了对象, 并将操作锁的隐式方法定义到了该对象中, 将隐式动作变成了显示动作. Lock 接口 Lock 接口, 位于 java.util.concurrent. ...

  9. Div里超出部分,省略号显示

    1.一行显示并出现省略号 1)三个属性: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; overflow: hidde ...

  10. yolo3的改变

    转自:https://zhuanlan.zhihu.com/p/35394369 YOLOv3的前世今生 2013年,R-CNN横空出世,目标检测DL世代大幕拉开. 各路豪杰快速迭代,陆续有了SPP, ...