問題タブ [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.
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()
一般に、カーネル内からマクロにラップされたシステム コールを使用する方法は?
c - Linux カーネル関数をモジュールに置き換えることはできますか?
夏の研究のためにカーネルの作業に取り掛かります。特定の RTT 計算で、TCP に変更を加える予定です。私がやりたいことは、tcp_input.c 内の関数の 1 つの解決を、動的にロードされたカーネル モジュールによって提供される関数に置き換えることです。これにより、修正の開発と配布のペースが向上すると思います。
私が興味を持っている関数は静的として宣言されていましたが、非静的関数でカーネルを再コンパイルし、EXPORT_SYMBOL によってエクスポートしました。これは、関数がカーネルの他のモジュール/部分にアクセスできるようになったことを意味します。「cat /proc/kallsyms」でこれを確認しました。
ここで、シンボル アドレスをイニシャルから動的に読み込まれた関数に書き換えることができるモジュールを読み込めるようにしたいと考えています。同様に、モジュールをアンロードすると、元のアドレスが復元されます。これは実行可能なアプローチですか?これをより適切に実装するにはどうすればよいか、皆さんからの提案はありますか?
ありがとう!
Linux カーネルのモジュールによる機能のオーバーライドと同じ
編集:
これが私の最終的なアプローチでした。
次の関数を考えると(オーバーライドしたかったのですが、エクスポートされていません):
次のように変更します。
これにより、期待される関数識別子が、元の実装を指す関数ポインタ (同様の方法で呼び出すことができます) として再定義されます。EXPORT_SYMBOL() は、アドレスをグローバルにアクセスできるようにするため、モジュール (または他のカーネルの場所) から変更できます。
これで、次の形式でカーネル モジュールを作成できます。
このモジュールは、元の実装を動的にロードされたバージョンに置き換えます。アンロードすると、元の参照 (および実装) が復元されます。私の特定のケースでは、TCP で RTT の新しい推定器を提供しました。モジュールを使用することで、カーネルを再コンパイルして再起動することなく、小さな調整を行ってテストを再開することができます。
linux - Linuxでsyscallは実際にどのように発生しますか?
この質問に触発されて
GDB を強制的に逆アセンブルするにはどうすればよいですか?
そしてこれに関連する
Linuxで実際にシステムコールはどのように発生しますか? 実際のカーネルルーチンが呼び出されるまで、呼び出しが実行されるとどうなりますか?
c++ - forkシステムコールとグローバル変数について
私は2つの新しいプロセスをフォークするC++のこのプログラムを持っています:
2つのフォークされたプロセスは共有変数をインクリメントし、親プロセスも同じことを行います。変数は各プロセスのデータセグメントに属しているため、増分は独立しているため、最終的な値は10になります。
ただし、共有変数のメモリアドレスは同じであるため、プログラムの出力をコンパイルして監視してみてください。それはどのように説明できますか?それは理解できません。fork()がどのように機能するかは知っていると思いましたが、これは非常に奇妙に思えます。
別々の変数ですが、アドレスが同じである理由について説明する必要があります。
io - 長さゼロで write() を呼び出すとどうなりますか?
Linux 関数のかなり高いレベルでは、write()
長さ 0 のバッファーへの書き込み要求を除外します。これは理にかなっています。実行すべき作業がないと判断するためだけに、OS がレイヤーを掘り下げて時間を無駄にしたいと思う人がいるでしょうか?
ええと...私。
これは、Linux カーネルの I2C 書き込み確認ポーリングに関連しています。また、ハンドシェイクが間違っている場合、アドレス (データの前にバスで送信される) がエラーを返す場合、ビットバンされた I2C ドライバーが潜在的に有用な戻りコードを返すという発見。
アドレスの後にダミーデータを送信できますが、私が使用しているデバイスでは送信できません。(たぶん私は読んでみます...)。
問題は、カーネルがゼロ (0) の長さの書き込みを許可した場合、どのような地獄が解き放たれるかということです。
linux - linux netfilter は、パケットの内容をユーザー空間のソケット アプリに渡します
dest-ip、source-ipなどの着信パケット情報を確認できるLinux
2.6を書きたいと思います。その後、パケットが HOOK に到達するとすぐにこれらの情報を処理するアプリ(アプリ) にこれらの情報を渡します。netfilter
module
IP
user space
Socket
私は2つの方法を試してみたい:
1. netfilter
モジュール内でfifo
構造体行を作成し、パケットが に到達するたびhook
に、パケット情報を fifo に入れます。/proc/example
そしてfilesystemの助けを借りて。ユーザー空間アプリがファイルを読み取るたびに/proc/example
、FIFO ヘッドからパケット情報が取得されます。
私はkernel
プログラムの初心者です。このプログラムは私のカーネルを数回クラッシュさせます。-_-! この方法は可能ですか?
2. netfilter モジュール内で char デバイスを作成し、ユーザー空間アプリがこの char デバイスからパケット情報を読み取ります。しかし、パケットをできるだけ早く確実に取得する方法はまだわかりません。パケットが netfilter フックに到達したときに、カーネルが何らかの信号をユーザー空間アプリに送信し、ユーザー空間アプリがパケット情報を選択しますか?
どうもありがとうございました。
memory-management - brk を減らしてから再び増やすと、Linux カーネルによってメモリがクリアされますか?
ユーザー プログラムが brk システム コールを介して解放し、その後再び元に戻すと、メモリがどうなるのか気になります。カーネルはそれをクリアしますか、それとも内容は未定義のままですか?
ページがbrkを介して新しく割り当てられると、カーネルがページをクリアすると思いますが、そのページが返されてから再度要求された場合にすべてをゼロにするかどうかはわかりません。lxr.linux.no を調べて調べています。この記事で紹介した本も参考にさせていただきます。
返信ありがとうございます。
ティム
git - 外部のロード可能なモジュールのgitcommithash
Linuxソースツリーの外部で(標準的な方法で)Linuxカーネルモジュールを開発しており、モジュールのロード中に出力されるバージョン文字列にドライバーのgitcommitハッシュを自動的に含めようとしています。Makefileは、コマンドを使用してgitハッシュを計算します
しかし、これはLinuxツリーのgitハッシュを取得し、私のドライバーは取得しません。コマンドを実行するときに特定のディレクトリを調べるようにgitに指示できますか、あるいは、この問題に取り組むためのより良い方法がありますか?
これはgit1.5.4.5とLinux2.6.28を使用しています
linux - カーネルコンパイル中の`missing-syscalls'エラー
自分のマシンでLinuxソースをコンパイルするために行っている手順は次のとおり
です。1。構成ファイルを/bootから/usr/src/kernels/2.6.29.4-167.fc11.i586/ディレクトリにコピーします
。2。oldconfig3を作成し
ます。作る
ステップ3は次のエラーで失敗します:make [1]:***ターゲットを`missing-syscalls'にするルールはありません。止まる。
x86ボックスでのコンパイル。助言がありますか ?ここに属していない場合は、この質問を閉じてください。
linux - gcc で 64 ビット Linux カーネルをコンパイルする
gcc を使用して 64 ビット Linux カーネルをコンパイルしようとすると、次のエラーが表示されます。
kernel/bounds.c:1: エラー: コード モデル 'kernel' は 32 ビット モードでサポートされていません
kernel/bounds.c:1: 申し訳ありませんが、実装されていません: 64 ビット モードはコンパイルされていません
これはgcc -vが報告するものです:
組み込み仕様の使用。
ターゲット: i586-redhat-linux
以下で構成: ../configure --prefix=/usr --mandir=/usr/share/man -- infodir=/usr/share/info --with-bugurl= http:// bugzilla.redhat.com/
bugzilla --enable-bootstrap --enable-shared --enable-threads=posix -- enable-checking=release --with-system-zlib --enable-__cxa_atexit -- disable-libunwind-exceptions --enable-languages= c,c++,objc,obj-c+ +,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/ java-1.5.0-gcj-1.5.0.0/jre -- enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar - -disable-libjava-multilib --with-ppl -- with-cloog --with-tune=generic --with-arch=i586 --build=i586-redhat-linux
スレッド モデル: posix
gcc バージョン 4.4.1 20090725 (レッドハット 4.4.1-2) (GCC)
カーネルの make コマンド ラインに何か足りないものがありますか? それとも、システムに存在する gcc が 64 ビットのコンパイルをサポートしていないのでしょうか?