私が知る限り、Linuxでは、RAMはカーネルスペースとユーザースペースに分かれています。カーネルスペースはカーネル実行用に予約されているため、ユーザースペースアプリケーションはそのメモリに直接アクセスしないでください。
このメモリはカーネル空間とユーザ空間にどのように分けられますか?カーネルをビルドするときにリンカスクリプトで定義されていますか?
ベストアンサー1
これには主に3つの側面が含まれます。
最初は住所ですスペース。
一部のアーキテクチャでは、アドレス空間の分割を強くお勧めします。たとえば、x86-64では仮想アドレス空間半分に分割され、アドレス空間の両端で大きくなります。これらのアーキテクチャでは、カーネルはx86-64の推奨事項に従い、アドレス空間の下半分はユーザー空間の割り当てに使用され、上半分はカーネルの割り当てに使用されます。バラよりLinuxでは、64ビットプロセスの仮想アドレス空間はどのように区別されますか?
他のアーキテクチャはデフォルトでこの構造を提供しません。たとえば、Linuxカーネル(および特権レベルを持つ他のほとんどのオペレーティングシステム)は独自のアドレス空間分割を設定します。x86から、3G/1G、2G/2G、1G/3G(ユーザースペース/カーネル)。
2番目はメモリ割り当てです。
アドレス空間の分割は静的ですが、メモリ割り当ては必要な場合にのみ割り当てられます。アドレス空間の分割は仮想アドレスの使用を決定しますが、物理メモリの使用には影響を与えず、使用方法も決定しません。たくさん使用される仮想アドレス空間の実際の量も使用されます。カーネル自体は独自のバイナリにメモリを割り当て、独自の目的に必要な追加のメモリは交換できません。Linuxカーネルはデータに仮想メモリを使用しますか?)。
3番目はメモリマッピングです。
これは、ハードウェア(メモリ管理デバイス)の助けを借りてカーネルによって完全に管理されます。マルチマップは常に維持されます。カーネルには、すべてのプロセスが共有する 1 つまたは 2 つの独自のマップがあり、各プロセスには独自のユーザー空間マップがあります。これにより、プロセスが互いに保護され、カーネルがユーザー空間から保護されます。バラよりLinuxプロセスの仮想メモリ空間のカーネル部分を持つ用途は何ですか?そしてアドレス空間のカーネル空間はどのように私たちのために予約されていますか?