問題タブ [linux-kernel]

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 投票する
2 に答える
763 参照

linux-kernel - Linux カーネル 2.6.21.3 に対して実行されている gphoto2 での PTP エラー

gphoto または Linux カーネルの第一人者がぶらぶらしていることを期待して、私はここでこの質問をしています。Linux libgphoto2 ライブラリのカスタム フロント エンドを構築しようとしています。今のところ、gphoto2 を使用してライブラリを呼び出しています。テスト マシンとして Etch (Debian 4.0) VM イメージでこれを実行しています。ソースを gphoto-suite svn リポジトリ トランクからプルし、問題なくビルドしました。スイートの libgphoto2 と gphoto2 の部分をビルドしただけです。必要なのはそれだけだからです。カメラ (Canon EOS Rebel XTi) に接続しようとすると、PTP エラーが発生し、「I/O ライブラリでエラーが発生しました ('Unspecified Error')」というメッセージが表示されます。libgphoto2 に関連して似ていると思われるバグへの言及が、いくつかの異なるカーネルを持ついくつかの Linux ディストリビューションに散在しているのを見つけました。最新のものは 2.6.28 にあるようで、gphoto-suite チームによってカーネルのバグであると明確に宣言されています。参考文献ここここ

このライブラリは、Ubunut の Hardy Heron で以前にこのカメラで動作するようになったので、過去に動作していたことを知っています。私のターゲット プラットフォームは 2.6.21 カーネルを実行するシングル ボード コンピューターであるため、Etch VM のカーネルを 2.6.21.3 に更新しましたが、同じエラーが発生しました。

私の質問は、これが本当に USB ドライバーのカーネル バグであり、しばらくの間ぶらぶらしていて、カーネル 2.6.28.4 以降で対処されているのか、それとも実際に gphoto2 のバージョンの問題なのかを知っている人はいますか? ? 組み込み設計を新しいカーネルに簡単にアップグレードできないので、gphoto のバグであることを願っています。それまでの間、古いバージョンの gphoto をビルドしてみます。

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

c - Linux カーネル 2.6 でのタイムキーピング

「Linux Device Drivers」(ここで見つけることができます)の第 7 章を​​読みましたが、時間は「jiffies」で測定できます。ストック jiffies 変数の問題は、かなり頻繁に循環することです (特に CONFIG_HZ を 1000 に設定している場合)。

私のカーネルモジュールでは、将来のある時点に設定された jiffies 値を保存し、後でそれを現在の「jiffies」値と比較しています。32 ビット jiffy ラップを考慮に入れる関数があることを既に知っているので、これを使用している 2 つの値を比較します。

ここに私の質問があります: それで、'some_future_jiffies_value' を "now + 10ms" に設定したいと思います。これは、次のようにすることで簡単に実現できます。

これは正しいです?現在の jiffies が MAX_JIFFY_OFFSET に近く、msecs_to_jiffies(10) の結果の値がそのオフセットを超えた some_future_jiffies_value になっている場合はどうなりますか? 自動的にラップアラウンドしますか、それともこれをチェックするコードを追加する必要がありますか? これに対処する必要がなくなる機能はありますか?

アップデート:

ラップアラウンドを避けるために、スリープループを書き直しました:

これはより移植性が高いと思いますよね?

更新 2:

この質問に時間を割いて、私のコメントにもフィードバックを提供してくれた「ctuffli」に感謝します。私のカーネル ドライバーは現在正常に動作しており、これらすべてのヒントを提供する前の状況と比較して、見苦しさが大幅に軽減されています。ありがとう!

0 投票する
3 に答える
2686 参照

linux - なぜ x86 で zone_highmem が必要なのですか?

Linux カーネルでmem_mapは、すべての「構造体ページ」記述子を保持する配列です。これらのページには、highmem を動的にマッピングするための lowmem の 128MiB メモリが含まれています。

lowmem サイズは 1GiB なので、mem_map配列には 1GiB/4KiB=256KiB エントリしかありません。各エントリ サイズが 32 バイトの場合、mem_mapメモリ サイズ = 8MiB です。しかし、mem_mapすべての 4GiB 物理メモリをマップするために使用できる場合 (x86-32 で利用可能な物理メモリが非常に多い場合)、mem_map 配列は 32MiB を占有し、それは多くのカーネル メモリではありません (または間違っていますか?)。

私の質問は、そもそも間接的な highmem マッピングのためにその 128MiB を low で使用する必要があるのはなぜですか? 別の言い方をすれば、最大 4GiB の物理メモリ (利用可能な場合) をすべてカーネル空間に直接マップしないのはなぜでしょうか?

注: 上記のカーネル ソースに関する私の理解が間違っている場合は、修正してください。ありがとう!

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

linux - Linux - 物理メモリ内の特定のアドレスを所有するプロセスを特定する

Linux では、特定のプロセスが物理メモリ内の特定のアドレスを所有/使用していることをどのように確認できますか?

これには、カーネル データ構造にアクセスして結果をユーザーに返すためのカーネル モジュールを作成する必要がある場合があることを理解しています。それがどれほど複雑であるかに関係なく、どのように実行できるかを知る必要があります。

0 投票する
6 に答える
14599 参照

c - sk_buff からの IP アドレス

netfilter フックを登録するカーネル モジュールを作成しています。sk_buff->saddrメンバーを使用して発信者の IP アドレスを取得しようとしています。人間が読める iexxxx 形式で IP を取得する方法はありますか?

