私が使用している組み込みシステムがあり、現在、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 関数が行ったのと同じ低レベル関数を呼び出します)。