一般来说,在ucLinux上,ioctl比写入/ sys文件系统更快吗?

时间:2013-10-23 16:51:19

标签: linux sysfs

我有一个我正在使用的嵌入式系统,它目前使用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函数相同的低级函数。)

2 个答案:

答案 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,它绝不想成为两个接口的绝对参考,我的观点是你可以写一本关于这个或那个有多快的书,但只有测试会让你知道了,花了我几分钟来设置这件事。​​