問題タブ [vmalloc]

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

c - vmalloc と kmalloc の違いは何ですか?

kmallocグーグルで検索したところ、メモリの連続した物理ブロックを取得することが保証されているため、ほとんどの人が の使用を主張していることがわかりました。ただし、kmalloc必要な連続した物理ブロックが見つからない場合は失敗する可能性もあるようです。
メモリの連続したブロックを持つことの利点は何ですか? 具体的には、システム コールでメモリの連続した物理ブロックが必要になるのはなぜですか? 使えなかった理由はありますか? 最後に、システム コールの処理中にメモリを割り当てる場合、指定する必要がありますか? システムコールはアトミックコンテキストで実行されますか?vmalloc
GFP_ATOMIC

GFP_ATOMIC
割り当ては優先度が高く、スリープしません。これは、割り込みハンドラー、下半分、およびスリープできないその他の状況で使用するフラグです。

GFP_KERNEL これは通常の割り当てであり、ブロックされる可能性があります。これは、スリープしても安全な場合にプロセス コンテキスト コードで使用するフラグです。

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

linux-kernel - Linuxのカーネルモジュールにサイズ制限はありますか?

カーネルモジュールのロードに問題があります。メモリのサイズが約2Gbの大きなデータ構造があります。テーブルを事前に割り当てているかどうかに関係なく、モジュールをロード時に.bssで表示しsize -A module.koますvmalloc()。ロードはで失敗しinsmod: error inserting 'module.ko': -1 Cannot allocate memoryます。

ユーザーモードLinuxで問題をデバッグしようとしましたが、多数のsegfaultが発生します(gdbで続行できますが、コンソールメッセージが表示されます。overflow in relocation type 10 val <value in the ball park of 6G>正しい'module' likely not compiled with -mcmodel=kernelはずですよね?Kbuild-mcmodel

したがって、質問は次のとおりです。

  1. Linuxカーネルモジュールのサイズに一般的な2Gの制限はありますか?
  2. usernode linuxのカーネルモジュールには特定の2G制限がありますか(過去に、大きなカーネルモジュールにはクリーンで連続的なメモリブロックが必要であることに気づいたと思います...)
  3. カーネルモジュールを指定-mcmodel=largeして、それが機能することを期待できますか?

私はこれをdebiansqueeze、64ビット、2.6.32-5-amd64(ホスト)で8Gbのメモリを使用し、2.6.32をumlで4Gメモリを使用して試したので、これは通常のメモリ不足の問題ではありません。

そのような制限が存在する場合、制限を回避するための追加のクレジット:)

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

c - MacおよびCentOSでvmalloc(libvmalloc.a)を使用する-vmallocヘッダーを含めることはできません

パフォーマンスの向上を考慮して、データにアクセスするときにローカリティプロパティ(空間ローカリティ)を使用できるように、仮想的に連続した範囲メモリを割り当てたいと思います。次のページで、メモリローカリティアクセスを改善するためにvmallocを使用する必要があることがわかりました(間違っていて、代わりにkmallocを使用する必要がある場合は修正してください)。

vmallocとkmallocの違いは何ですか?

vmallocパッケージをhttp://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmallocからダウンロードしました

ソースファイルからlibmalloc.a静的ライブラリをビルドするためのインストール手順に従い、生成されたlibvmalloc.aライブラリをMacの/ usr / local/libおよび/usr/libディレクトリにコピーしました。

私のCプログラムでは、次のようなさまざまなアプローチでvmalloc.hヘッダーファイルをインクルードしようとしました。

しかし、それらのどれも機能しませんでした。私はいつもvmalloc.hを受け取りました:そのようなファイルまたはディレクトリのエラーメッセージはありません。C ++プログラムをコンパイルするときに、-L / usr / local /lib-lvmallocフラグを使用しました。デスクトップコンピューター(CentOSオペレーティングシステムの下)で同じことを試したときにも同じエラーが発生しました。
これが私のmakefileです:

また、リンカーフラグを次のように変更しようとしました。

それでも同じエラーが発生しました。この場合、何が問題になる可能性がありますか?ライブラリをリンクする方法に何か問題がありますか、またはvmallocは一部のバージョンのLinuxでのみ機能しますか?後者の場合でも、少なくともヘッダーファイルをインクルードできるはずです。

編集

私の本当の問題は実際には次のとおりです。

すべてのキャッシュ内のすべてのht_elementsが順番に作成されていることを確認したいと思います。データは仮想メモリに作成されるため、vmallocはキャッシュ対応アプリケーションの作成に適しているとフォーラムから読みました。キャッシュ配列のすべての要素の割り当てが連続した順序で作成されていることを確認する他のアプローチはありますか?したがって、高速ルックアップを実行できますか?もう1つ、すべてのキャッシュのすべての要素のサイズが同じではないため、callocを使用することは解決策ではないと思いますが、間違っている可能性があります。

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

linux - Linuxカーネルモジュールから大きな配列を読み取る

私はこれをかなり検索しましたが、間違いなく何かを見逃している可能性があり、http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.htmlとこのhttp:/を読んでます。 /www.amazon.com/Essential-Device-Drivers-Sreekrishnan-Venkateswaran/dp/0132396556ですが、Linuxカーネルモジュールで作成した大きなアレイを1つあたり200kBまで読み取るのに問題があります。私はARMベースのti-omap3530で開発しています。私は次のように配列を割り当てます:

私の読み取り関数は次のようになります(私はこれをおそらく最善の方法で行っていないことに気づきました):

