我有一个我正在使用的嵌入式系统,它目前使用sysfs来控制某些功能。
但是,如果可能的话,我们希望加快功能。
我发现这个子系统也支持和ioctl接口,但在重写代码之前,我决定通过搜索来查看哪个是更快的接口(在ucLinux上):sysfs或ioctl。
有没有人能够很好地理解这两种实现方式,让我粗略地了解每种实现的开销差异?我正在寻找通用信息,例如“ioctl更快,因为你已经从函数调用中删除了文件层”。或者“它们大致相同,因为sysfs的界面非常简单”。
2013年10月24日更新:
我目前正在做的具体案例如下:
int fd = open("/sys/power/state",O_WRONLY);
write( fd, "standby", 7 );
close( fd );
在kernel / power / main.c中,处理此写操作的代码如下所示:
static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,
const char *buf, size_t n)
{
#ifdef CONFIG_SUSPEND
suspend_state_t state = PM_SUSPEND_STANDBY;
const char * const *s;
#endif
char *p;
int len;
int error = -EINVAL;
p = memchr(buf, '\n', n);
len = p ? p - buf : n;
/* First, check if we are requested to hibernate */
if (len == 7 && !strncmp(buf, "standby", len)) {
error = enter_standby();
goto Exit;
((( snip )))
可以通过移动到自定义ioctl()来加速,其中处理ioctl调用的代码如下所示:
case SNAPSHOT_STANDBY:
if (!data->frozen) {
error = -EPERM;
break;
}
error = enter_standby();
break;
(所以ioctl()调用与sysfs函数相同的低级函数。)
答案 0 :(得分:2)
如果sysfs指的是sysfs()
库调用,请注意man 2 sysfs
:
注意
这个System-V派生系统调用已经过时;不要使用它。在带有/ proc的系统上,可以通过获得相同的信息 的/ proc /文件系统;改为使用该界面。
我记不起注意到有ioctl()
和sysfs接口的东西,但可能它们存在。无论如何,我都会使用proc或sys句柄,因为它往往不那么神秘和灵活。
如果sysfs是指访问/sys
中的文件,那么这是首选方法。
我正在寻找通用信息,例如“ioctl更快,因为你已经从函数调用中删除了文件层”。
访问procfs或sysfs文件不会带来I / O瓶颈,因为它们不是真正的文件 - 它们是内核接口。所以不,通过“文件层”访问这些东西不会影响性能。我认为这在linux系统编程中并不罕见。程序员可能会对系统调用不熟悉,系统调用以及开启文件的偏执都会变得迟钝。当然,ABI中的文件I / O无论如何都只是系统调用。普通(磁盘)文件读取速度慢的原因不是对打开,读取,写入等的调用,而是硬件瓶颈。
在执行此操作时,我始终使用基于低级别描述符的函数(open()
,read()
)而不是高级别流,因为在某些时候某些经验使我相信它们对此更具可靠性(从/proc
读取。我不能说这是否真的存在。
答案 1 :(得分:2)
所以,问题很有趣,我构建了几个模块,一个用于ioctl,另一个用于sysfs,ioctl只实现了4个字节的copy_from_user而已,而且sysfs在其写入接口中没有任何内容。
然后,几个用户空间测试多达100万次迭代,结果如下:
time ./sysfs /sys/kernel/kobject_example/bar
real 0m0.427s
user 0m0.056s
sys 0m0.368s
time ./ioctl /run/temp
real 0m0.236s
user 0m0.060s
sys 0m0.172s
修改强>
我同意@goldilocks的回答,硬件是真正的瓶颈,在Linux环境中用一个编写好的驱动程序选择ioctl或sysfs并没有太大的区别,但是如果你使用uClinux可能在你的硬件中甚至很少cpu周期可以有所作为。
我所做的测试是针对Linux而不是uClinux,它绝不想成为两个接口的绝对参考,我的观点是你可以写一本关于这个或那个有多快的书,但只有测试会让你知道了,花了我几分钟来设置这件事。