問題タブ [kmalloc]
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.
memory - 最新のカーネルで GFP_ZERO を使用する「正しい」方法は何ですか?
Linux 3.0+GFP_ZERO
では、ヘッダーで定義されなくなっていることがわかりました。
gfp.h で見つけたのは、
これらの「エクスポートされた」ビット マスクを 1 回の使用で確認しましGFP_ZERO
た。
そして、著者は言うDo not use this directly
ので、どうすればゼロ化されたページを取得できますか、
kmalloc + memset
私が今持っている唯一のオプションですか?
c - oom killer を無効にすると、kmalloc() によって割り当てられた領域に影響しますか?
Linux カーネルのバージョンは 2.6.34.13 で、
CPU は Powerpc です。
ユーザー プロセスとカーネル モジュールの両方で OOM-killer を完全に無効にしたいと考えています。
以下のパラメータで設定することで、oom killer を無効にしました。
vm.overcommit_memory = 2
vm.overcommit_ratio = 100
この場合、malloc()
すべての (物理メモリ + スワップ) 領域が割り当てられるまで、使用可能なアドレスを返します。すべての領域が既に割り当てられている場合、NULL が返され、OOM killer は実行されません。
しかし、kmalloc()
GFP_KERNEL 引数ではどうでしょうか。ZONE_NORMAL 領域が完全に割り当てられている場合、kmalloc()
NULL を返しますか? そしてOOMキラーは実行されませんか?
c - dentry_open() の Kmalloc: カーネル パニック
私はカーネル Linux 2.6.34.14 に取り組んでいます。
このようにして、以前に定義された構造体へのポインターを構造体ファイルに (include/linux/fs.h に) 追加しました。
その後、構造体を open.c に割り当て、dentry_open (fs/open.c) でそれを行う必要があります。
このコードで言いたいのは、open が呼び出されたときに特定のフラグがある場合は、構造体とバッファーを構造体に割り当てます。
問題は次のとおりです。
新しいカーネルをコンパイルしましたが、すべて問題ありません。そのカーネルに入ろうとしましたが、「カーネル パニック - 同期していません: init を強制終了しようとしました」というメッセージが表示されます。
なぜですか?どこが間違っていますか?
c - kmalloc() は無効なメモリを返すことができますか?
リンクリストを実装したLinuxカーネルモジュールを書いています。LinuxカーネルにリストAPIがあることは知っていますが、実装したときに知らなかったので、kmalloc()で生のポインタを処理する実装を実装しました。数時間実行した後、カーネルがクラッシュし、クラッシュ ログに「一般保護違反」が表示されます。ログは、リンクされたリストを検索するための私の機能から発生していることも示しています。どうやら検索機能は以下のようなもので、論理エラーはありません。
また、挿入機能も論理的な観点から完璧であることは明らかです。General Protection Fault は通常、無効なメモリ アクセスが発生した場合に発生し、 以外によって割り当てられたメモリを使用したことがないためkmalloc()
です。私の質問は、kmallocによって割り当てられたメモリを使用する場合、使用前に確認する必要がある無効なメモリを使用する可能性があるということです?
クラッシュ ログの一部は次のとおりです。
挿入するとき、これで kmalloc によって割り当てられたメモリをチェックしました:
c - cでメモリを構造体に宣言する
1つのファイルに構造体abcがあります
次のように、この構造体を他のファイルで使用しています:
struct abc *t = kmalloc(sizeof(struct abc));
kmalloc は malloc と同等です
次に、次のエラーが発生します。
どこが間違っているのですか?
c - 値のリストをカーネル空間に渡す
私はLinuxプロジェクトに取り組んでいます。ユーザー空間プログラムからカーネルに整数値のリストを渡す必要があります。このためのシステムコールを実装しました。ユーザー空間プログラムには、次のコードがありました。の値はnum_values
、コマンド ライン引数から取得されます。
次に、システムコールを呼び出しました。
カーネルでの syscall ' set_wcet_val
' の実装は次のとおりです。
}
値 ' num_values
' は ' ' に正しくコピーされましたindex
。問題は、チェックしたときに最初の 2 つのデータのみが印刷されることdmesg
です。が 3の場合、num_values
3 番目のデータのランダムな正の値を取得しています。が 4の場合、num_values
3 番目のデータはランダムな正の値、4 番目のデータは負の値です。> 4 の場合num_values
、3 番目のデータの値はすべてゼロです。いずれの場合も、最初の 2 つの値のみが正しくコピーされます。この奇妙な動作の理由は何ですか?
memory-management - 物理的に連続したメモリ領域が、仮想的に連続したメモリよりも効率的である理由.
物理的に連続したメモリ領域は、仮想的に連続したメモリよりも効率的であると言われています。Robert Love の本によると、カーネルは、物理的に連続したメモリのページ テーブル エントリを設定する必要はありません。
しかし、カーネルはすべてのシナリオでページテーブルを必要としませんか? したがって、実質的に連続したメモリの場合にどのページ テーブル エントリを作成する必要があるか。