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)++;
} 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操作的更多相关文章
- Linux设备模型——设备驱动模型和sysfs文件系统解读
本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的 ...
- sysfs文件系统
3 sysfs文件系统 sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用.该文件系统的目录层次结构严格按照内核的数据结构组织.除了二进制文件外(只有特殊场合才使用 ...
- sysfs文件系统的建立【转】
http://blog.csdn.net/dndxhej/article/details/7434615 对sysfs和设备模型有了解的都会知道sysfs实际是为了将设备模型导出到用户空间的一个内存文 ...
- sysfs文件系统学习--sysfs
一.sysfs简介1.sysfs就是利用VFS的接口去读写kobject的层次结构,建立起来的文件系统.其更新与删除是那些xxx_register()/unregister()做的事 情.从sysfs ...
- [中英对照]The sysfs Filesystem | sysfs文件系统
The sysfs Filesystem | sysfs文件系统 Abstract | 摘要 sysfs is a feature of the Linux 2.6 kernel that allow ...
- 概述sysfs文件系统【转】
转自:http://blog.csdn.net/npy_lp/article/details/78933292 内核源码:linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 sys ...
- Sysfs文件系统与Linux设备模型
转:http://www.360doc.com/content/11/1218/16/1299815_173168170.shtml sysfs把连接在系统上的设备和总线组织成为一个分级的目录及文件, ...
- Linux 内核sysfs 文件系统符号连接
sysfs 文件系统有通常的树结构, 反映它代表的 kobjects 的层次组织. 但是内核中对象 间的关系常常比那个更加复杂. 例如, 一个 sysfs 子树 (/sys/devices )代表所有 ...
- 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 ...
随机推荐
- 自学Linux Shell3.2-切换目录命令cd
点击返回 自学Linux命令行与Shell脚本之路 3.2-切换目录命令cd 当登录系统并获得shell命令提示符后,你通常位于自己的主目录中. 使用pwd命令验证: pwd命令以绝对路径的方式显示用 ...
- 自学Python1.4-Centos内vim中文乱码问题
自学Python之路 自学Python1.4-Centos内vim中文乱码问题 1. 登陆的系统---区域语言设置 1.1查看安装中文包: 查看系统是否安装中文语言包 (列出所有可用的公共语言环境的名 ...
- 胡小兔的 PKUSC2018 游记
Day 0 一番纠结之后,我还是选择了 PKUSC (Penguin Kingdom University Summer Camp, 企鹅王国大学夏令营)! 理由?扔硬币决定的理由如下: PKU好啊 ...
- [luogu1373]小a和uim之大逃离【动态规划】
传送门:https://www.luogu.org/problemnew/show/P1373 定义状态是:\(f[i][j][h][0..1]\)表示在\([i,j]\)两个人相差为h,让某一个人走 ...
- A1100. Mars Numbers
People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. T ...
- windows & gcc & mingw & mysy 编译 openssl
今天有一个项目需要使用到 https, 以前一直用的都是http请求, 用 socket() 实现 https 请求我还真是头一回遇到. 先网上搜索了一下相关资料,明白了 https 相比较 http ...
- java配置、IntelliJ IDEA Ultimate激活、
1.下载并安装 Java地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html IntelliJ IDEA地址:ht ...
- Java 多线程间通信
JDK 1.5 以后, 将同步和锁封装成了对象, 并将操作锁的隐式方法定义到了该对象中, 将隐式动作变成了显示动作. Lock 接口 Lock 接口, 位于 java.util.concurrent. ...
- Div里超出部分,省略号显示
1.一行显示并出现省略号 1)三个属性: overflow: hidden; text-overflow: ellipsis; white-space: nowrap; overflow: hidde ...
- yolo3的改变
转自:https://zhuanlan.zhihu.com/p/35394369 YOLOv3的前世今生 2013年,R-CNN横空出世,目标检测DL世代大幕拉开. 各路豪杰快速迭代,陆续有了SPP, ...