8

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

4

2 回答 2

3

如果 sysfs 是指sysfs()库调用,请注意man 2 sysfs

笔记

这个 System-V 派生的系统调用已过时;不要使用它。 在带有 /proc 的系统上,可以通过 /proc/filesystems 获得相同的信息;改用那个界面。

我不记得注意到有一个ioctl()和一个 sysfs 接口的东西,但它们可能存在。无论如何,我都会使用 proc 或 sys 句柄,因为这往往不那么神秘且更灵活。

如果 sysfs 是指访问 中的文件/sys,那是首选方法。

我正在寻找通用信息,例如“ioctl 更快,因为您已从函数调用中删除了文件层”。

访问 procfs 或 sysfs 文件不会带来 I/O 瓶颈,因为它们不是真正的文件——它们是内核接口。所以不,通过“文件层”访问这些东西不会影响性能。我认为,这在 linux 系统编程中并不少见。程序员可能会对不正常的系统调用、系统调用感到不安,并且偏执地认为打开文件会以某种方式变慢。当然,ABI 中的文件 I/O 无论如何只是系统调用。使普通(磁盘)文件读取缓慢的原因不是打开、读取、写入等调用,而是硬件瓶颈。

在执行此操作时,我总是使用基于低级描述符的函数(open(), read())而不是高级流,因为在某些时候,一些经验使我相信它们在这方面更可靠(从 阅读/proc)。我不能说这是否绝对正确。

于 2013-10-23T17:23:15.463 回答
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 的回答,HW 是真正的瓶颈,在 Linux 环境中,选择 ioctl 或 sysfs 的驱动程序编写良好并没有太大区别,但如果您在硬件中使用 uClinux,即使很少的 cpu 周期也可以一个区别。

我所做的测试是针对 Linux 而不是 uClinux,它从来不想成为分析这两个接口的绝对参考,我的观点是你可以写一本关于一个或另一个有多快的书,但只有测试会让你知道,拿我几分钟来设置的东西。

于 2013-10-23T21:44:14.077 回答