Linux Sysfs编程与源码分析.pdf

Linux Sysfs编程与源码分析.pdf

ID:52241922

大小:150.24 KB

页数:4页

时间:2020-03-25

Linux Sysfs编程与源码分析.pdf_第1页
Linux Sysfs编程与源码分析.pdf_第2页
Linux Sysfs编程与源码分析.pdf_第3页
Linux Sysfs编程与源码分析.pdf_第4页
资源描述:

《Linux Sysfs编程与源码分析.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、LinuxSysfs编程与源码分析Linux的发行遵守GNU(GNUisNotUNIX)的通用公共许可证,遵循公共版权许可证(GPL,GeneralPublicLicense),秉承“自由的思想,开放的源码”原则。从源代码中理解LinuxSysfs属性的用途更多的LinuxSysfs属性的功能只能靠阅读源代码来理解。还是以上文提到的scsi_host的scan属性来理解,这个功能没有任何文档上有描述,因此只能去读源代码。在内核中,LinuxSysfs属性一般是由__ATTR系列的宏来声明的,如对设备的使用DEVICE_

2、ATTR,对总线使用BUS_ATTR,对驱动使用DRIVER_ATTR,对类别(class)使用CLASS_ATTR,这四个高级的宏来自于,都是以更低层的来自中的__ATTR/__ATRR_RO宏实现;因此我们在内核源码树中相应位置drivers/scsi/找到这几个宏的使用情况,可以得到在drivers/scsi/scsi_sysfs.c中:staticssize_tstore_scan(structdevice*dev,structdevice_attribute*attr,constchar*buf,size_t

3、count)structScsi_Host*shost=class_to_shost(dev);intres;res=scsi_scan(shost,buf);if(res==0)res=count;returnres;staticDEVICE_ATTR(scan,S_IWUSR,NULL,store_scan);DEVICE_ATTR宏声明有四个参数,分别是名称、权限位、读函数、写函数。这里对应的,名称是scan,权限是只有属主可写(S_IWUSR)、没有读函数、只有写函数。因此读写功能与权限位是对应的,因为DEVI

4、CE_ATTR把权限位声明与真正的读写是否实现放在了一起,减少了出现不一致的可能。(上文提到/proc/scsi/scsi接口的权限位声明与其功能不对应,这与注册proc接口的函数设计中的不一致是有关系的,权限位声明与功能实现不在代码中同一个位置,因此易出错。虽然修复/proc/scsi/scsi的权限位错误很容易,但内核团队中多年来一直没有人发现或未有人去修正这个BUG,应该是与/proc/scsi/接口的过时有关,过时的功能会在未来某个内核版本中去除。)上面的scan属性写入功能是在store_scan函数中实现的

5、,这个接口的四个参数中,buf/count代表用户写入过来的字符串,它把buf进一步传给了scsi_scan函数;如果进一步分析scsi_scan函数实现可以知道,它期望从buf中接受三个或四个整型值(也接受"-"作为通配符),分别代表host,channel,id三个值,(第四个整数在早期内核中曾代表lun号码,但在较新内核中第四个数字被忽略,仅作为向后兼容保留接受四个整数),然后对具体的(host,channel,id)进行重新扫描以发现这个SCSI控制器上的设备变动。添加LinuxSysfs支持如果你正在开发的设

6、备驱动程序中需要与用户层的接口,一般可选的方法有:注册虚拟的字符设备文件,以这个虚拟设备上的read/write/ioctl等接口与用户交互;但read/write一般只能做一件事情,ioctl可以根据cmd参数做多个功能,但其缺点是很明显的:ioctl接口无法直接在Shell脚本中使用,为了使用ioctl的功能,还必须编写配套的C语言的虚拟设备操作程序,ioctl的二进制数据接口也是造成大小端问题(bigendian与littleendian)、32位/64位不可移植问题的根源;注册proc接口,接受用户的read/

7、write/ioctl操作;同样的,一个proc项通常使用其read/write/ioctl接口,它所存在的问题与上面的虚拟字符设备的的问题相似;注册LinuxSysfs属性;最重要的是,添加虚拟字符设备支持和注册proc接口支持这两者所需要增加的代码量都并不少,最好的方法还是使用LinuxSysfs属性支持,一切在用户层是可见的透明,且增加的代码量是最少的,可维护性也最好;方法就是使用头文件提供的这四个宏,分别应用于总线/类别/驱动/设备四种内核数据结构对象上:#defineBUS_ATTR(_name,_mode,

8、_show,_store)structbus_attributebus_attr_##_name=__ATTR(_name,_mode,_show,_store)#defineCLASS_ATTR(_name,_mode,_show,_store)structclass_attributeclass_attr_##_name=

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。