linux内核sysfs详解-1,Linux内核之设备驱动-sysfs

Linux内核之设备驱动-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

以先把documentation/filesystems/sysfs.txt读一遍。文档这种东西,真正读起来就嫌少了。Sysfs文件系统是一个类

似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。

去/sys看一看,

localhost:/sys#ls /sys/

block/ bus/ class/ devices/ firmware/ kernel/ module/ power/

Block目录:包含所有的块设备

Devices目录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构

Bus目录:包含系统中所有的总线类型

Drivers目录:包括内核中所有已注册的设备驱动程序

Class目录:系统中的设备类型(如网卡设备,声卡设备等)

sys下面的目录和文件反映了整台机器的系统状况。比如bus,

localhost:/sys/bus#ls

i2c/ ide/ pci/ pci express/ platform/ pnp/ scsi/ serio/ usb/

里面就包含了系统用到的一系列总线,比如pci, ide, scsi,

usb等等。比如你可以在usb文件夹中发现你使用的U盘,USB鼠标的信息。

我们要讨论一个文件系统,首先要知道这个文件系统的信息来源在哪里。所谓信息来源是指文件组织存放的地点。比如,我们挂载一个分区,

mount -t vfat /dev/hda2 /mnt/C

我们就知道挂载在/mnt/C下的是一个vfat类型的文件系统,它的信息来源是在第一块硬盘的第2个分区。

但是,你可能根本没有去关心过sysfs的挂载过程,她是这样被挂载的。

mount -t sysfs sysfs /sys

ms看不出她的信息来源在哪。sysfs是一个特殊文件系统,并没有一个实际存放文件的介质。断电后就玩完了。简而言之,sysfs的信息来源是kobject层次结构,读一个sysfs文件,就是动态的从kobject结构提取信息,生成文件。

文件系统

文件系统是个很模糊广泛的概念,"文件"狭义地说,是指磁盘文件,广义理解,可以是有组织有次序地存储与任何介质(包括内存)的一组信息。

linux把所有的资源都看成是文件,让用户通过一个统一的文件系统操作界面,也就是同一组系统调用,对属于不同文件系统的文件进行操作。这样,就可以对

用户程序隐藏各种不同文件系统的实现细节,为用户程序提供了一个统一的,抽象的,虚拟的文件系统界面,这就是所谓"VFS(Virtual

Filesystem Switch)"。这个抽象出来的接口就是一组函数操作。

我们要实现一种文件系统就是要实现VFS所定义的一系列 接口,file_operations, dentry_operations,

inode_operations等,供上层调用。file_operations是对每个具体文件的读写操作,dentry_operations,

inode_operations则是对文件的属性,如改名字,建立或删除的操作。

struct file_operations {

ssize_t (*read) (struct file *, char __user *, size_t, loff_t

*);

ssize_t (*write) (struct file *, const char __user *, size_t,

loff_t *);

int (*open) (struct inode *, struct file *);

...

};

struct dentry_operations {

...

};

struct inode_operations {

int (*create) (struct inode *,struct dentry *,int, struct nameidata

*);

struct dentry * (*lookup) (struct inode *,struct dentry *, struct

nameidata *);

int (*link) (struct dentry *,struct inode *,struct dentry *);

int (*mkdir) (struct inode *,struct dentry *,int);

int (*rmdir) (struct inode *,struct dentry *);

...}

举个例子,我们写C程序,open(“hello.c”, O_RDONLY),它通过系统调用的流程是这样的

open()

-> -> 系统调用->

sys_open() -> filp_open()-> dentry_open()

-> file_operations->open()

不同的文件系统,调用不同的file_operations->open(),在sysfs下就是sysfs_open_file()。

我们在进程中要怎样去描述一个文件呢?我们用目录项(dentry)和索引节点(inode)。它们的定义如下:

struct dentry {

struct

inode *d_inode;

struct

list_head d_child;

struct

dentry_operations *d_op;

struct

super_block *d_sb;

void *d_fsdata;

unsigned

char d_iname[DNAME_INLINE_LEN_MIN];

......

};

struct inode {

unsigned

long i_ino;

atomic_t i_count;

umode_t i_mode;

unsigned

int i_nlink;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值