私はいくつかのLinuxカーネルドライバーのサポートを継承しています(私の経験は非常に限られています)。私の質問は次のとおりです。これは組み込み環境であり、ハードウェアには512MBの物理メモリがあります。ただし、カーネルに渡されるブートパラメータは、変数linuxMem = mem = 256Mを使用して、メモリを256MBに制限します。この環境変数の調査では、カーネルが管理できるメモリの量が256MBに制限されていることを理解しています。しかし、ターゲットで実行される一部のアプリケーションコードでは、/ dev / memが開き、返されたファイル記述子のmmapが続き、mmap呼び出しのオフセットパラメーターが物理メモリの上位256MBにあります。そして、物事はうまく機能しているようです。だから私の質問は「カーネルが上位256MBを知らないと思われるのになぜそれが機能するのか?」です。
質問する
4148 次
2 に答える
3
厳密に言えば、mem=256M は環境変数ではなく、カーネル パラメーターです。このパラメーターは、カーネルに大量のメモリを使用するように指示するだけですが、マシンにインストールされている物理チップをシステムが完全に認識できないようにするわけではありません。実際に利用可能な物理メモリよりも少ない物理メモリでシステムをシミュレートするために使用できますが、ボックスを開いてメモリ チップの 1 つを引き出すことと完全に同等ではありません。
このパラメーターのドキュメントを見ると、制限された範囲外のアドレスを状況によっては使用できることが明示的にわかります。そのため、memmap=
場合によっては使用することもお勧めします。したがって、制限を超えてアプリにメモリを割り当てることはできませんが、物理アドレスで見つかったものを確認することはできます。一部のデバイス ドライバーはこの可能性を利用しているようです。
于 2012-05-23T21:48:04.623 に答える
2
mmap()
物理アドレスではなく、仮想アドレスを返します。
デバイスが 64MB のメモリしか持たず、mmap()
約 1GB をマップすることは完全に可能です。
于 2012-05-23T19:58:20.800 に答える