関数は見つかりましたinet_ntop()が、カーネル ヘッダーでは使用できないようです。\xC0\xA8\x00\x01 を 192.168.0.1 に変換するにはどうすればよいですか?

0 投票する
3 に答える
12541 参照

linux-kernel - /proc/driver の下に proc エントリを作成するには?

ディレクトリ配下にファイルを作成したい/proc/driver。「driver/MODULE_NAME」を明示的に使用するのではなく、マクロproc_root_driver(または提供されているもの) を使用したいと思います。私は使用しますcreate_proc_entry

グーグルで調べたところ、使用する提案が見つかりましproc_root_driverたが、使用するとエラーが発生します

この関数で宣言されていない proc_root_driver

また、proc_root_driverlinux/proc_fs.h では利用できません。

私はこのような構造を宣言しようとしました:

/proc/driverコンパイル エラーはなくなりましたが、ファイルがまたはの下に表示されませんでした/proc。でエントリを作成するにはどうすればよい/procですか?

0 投票する
3 に答える
1092 参照

linux-kernel - Netfiler フックが呼び出されない

netfilter にフックを登録するカーネル モジュールを作成しています。モジュールがロードされているマシンに ssh/telnet で接続すると、ハンドラーが呼び出されません。

ハンドラー関数:

フックは、プロトコル 8 (外部ゲートウェイ プロトコル) に対して呼び出されています。2 番目の printk は印刷されません。何か不足していますか?

0 投票する
3 に答える
36091 参照

linux - Linux カーネルが使用するキャッシュを消去する方法

キャッシュが大量のメモリを消費し始めた後 (「free」の出力でわかるように)、Linux カーネルがアプリケーションにより多くのメモリを割り当てるように強制したいと考えています。

私は走った

(ディスク dentry/inode キャッシュとページ キャッシュの両方を解放するため)、使用されているキャッシュの約半分だけが解放されていることがわかります。残りは残ります。残りのキャッシュを占有しているものを特定し、強制的に解放するにはどうすればよいですか?

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

linux - Linux OOM killer によって強制終了されたプロセスを見つける

Linux がメモリ不足 (OOM) になると、OOM キラーはいくつかのヒューリスティックに基づいて、強制終了するプロセスを選択します (興味深い読み物です: http://lwn.net/Articles/317814/ )。

OOM キラーによって最近強制終了されたプロセスをプログラムで特定するにはどうすればよいですか?

0 投票する
5 に答える
45656 参照

linux - Linux でのダイレクト メモリ アクセス

組み込み Linux プロジェクトのために物理メモリに直接アクセスしようとしていますが、使用するメモリを最適に指定する方法がわかりません。

デバイスを定期的に起動して /dev/mem にアクセスすれば、ほぼどこでも簡単に読み書きできます。ただし、これでは、任意のプロセスに簡単に割り当てることができるメモリにアクセスしています。やりたくないこと

/dev/mem の私のコードは次のとおりです(すべてのエラーチェックなどは削除されています):

そして、これは機能します。しかし、私は他の誰も触れないメモリを使用したいと考えています。mem=XXXm で起動し、BASE_ADDRESS をそれより上 (物理メモリより下) に設定して、カーネルが認識するメモリの量を制限しようとしましたが、一貫して同じメモリにアクセスしていないようです。

私がオンラインで見たものに基づいて、ioremap() または remap_pfn_range() (または両方???) のいずれかを使用するカーネル モジュール (これで問題ありません) が必要になるのではないかと思いますが、その方法がまったくわかりません。誰でも助けることができますか?

EDIT:私が欲しいのは、常に同じ物理メモリ(たとえば、1.5MB相当)にアクセスし、そのメモリを脇に置いて、カーネルがそれを他のプロセスに割り当てないようにする方法です。

他のOS(メモリ管理なし)で使用していたシステムを再現しようとしています。これにより、リンカーを介してメモリにスペースを割り当て、次のようなものを使用してアクセスできます

EDIT2:もう少し詳細を提供する必要があると思います。このメモリ空間は、組み込みアプリケーションの高性能ロギング ソリューションの RAM バッファに使用されます。私たちが使用しているシステムでは、ソフト リブート中に物理メモリをクリアまたはスクランブルするものは何もありません。したがって、物理アドレス X にビットを書き込んでシステムを再起動すると、再起動後も同じビットが設定されたままになります。これは、VxWorks を実行しているまったく同じハードウェアでテストされています (このロジックは、異なるプラットフォーム (FWIW) 上の Nucleus RTOS および OS20 でもうまく機能します)。私のアイデアは、物理メモリを直接アドレス指定することで、Linux でも同じことを試すことでした。したがって、起動するたびに同じアドレスを取得することが不可欠です。

これはカーネル 2.6.12 以降用であることを明確にする必要があります。

EDIT3:これが私のコードです。最初はカーネルモジュール用で、次にユーザー空間アプリケーション用です。

これを使用するには、 mem=95m で起動し、次に insmod foo-module.ko 、次に mknod mknod /dev/foo c 32 0 で起動し、 foo-user を実行すると、終了します。gdbの下で実行すると、割り当てで死ぬことが示されますが、gdb内では、mmapから取得したアドレスを逆参照できません(printfはできますが)

foo-module.c

foo-user.c