3

ユーザー空間では、echo noop > /sys/block/sda/queue/scheduler.

カーネルモジュール内で同じことを行うには?

私は次のようなものを期待しています(疑似コード):

struct dentry* e = sysfs_get_root();
vfs_path_lookup(e, ????, "block/sda/queue/scheduler", ???);
????;
struct something* q = ????;
????->store(q, "noop", 1);
/* some cleanup */

それを適切に実装する方法は?

私のカーネル モジュールは SysRQ ハンドラを登録するだけで、その SysRQ がトリガーされたときに io スケジューラを設定する必要があります (不適切な io スケジューラが原因で、その時点でユーザー空間プログラムがハングする可能性があります)。

4

3 に答える 3

3

それを適切に実装する方法はありません。とにかくやりたい、そしてそれが悪い考え (tm) である理由を理解している場合は、この記事を参照してください。

于 2010-12-10T08:48:11.433 に答える
2

カーネルモジュール用に何かを設定したい場合は、コマンドを使用してカーネルモジュールを挿入するラッパースクリプトでそれを行うことができますinsmod.

そして、「カーネルからファイルを書き込むのがなぜ悪いのか」を説明しているこの記事を見てください。

于 2010-12-10T05:39:46.587 に答える
0

間違った間違った。はuserspace へsysfsのインターフェースです。カーネル内で使用しないでください。

モジュールがブロックスケジューラを変更したい場合は、カーネル内でそれを行う方法を考え出す必要があります。ユーザーがカーネルコードに書き込みを/sys/block/sda/queue/scheduler実行するときは、そのコードを直接呼び出す必要があります。

これは悪い考えのように思えますが、たとえば複数のブロック デバイスをどのように処理しますか?

于 2010-12-11T13:30:22.870 に答える