对一个问题的解答

晨曦之光 发布于 2012/04/10 15:00
阅读 136
收藏 0

【Gopher China万字分享】华为云的Go语言云原生实战经验!>>>

今天周日,陪老婆烫完头发回到家里,仍然不忘打开邮箱,一位朋友问了一个问题,说想用sysfs实现cdev,我觉得倒是没有什么不可,因为sysfs毕竟是一个内核和用户空间通信的接口,是个接口就可以被使用,我之所以敢打这个保票就是因为linux内核只提供机制而不提供任何策略,也就是说,只要你知道一个机制是内核和用户空间通信用的,那么你可以进行任何通信,内核机制丝毫不管你通信的内容,其实sysfs是向用户空间导出系统的设备信息的,但是这也仅仅是一个约定罢了,如果你非要用它来实际操作设备,那么linux内核绝对不会拦着你的,前提是只要你在上在下的代码符合它的接口约定即可,在上就是标准的文件接口,而在下就是sysfs的内核接口,也很简单,只管用。还是那句话:在linux中没有可不可以的问题,只有符合不符合约定的问题,没有对和错,只有好和不好。

问题:
写了一个简单的读写内存和外设寄存器的小模块... 用的是proc,很简单注册一个proc设备,提供读写函数就可以..应用层操作/proc/sysmem 设备文件..
这样的能用sysfs替换实现吗?  我看说proc是过时的了.但具体不知道怎么用sysfs来实现.用cdev?

我的回答:

procfs只是一个内核和用户空间通信的接口,原则上可以实现cdev的信息交换,但是如果你仅仅想实现在用户空间操作物理寄存器的话,那大可不必非要用cdev,正如你说的,在proc留下一个接口,实现read和write函数即可,如果你不想用procfs的话,你就要用标准的做法了,有两种方 式,第一种就是实现一个字符设备,实现它的file_operations,然后在/dev/下面按照主次设备号用mknod创建一个设备,最终你只需要 操作这个设备文件就可以了;第二种方式就是利用你说的sysfs接口,利用sysfs的目的是为了自动的将你的物理设备信息导向用户空间而不是为了读写寄 存器,这个方法下你就不用mknod手工建立设备了,而可以用用户空间的udevd守护进程自动依据sysfs的信息来创建设备了,最终你还是要操作你创 建的设备。
当然,直接用sysfs导出物理寄存器的信息或者直接用sysfs导出寄存器的读写接口,那倒也可以,但是不是标准的做法,实际上,不光sysfs,只要是用户空间和内核通信的机制你都可以利用,比如用netlink也可以,这个时候,你读写物理寄存器就变成读写一个netlink套接字了。
实际上sysfs只是一个系统信息导出文件系统,它的信息一般都是用户空间的守护进程用的,比如udev,这样的话可以让用户空间第一时间了解内核空间发 生的事件,不太赞成用sysfs直接导出个别的物理设备的完整信息,比如,你只要能通过sysfs得知物理设备已经就绪并且知道了它的设备号就可以了,真 正读写设备和操作设备还是要用标准的file_operations的vfs的方式,我想这也就是unix/linux中“一切皆文件”的意义。


原文链接:http://blog.csdn.net/dog250/article/details/5303715
加载中
返回顶部
顶部