問題タブ [kernel-module]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
17638 参照

c - open() は「そのようなデバイスはありません」というエラーを返しますが、そのようなデバイスはあります (Linux)

少し古いDAQを使用しようとしていますが、コンパイルするために古い(2004年頃)デバイスドライバーを取得するためにいくつかのフープをジャンプする必要がありました(DTI-DT340 Linux-DAQ-PCI)。

コンパイル、カーネル モジュールのロード、カードの検出、mknod を使用したキャラクター デバイスの作成ができるようになりました。

しかし、これらのデバイスを開くことができず、しようとするとerrno 19 (ENODEV) 'No such device'が表示され続けます。

しかし、mknod はそれを作成することに何の不満もありませんでした。

私が怠っていることはありますか?オープンが失敗する理由は何ですか?

ドライバーをロードしてデバイスを作成するために使用するスクリプトを次に示します。

いくつかの追加情報:

回答: printk は、-ENODEV が open() の内部からスローされたことを確認しました。オールドスタイルを踏襲

(これは非推奨です)、if(!pdev)最終的に true になり、-ENODEV を返します。

私は少しずつ近づいています-より現代的なメカニズムを使用するには、pciコードを修正して更新する必要があると思います...

0 投票する
2 に答える
3173 参照

linux - 非カーネル ヘッダーを含む Linux カーネル (2.6) モジュールをコンパイルします。

非カーネル インクルードによって定義された機能を含む Linux カーネル (2.6) モジュールをコンパイルすることは可能ですか?

例えば:


カーネルモジュール.h


メイクファイル

私が作成してコンパイルしようとしているカーネル モジュールには、いくつかの openssl インクルード ファイルにある機能が含まれています。

上記の標準の makefile では、Linux ヘッダーの外側にインクルードすることはできません。この機能を含めることは可能ですか? もしそうなら、正しい方向に向けてください.

ありがとう、マイク

0 投票する
1 に答える
2927 参照

linux - Linux カーネル モードからプロセスのアフィニティを設定する方法は?

カーネルモジュールでプロセスのCPUアフィニティを設定するにはどうすればよいですか? ユーザーモードには syscall がありますがsched_setaffinity、同等のカーネルモードを探しています。

Linux カーネル コードには、 という関数もありますsched_setaffinitysys_sched_setaffinityによって呼び出される関数から呼び出されsystem_callます。どうやら、これは私が使いたい機能です。システムコールと同じ名前なのがちょっと不安なんですけどね。

しかし、誰もが知っているように、最善の方法は試してみることです。それで私はそうしました、そして私のモジュールはコンパイルされました。ただし、モジュールをロードしようとすると、名前sched_setaffinityが未定義であると不平を言います。

0 投票する
2 に答える
130056 参照

c - Linux カーネル モジュール内のファイルの読み取り/書き込み

カーネルからファイルを読み書きするべきではない理由、代わりに/procまたはnetlinkを使用してそれを行う方法についてのすべての議論を知っています。とにかく読み書きしたい。また、 Driving Me Nuts - Things You Should Never Should Do in the Kernelも読み ました。

ただし、問題は 2.6.30 がエクスポートしないことsys_read()です。むしろ包まれていSYSCALL_DEFINE3ます。したがって、モジュールで使用すると、次の警告が表示されます。

insmodリンクが正しく行われないため、明らかにモジュールをロードできません。

質問:

  • 2.6.22 以降のカーネル内で読み取り/書き込みを行う方法 ( sys_read()/sys_open()はエクスポートされません)?
  • SYSCALL_DEFINEn()一般に、カーネル内からマクロにラップされたシステム コールを使用する方法は?
0 投票する
4 に答える
9928 参照

c - Linux カーネル関数をモジュールに置き換えることはできますか?

夏の研究のためにカーネルの作業に取り掛かります。特定の RTT 計算で、TCP に変更を加える予定です。私がやりたいことは、tcp_input.c 内の関数の 1 つの解決を、動的にロードされたカーネル モジュールによって提供される関数に置き換えることです。これにより、修正の開発と配布のペースが向上すると思います。

私が興味を持っている関数は静的として宣言されていましたが、非静的関数でカーネルを再コンパイルし、EXPORT_SYMBOL によってエクスポートしました。これは、関数がカーネルの他のモジュール/部分にアクセスできるようになったことを意味します。「cat /proc/kallsyms」でこれを確認しました。

ここで、シンボル アドレスをイニシャルから動的に読み込まれた関数に書き換えることができるモジュールを読み込めるようにしたいと考えています。同様に、モジュールをアンロードすると、元のアドレスが復元されます。これは実行可能なアプローチですか?これをより適切に実装するにはどうすればよいか、皆さんからの提案はありますか?

