`
dato0123
  • 浏览: 915155 次
文章分类
社区版块
存档分类
最新评论

Linux那些事儿之我是Sysfs(13)举例四:sysfs读入普通文件内容

 
阅读更多
跟上回一样,我用这个小程序来读
#include<stdio.h>
#include
<fcntl.h>
#include
<unistd.h>
intmain()...{
char*name="/sys/bus/ldd/version";
charbuf[500];
intfd;
intsize;
fd
=open(name,O_RDONLY);
printf(
"fd:%d ",fd);
size
=read(fd,buf,sizeof(buf));
printf(
"size:%d ",size);
printf(
"%s",buf);
close(fd);
return-1;
}

(1)sysfs_open_file()

open() ->/*用户空间*/
-> 系统调用->
sys_open() -> filp_open()-> dentry_open() -> sysfs_open_file()/*内核空间*/

static int sysfs_open_file(struct inode * inode, struct file * filp)
{
return check_perm(inode,filp);
}

staticintcheck_perm(structinode*inode,structfile*file)
...{
structkobject*kobj=sysfs_get_kobject(file->f_dentry->d_parent);
structattribute*attr=to_attr(file->f_dentry);
structsysfs_buffer*buffer;
structsysfs_ops*ops=NULL;
interror=0;

if(!kobj||!attr)
gotoEinval;

/**//*Grabthemodulereferenceforthisattributeifwehaveone*/
if(!try_module_get(attr->owner))...{
error
=-ENODEV;
gotoDone;
}


/**//*ifthekobjecthasnoktype,thenweassumethatitisasubsystem
*itself,anduseopsforit.
*/

if(kobj->kset&&kobj->kset->ktype)
ops
=kobj->kset->ktype->sysfs_ops;
elseif(kobj->ktype)
ops
=kobj->ktype->sysfs_ops;
else
ops
=&subsys_sysfs_ops;

/**//*Nosysfsoperations,eitherfromhavingnosubsystem,
*orthesubsystemhavenooperations.
*/

if(!ops)
gotoEaccess;

/**//*Fileneedswritesupport.
*Theinode'spermsmustsayit'sok,
*andwemusthaveastoremethod.
*/

if(file->f_mode&FMODE_WRITE)...{

if(!(inode->i_mode&S_IWUGO)||!ops->store)
gotoEaccess;

}


/**//*Fileneedsreadsupport.
*Theinode'spermsmustsayit'sok,andwethere
*mustbeashowmethodforit.
*/

if(file->f_mode&FMODE_READ)...{
if(!(inode->i_mode&S_IRUGO)||!ops->show)
gotoEaccess;
}


/**//*Noerror?Great,allocateabufferforthefile,andstoreit
*itinfile->private_dataforeasyaccess.
*/

buffer
=kmalloc(sizeof(structsysfs_buffer),GFP_KERNEL);
if(buffer)...{
memset(buffer,
0,sizeof(structsysfs_buffer));
init_MUTEX(
&buffer->sem);
buffer
->needs_read_fill=1;
buffer
->ops=ops;
file
->private_data=buffer;
}
else
error
=-ENOMEM;
gotoDone;

Einval:
error
=-EINVAL;
gotoDone;
Eaccess:
error
=-EACCES;
module_put(attr
->owner);
Done:
if(error&&kobj)
kobject_put(kobj);
returnerror;
}

check_perm()检查一下权限,创建一个sysfs的缓冲区sysfs_buffer buffer,并设置其sysfs_ops sysfs_buffer->ops。在我们这个故事里,sysfs_buffer->ops被设置成bus_sysfs_ops。最后让file->private_data = buffer。

(2)sysfs read file()

流程如下:
read()->/*用户空间*/
-> 系统调用->
sys_read() -> vfs_read() -> sysfs_read_file()/*内核空间*/

看看sysfs_read_file()函数,

staticssize_t
sysfs_read_file(
structfile*file,char__user*buf,size_tcount,loff_t*ppos)
...{
structsysfs_buffer*buffer=file->private_data;
ssize_tretval
=0;

down(
&buffer->sem);
if(buffer->needs_read_fill)...{
if((retval=fill_read_buffer(file->f_dentry,buffer)))
gotoout;
}

pr_debug(
"%s:count=%d,ppos=%lld,buf=%s ",
__FUNCTION__,count,
*ppos,buffer->page);
retval
=flush_read_buffer(buffer,buf,count,ppos);
out:
up(
&buffer->sem);
returnretval;
}

顺着sysfs_read_file()往下走:
sysfs_read_file()
---> fill_read_buffer()
---> sysfs_buffer->bus_sysfs_ops->bus_attr_show()
---> bus_attribute->show_bus_version() //注意这个函数是我们在lddbus.c里面定义的
---> flush_read_buffer()

fill_read_buffer()的是真正的读,它把内容读到sysfs定义的缓冲区sysfs_buffer。flush_read_buffer()是把缓冲区copy到用户空间。详细内容我就不贴了。

分享到:
评论

相关推荐

    Linux那些事儿之我是sysfs

    Linux那些事儿之我是sysfs

    Linux那些事儿 之 我是Sysfs下.pdf

    Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。 去/sys看一看, localhost:/sys#ls /sys/ block/ bus/ class/ devices/ ...

    Linux那些事儿之我是Sysfs

    Linux那些事儿之我是Sysfs简单,诙谐的介绍sysfs

    Linux那些事儿

    《Linux那些事儿》分为9个部分。 Linux那些事儿之我是U盘 Linux那些事儿之我是Hub ...Linux那些事儿之我是Sysfs 今天本人将9个单独的文档整理出来,做成了一个单独的文档,配有书签,更加方便读者阅读。

    Linux那些事儿 之 我是Sysfs上.pdf

    Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。 去/sys看一看, localhost:/sys#ls /sys/ block/ bus/ class/ devices/ ...

    Linux那些事儿1-9合集

    由复旦fudan_abc写的,风趣的文笔,深入浅出地讲解了Linux内核相关模块,主要涉及了USB相关的模块,但是同样也解析了Linux驱动模型相关的知识,很值得一读。读过《linux那些事儿之我是U盘》...linux那些事儿之我是Sysfs

    linux那些事儿(EHCI Block SCSI Sysfs PCI USB U 盘 UHCI Hub)

    Linux那些事儿之我是EHCI主机...Linux那些事儿之我是Sysfs.pdf Linux那些事儿之我是PCI.pdf Linux那些事儿之我是USB core.pdf Linux 那些事儿之我是U 盘.pdf Linux那些事儿之我是Hub.pdf Linux那些事儿之我是UHCI.pdf

    Linux那些事儿(linux内核写的很详细)

    Linux那些事儿 Linux那些事儿之我是Block层 Linux那些事儿之我是Sysfs Linux那些事儿之我是U盘

    Linux那些事儿系列.rar

    》包括《Linux那些事儿之我是Hub》、《Linux那些事儿之我是Sysfs》《Linux那些事儿之我是UHCI》、《Linux那些事儿之我是USB core》、《Linux那些事儿之我是U盘》,令人叹为观止的一个linux系列书籍。只能说,江山代...

    linux的那些事儿全集

    Linux那些事儿之我是Block层 Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Hub ...Linux那些事儿之我是Sysfs Linux那些事儿之我是UHCI Linux那些事儿之我是USB core Linux那些事儿之我是U盘

    linux那些事全集

    Linux那些事儿之我是U盘 ...Linux那些事儿之我是Sysfs Linux那些事儿之我是SCSI硬盘 Linux那些事儿之我是PCI Linux那些事儿之我是Hub Linux那些事儿之我是EHCI主机控制器 Linux那些事儿之我是Block层

    Linux那些事儿 系列之2 Block+EHCI+PCI+SCSI

    Linux那些事儿之我是Block层.pdf Linux那些事儿之我是EHCI主机控制器.pdf Linux那些事儿之我是PCI.pdf Linux那些事儿之我是SCSI硬盘.pdf 注: 之前有人已经上传了《Linux那些事儿 系列》,其已经包含了:hub,sysfs...

    Linux那些事儿系列

    本人整理的fudan_abc的专栏中以完结的文章,在此向原作者表示感谢,给...内容包括:linux那些事儿之我是U盘,linux那些事儿之我是USB,linux那些事儿之我是HUB,linux那些事儿之我是UHCI,linux那些事儿之我是Sysfs。

    linux哪些事儿之我是usbcore echi pci u盘 sysfs

    linux哪些事儿之我是usbcore echi pci u盘 sysfs linux哪些事儿之我是usbcore echi pci u盘 sysfs

    Linux那些事儿.rar

    包括:Linux那些Linux那些事儿之我是SCSI硬盘,Linux那些事儿之我是Block层,Linux那些事儿之我是EHCI主机控制器,Linux那些事儿之我是HUB,Linux那些事儿之我是PCI,Linux那些事儿之我是Sysfs,Linux那些事儿之我是...

    Linux那些事系列

    Linux那些事儿之我是Hub Linux那些事儿之我是Sysfs Linux那些事儿之我是UHCI Linux那些事儿之我是USB core Linux那些事儿之我是U盘 Linux那些事之我是HUB1

    linux那些事儿之我是USB.zip

    里面包含Linux那些事的九个文档,Block层,ECHI主机控制,HUB,PCI,SCSI硬盘,Sysfs,UHCI,USB+core,U盘等九个文档,内容详细,而且全面都有书签,适合系统学习!

Global site tag (gtag.js) - Google Analytics