そして、私はこのようなユーザースペースプログラムでそれを読みました:

ユーザースペースの読み取りは常に正しいバイト数の読み取りを報告しますが、正しいデータを取得できません。

このソリューションは、上記の3500をもっと小さいものに置き換えるとうまくいくようです(最大1000は問題なく動作します)が、それより上では、ゼロを読み取った配列が各配列の最後のN(同じ数の要素)を埋めるという奇妙な動作が発生します2つの配列のそれぞれの同じポイントで)、シリーズの後半で開始します。たとえば、time / param[0]=読み取りたい元の配列のはるか下にある値。

これは、メモリ処理を十分に理解していないためだと思いますが、これを実行する方法がわかりません。つまり、これらのデータ配列を、読み取りたいまでモジュールに格納します。ユーザースペースに。私が間違っている提案やアイデアは大歓迎です。

お手数をおかけしますが、何卒よろしくお願い申し上げます。

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

memory-management - vmalloc() は 32 ビット x86 で ZONE_HIGHMEM からのみメモリを取得しますか?

32 ビット x86 プラットフォームで、vmalloc() が ZONE_NORMAL または ZONE_HIGHMEM のいずれかからメモリを割り当てることができる場合、ZONE_HIGHMEM を拡大しても vmalloc() が使用できる実際の合計範囲は変わらないということですか? ZONE_HIGHMEM を拡張するテストを行いました。vmalloc() の 1 回の割り当ては、以前よりもはるかに大きくなる可能性があります。vmalloc() が実際に ZONE_HIGHMEM からのみメモリを割り当てるということですか?

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

android - 32ビットx86でVMALLOCスペースをどのくらい大きくすることができますか?

私の物理メモリは4Gで、32ビットのAndroid x86を使用しており、HIGHMEM4Gが有効になっています。vmalloc()スペースをできるだけ拡大したい。

私が試したように、2G / 2G VMsplitに変更して、VMALLOC_RESERVEDを大きくすると、vmalloc()スペースが1Gに到達する可能性があります。しかし、2Gなどのより大きなvmalloc()を取得したい場合、それは可能ですか?

Vmalloc()は、ZONE_HIGHMEMおよびZONE_NORMALから割り当てます。十分な物理メモリがある場合、ZONE_HIGHMEMは十分に大きいです。vmalloc()を2Gより上にするのに役立ちますか?または、vmalloc()はその仮想空間によって制約されているため、カーネル仮想空間が合計2Gの場合、vmalloc()は絶対にそれより大きくすることはできませんか?

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

linux - vmalloc_to_pfn returns 32 bit address on Linux 32 system. Why does it chop off higher bits of PAE physical address?

I'm using vmalloc_to_pfn() to get the physical address on a 32-bit PAE Linux system. It looks like vmalloc_to_pfn() returns "unsigned long" which means it is 32 bit on a 32 bit system, 64 bit on a 64-bit system. On 64-bit Linux, unsigned long is 64 bit and I've no issues.

Problem: Using this function to convert virtual to physical:

VA: 0xf8ab87fc PA using vmalloc_to_pfn: 0x36f7f7fc. But I'm actually expecting: 0x136f7f7fc.

The physical address falls between 4 to 5 GB. But I can't get the exact physical address, I only get the chopped off 32-bit address. Is there another way to get true physical address?

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

c - モジュールを新しいLinuxカーネルに移植する:メモリを割り当てることができません

最近のLinuxカーネル(3.4.4)用にコンパイルしようとしている非常に大きなドライバーモジュールがあります。insmod2.6.27.25カーネルで同じモジュールを正常にコンパイルできます。GCCのバージョンも異なり、4.7.0と4.3.0です。このモジュールは非常に複雑であり、すべてのコードとすべてのmakefileを単純に調べることはできないことに注意してください。

モジュールを「挿入」するとCannot allocate memory、次のトレースが表示されます。

明らかな答えは、モジュールが割り当てているメモリが多すぎるということのようですが、次のようになります。

  • このモジュールのサイズに関係なく、古いカーネルバージョンには問題はありません。
  • このモジュールの一部を整理してメモリ消費量を大幅に削減すると、新しいカーネルでも常に同じエラーメッセージが表示されます。
  • 他の多くのモジュールをアンロードできますが、影響はありません(とにかく関連性がありますか?モジュールごとの合計メモリ使用量に関してLinuxにグローバルな制限があります)

したがって、限られたメモリに直接関係しない新しいカーネルに問題があるのではないかと疑っています。

新しいカーネルは約30,000KBvmalloc()の不満を言っていますが、古いカーネルでは、lsmodは4,800KBのサイズを提供します。これらの数字は直接関連している必要がありますか?ビルド中に問題が発生し、要求されているRAMが多すぎる可能性はありますか?両方のセクションサイズをコンパイルすると、.ko大きな違いは見られません。

だから私は問題がどこから来ているのかを理解しようとしています。ダンプされたスタックを確認すると、一致するコードが見つかりません。からの障害vmalloc()は、によって行われsys_init_module()ているようinit_module()ですkernel/module.c。しかし、コードは一致しません。からオブジェクトコードを確認する.koと、init_module()コードも一致しません。

カーネルを十分に理解していないため、多かれ少なかれブロックされており、すべてのビルドシステムとモジュールのロードを理解するのは非常に困難です。一部の関数が欠落していると思われるため、モジュールがロードされる前にエラーが発生insmodし、この時点ではこれらのエラーは報告されません。