ありがとう!

Linux カーネルのモジュールによる機能のオーバーライドと同じ

編集:
これが私の最終的なアプローチでした。
次の関数を考えると(オーバーライドしたかったのですが、エクスポートされていません):

次のように変更します。

これにより、期待される関数識別子が、元の実装を指す関数ポインタ (同様の方法で呼び出すことができます) として再定義されます。EXPORT_SYMBOL() は、アドレスをグローバルにアクセスできるようにするため、モジュール (または他のカーネルの場所) から変更できます。

これで、次の形式でカーネル モジュールを作成できます。

このモジュールは、元の実装を動的にロードされたバージョンに置き換えます。アンロードすると、元の参照 (および実装) が復元されます。私の特定のケースでは、TCP で RTT の新しい推定器を提供しました。モジュールを使用することで、カーネルを再コンパイルして再起動することなく、小さな調整を行ってテストを再開することができます。

0 投票する
2 に答える
8147 参照

c - カーネルでファイルのパーミッションを変更する

カーネル モジュール (Linux では C) を作成していますが、その中の他のファイルのアクセス許可を変更したいと考えています。解決策はありますか?私はカーネルにいるので、chmod syscallを使用できません...助けてくれてありがとう

これは私の Makefile です:

そして、これは私のコードです:

作るときに警告が表示されます:

WARNING: "sys_chmod" [file] undefiened

モジュールを「sudo insmod」でロードすると、次のエラーが発生します。

Unknown sybol in module

このエラーは、特にカーネル モジュールで発生するようです。何か案が?再びありがとう!

0 投票する
2 に答える
4599 参照

linux - The Linux Kernel Module Programmers Guide の chardev.c の例の問題

lkmpgからchardev.c の例をコンパイルして実行したところ、デバイスへの書き込み時に予期しないエラーが発生しました。

モジュール書き込み関数は次のようになります。

無効な操作の予想されるエラーが発生せず、エラーが /var/log/messages に出力されます。

問題なくデバイスから読み取ることができ、期待される結果を受け取ります。

デバイス /dev/chardev は、次を使用して手動で作成されます。

どうしたんだ?

- 編集 -

どうやら、デバイスを作成するために mknod すると、最終的に次の権限が付与されます。

私がやっsudo chmod a+w /dev/chardevた後、ドライバーは期待どおりに動作しました。

しかし、人々はこれを行うのは正しくないと言っています。

正しい行動方針とその理由は何ですか?

0 投票する
1 に答える
15980 参照

linux-kernel - Linuxカーネルモジュール:いつtry_module_get/module_putを使用するか

LKMPGを読んでいて(セクション4.1.4。デバイスの登録解除を参照)、いつ機能を使用するかが明確ではありませんでしたtry_module_get / module_put。LKMPGの例の中には、それらを使用するものと使用しないものがあります。

混乱を増すためにtry_module_get、2.6.24ソースの193ファイルに282回表示されますが、Linuxデバイスドライバー(LDD3)Essential Linuxデバイスドライバーでは、1つのコード例にも表示されません。

おそらくそれらは古いregister_chrdevインターフェース(2.6ではcdevインターフェースに取って代わられました)に関連付けられていると思いましたが、同じファイルに一緒に表示されるのは8回だけです。

では、これらの機能を使用するのはいつ適切であり、特定のインターフェイスまたは一連の状況の使用に関連付けられているのでしょうか。

編集

LKMPGからsched.cの例をロードし、次の実験を試みました。

これにより、カーネルが独自のアカウンティングを実行し、gets/putsが廃止された可能性があると私は信じています。誰かがこれを確認できますか?

0 投票する
4 に答える
5831 参照

linux-kernel - カーネルスペースからのユーザースペースアクセス-get_user_pages

ユーザースペースメモリからカーネルモジュールの関数にポインタを渡したいのですが。使いたくないcopy_from_userget_user_pages関数を使うべきだと読みました。

たとえば、1ページ。

uaddrユーザースペースのアドレスです。

  1. uaddrこれを行った後、カーネルモジュール関数をキャストして渡すことはできますか?それとも私はこれらstruct pagesを何らかの方法で使用する必要がありますか?
  2. なぜダウン/アップリードを使用する必要があるのですか?
  3. すべての後、私は使用SetPageDirty()してpage_cache_release()機能する必要がありますか?
0 投票する
2 に答える
8276 参照

linux - depmodを使用して、あるLinuxカーネルモジュールを別の外部モジュールに依存させるにはどうすればよいですか?

既存のカーネル モジュールに依存するカーネル モジュールを作成しています。モジュールをツリーから (外部モジュールとして) 構築しています。

depmod によって認識されるように、依存関係を宣言するにはどうすればよいですか?