目次
メモリ割り当てはどのように行われるのでしょうか? " >メモリ割り当てはどのように行われるのでしょうか?
最初のシステムコール: brk" >最初のシステムコール: brk
アドレス空間レイアウトのランダム化: ASLR" >アドレス空間レイアウトのランダム化: ASLR
第二个系统调用:mmap" >第二个系统调用:mmap
Linux 中内存分配的重要性" >Linux 中内存分配的重要性
ホームページ システムチュートリアル Linux Linux でのメモリ割り当ての仕組み

Linux でのメモリ割り当ての仕組み

Feb 10, 2024 pm 04:00 PM
linux Linuxチュートリアル Linuxシステム Linuxコマンド シェルスクリプト 埋め込みLinux Linux を始める Linux学習

Linux のメモリ割り当て、特にカーネルとシステム アーキテクチャの詳細を理解することが重要です。 Linux のメモリ割り当てを詳しく調べて、舞台裏で何が起こっているのかを理解しましょう。

コンピュータでプロセスを実行可能にするには、プロセスをメモリに配置する必要があります。これを行うには、メモリ内のプロセスにフィールドを割り当てる必要があります。メモリ割り当ては、特にカーネルとシステム アーキテクチャにおいて注意を払うべき重要な問題です。

Linux のメモリ割り当てを詳しく見て、舞台裏で何が起こっているのかを理解しましょう。

メモリ割り当てはどのように行われるのでしょうか?

ほとんどのソフトウェア エンジニアは、このプロセスの詳細を知りません。しかし、システムプログラマー候補者であれば、それについてもっと知っておく必要があります。割り当てプロセスを見るときは、Linux と glibc ライブラリについて少し詳しく説明する必要があります。

アプリケーションがメモリを必要とする場合、オペレーティング システムにメモリを要求する必要があります。カーネルからのこのリクエストには当然システム コールが必要です。ユーザーモードでは自分でメモリを割り当てることはできません。

**malloc()** 一連の関数は、C 言語のメモリ割り当てを担当します。ここで尋ねるべき問題は、glibc 関数としての malloc() が直接システム呼び出しを行うかどうかです。

Linux カーネルには malloc と呼ばれるシステム コールはありません。ただし、アプリケーションのメモリ要件には brkmmap という 2 つのシステム コールがあります。

glibc 関数を通じてアプリケーションのメモリを要求することになるため、現時点で glibc がどのシステム コールを使用しているかを知りたい場合があります。答えは両方です。

Linux 上内存分配的工作原理

最初のシステムコール: brk

各プロセスには連続データ フィールドがあります。 brk システムコールにより、データフィールドの制限を決定するプログラム割り込み値がインクリメントされ、割り当て処理が実行されます。

この方法を使用したメモリの割り当ては非常に高速ですが、未使用の領域をシステムに戻すことが常に可能であるとは限りません。

たとえば、それぞれのサイズが 16KB の 5 つのフィールドを、malloc() 関数を通じて brk システム コールに割り当てるとします。これらのフィールドの 2 番目のフィールドに入力すると、関連リソースをシステムが使用できるように返す (割り当てを解除する) ことができなくなります。 2 番目のフィールドの開始位置を示すためにアドレス値を減らして brk を呼び出すと、3 番目、4 番目、および 5 番目のフィールドの解放が完了するためです。

この場合のメモリ損失を防ぐために、glibc の malloc 実装はプロセス データ フィールド内の割り当てられた場所を監視し、free() 関数で指定されたとおりにシステムにその空き領域を返すため、システムは空き領域を使用できます。さらにメモリを割り当てます。

つまり、16KB 領域を 5 つ確保した後、brk システムコールによるデータ領域の拡張ではなく、free() 関数で 2 番目の領域を返し、しばらくしてからさらに 16KB 領域を要求すると、以前のアドレスに戻りました。

ただし、新たに要求した領域が 16KB を超える場合は、領域 2 が使用できないため、brk システムコールで新たな領域を割り当ててデータ領域を拡張します。領域番号 2 は未使用ですが、サイズが異なるためアプリケーションでは使用できません。このようなシナリオのため、内部断片化と呼ばれる現象が発生し、メモリのすべての部分を実際に完全に利用することがほとんどできなくなります。

理解を深めるために、次のサンプル アプリケーションをコンパイルして実行してみてください:

リーリー

アプリケーションを実行すると、次のような出力が表示されます:

リーリー Linux 上内存分配的工作原理

strace を使用した brk の出力は次のとおりです:

リーリー

ご覧のとおり、データ フィールドの終了アドレスに 0x21000 が追加されています。これは、値 0x5608595d7000 から理解できます。したがって、約 0x21000、つまり 132KB のメモリが割り当てられます。

ここで考慮すべき点が 2 つあります。 1 つ目は、コード例で指定されている以上の割り当てを行うことです。もう 1 つは、割り当てを提供する brk 呼び出しを引き起こすコード行です。

アドレス空間レイアウトのランダム化: ASLR

上記のサンプル アプリケーションを次々に実行すると、毎回異なるアドレス値が表示されます。このようにアドレス空間をランダムに変更すると、セキュリティ攻撃の作業が大幅に複雑になり、ソフトウェアのセキュリティが強化されます。

但是,在 32 位架构中,通常使用 8 位来随机化地址空间。增加位数将不合适,因为剩余位上的可寻址区域将非常低。此外,仅使用 8 位组合不会使攻击者的事情变得足够困难。

另一方面,在 64 位体系结构中,由于可以为 ASLR 操作分配的位太多,因此提供了更大的随机性,并且提高了安全程度。

Linux 内核还支持基于 Android 的设备,并且 ASLR 功能在 Android 4.0.3 及更高版本上完全激活。即使仅出于这个原因,也可以说 64 位智能手机比 32 位版本具有显着的安全优势。

通过使用以下命令暂时禁用 ASLR 功能,之前的测试应用程序每次运行时都会返回相同的地址值:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

要将其恢复到以前的状态,在同一个文件中写入 2 而不是 0 就足够了。

第二个系统调用:mmap

mmap 是 Linux 上用于内存分配的第二个系统调用。通过 mmap 调用,内存中任何区域的空闲空间都映射到调用进程的地址空间。

在以这种方式完成的内存分配中,当您想使用前面 brk 示例中的 free() 函数返回第二个 16KB 分区时,没有机制可以阻止此操作。从进程的地址空间中删除相关的内存段。它被标记为不再使用并返回系统。

因为与使用 brk 相比,使用 mmap 的内存分配非常慢,所以需要分配 brk。

使用 mmap,内存的任何空闲区域都映射到进程的地址空间,因此在该进程完成之前,已分配空间的内容被重置。如果没有以这种方式进行重置,则属于先前使用相关内存区域的进程的数据也可以被下一个不相关的进程访问。这样就不可能谈论系统中的安全性。

Linux 中内存分配的重要性

内存分配非常重要,尤其是在优化和安全问题上。如上面的示例所示,不完全理解此问题可能意味着破坏系统的安全性。

甚至许多编程语言中存在的类似于 push 和 pop 的概念也是基于内存分配操作的。能够很好地使用和掌握系统内存对于嵌入式系统编程和开发安全和优化的系统架构都是至关重要的。

如果您还想涉足 Linux 内核开发,请考虑首先掌握 C 编程语言。

综上所述,Linux 中的内存分配是一个需要注意和理解的重要问题,特别是对于程序员、内核开发人员和系统架构师而言。熟练掌握内存分配可以提高软件性能和安全性,并在嵌入式系统编程和系统架构方面提供更好的支持。同时,C 编程语言的掌握也是涉足 Linux 内核开发的关键。

以上がLinux でのメモリ割り当ての仕組みの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows Google Chromeにファイルをアップロードできなかったことを修正しました Windows Google Chromeにファイルをアップロードできなかったことを修正しました Jul 08, 2025 pm 02:33 PM

Google Chromeにファイルをアップロードするのに問題がありますか?これは迷惑かもしれませんよね?電子メールにドキュメントを添付したり、ソーシャルメディアで画像を共有したり、仕事や学校の重要なファイルを送信したりするかどうかにかかわらず、スムーズなファイルのアップロードプロセスが重要です。したがって、Windows PCのChromeでファイルのアップロードが引き続き失敗している場合、イライラする可能性があります。お気に入りのブラウザを放棄する準備ができていない場合は、Windows Google Chrome 1にファイルをアップロードできない修正のヒントをいくつか紹介します。高度なトラブルシューティングのヒントについて学ぶ前に、ユニバーサル修理から始めて、以下に説明する基本的なソリューションを試すのが最善です。インターネット接続の問題のトラブルシューティング:インターネット接続

Linuxでグループを管理する方法 Linuxでグループを管理する方法 Jul 06, 2025 am 12:02 AM

Linuxユーザーグループを管理するには、表示、作成、削除、変更、およびユーザー属性の調整の操作をマスターする必要があります。ユーザーグループ情報を表示するには、cat/etc/groupまたはgetentgroupを使用して、グループ[username]またはid [username]を使用して、ユーザーが属するグループを表示できます。 GroupAddを使用してGroupを作成し、GroupDelを使用してGIDを指定します。 GroupDelを使用して、空のグループを削除します。 USERMOD-AGを使用してユーザーをグループに追加し、USERMOD-Gを使用してメイングループを変更します。 USERMOD-Gを使用して、 /etc /groupを編集するか、VIGRコマンドを使用してグループからユーザーを削除します。 GroupMod-N(名前を変更)またはGroupMod-G(GIDの変更)を使用してグループプロパティを変更し、関連するファイルの許可を更新することを忘れないでください。

Linuxで私のプライベートおよびパブリックIPアドレスを見つける方法は? Linuxで私のプライベートおよびパブリックIPアドレスを見つける方法は? Jul 09, 2025 am 12:37 AM

Linux Systemsでは、1。IPAまたはHOSTNAME-Iコマンドを使用してプライベートIPを表示します。 2。CurlifConfig.meまたはcurlipinfo.io/ipを使用して、パブリックIPを取得します。 3.デスクトップバージョンは、システム設定を介してプライベートIPを表示でき、ブラウザは特定のWebサイトにアクセスしてパブリックIPを表示できます。 4.一般的なコマンドは、クイックコールのためにエイリアスとして設定できます。これらの方法はシンプルで実用的で、さまざまなシナリオでのIP表示のニーズに適しています。

Linuxをインストールするためのシステム要件 Linuxをインストールするためのシステム要件 Jul 20, 2025 am 03:49 AM

linuxcanrunonModesthardwarewithspecificminimumrequirements.a1ghzprocessor(x86orx86_64)が必要であり、 amshouldbeatleast512mbforcommand-lineuseor2gbfordesktopenvironments.diskspacerequiresaminimumof5–10gb、25gbisbetterforad

ビットコインのコード番号は何ですか?ビットコインはどのスタイルのコードですか? ビットコインのコード番号は何ですか?ビットコインはどのスタイルのコードですか? Jul 22, 2025 pm 09:51 PM

デジタルの世界の先駆者として、ビットコインのユニークなコード名と基礎となるテクノロジーは、常に人々の注目の焦点でした。その標準コードはBTCであり、国際標準を満たす特定のプラットフォームでXBTとしても知られています。技術的な観点からは、ビットコインは単一のコードスタイルではなく、巨大で洗練されたオープンソースソフトウェアプロジェクトです。そのコアコードは主にCで記述されており、暗号化、分散システム、経済学の原則が組み込まれているため、誰でもコードを表示、レビュー、貢献できます。

PHPコンテナを自動構造をサポートする方法は? PHP環境の継続的に統合されたCI構成方法 PHPコンテナを自動構造をサポートする方法は? PHP環境の継続的に統合されたCI構成方法 Jul 25, 2025 pm 08:54 PM

PHPコンテナが自動構造をサポートできるようにするために、コアは連続統合(CI)プロセスの構成にあります。 1. DockerFileを使用して、基本的な画像、拡張インストール、依存関係管理、許可設定など、PHP環境を定義します。 2. GitlabciなどのCI/CDツールを構成し、.gitlab-ci.ymlファイルを介してビルド、テスト、展開段階を定義して、自動構造、テスト、展開を実現します。 3. phpunitなどのテストフレームワークを統合して、コードの変更後にテストが自動的に実行されることを確認します。 4. Kubernetesなどの自動展開戦略を使用して、deployment.yamlファイルを介して展開構成を定義します。 5. DockerFileを最適化し、マルチステージ構造を採用します

「シャットダウン」コマンドを使用する方法 「シャットダウン」コマンドを使用する方法 Jul 15, 2025 am 12:26 AM

Linux/MacOSのシャットダウンコマンドは、パラメーターを介してシャットダウン、再起動、およびタイミング操作を行うことができます。 1.すぐにマシンをオフにし、sudoshutdownnowまたは-h/-pパラメーターを使用します。 2。シャットダウンに時間または特定の時点を使用して、-cの使用をキャンセルします。 3. -Rパラメーターを使用して再起動し、タイミングの再開をサポートします。 4. SUDO許可の必要性に注意し、リモート操作に注意し、データの損失を避けてください。

独立したPHPタスクコンテナ環境を構築する方法。 PHPタイムタイムスクリプトを実行するためにコンテナを構成する方法 独立したPHPタスクコンテナ環境を構築する方法。 PHPタイムタイムスクリプトを実行するためにコンテナを構成する方法 Jul 25, 2025 pm 07:27 PM

独立したPHPタスクコンテナ環境の構築は、Dockerを通じて実装できます。特定の手順は次のとおりです。1。基礎としてDockerとDockerMomposeをインストールします。 2。DockerFileおよびCrontabファイルを保存するための独立したディレクトリを作成します。 3. dockerfileを書き込み、phpcli環境を定義し、cronと必要な拡張機能をインストールします。 4.タイミングタスクを定義するためにCrontabファイルを書きます。 5。Docker-Compose.ymlマウントスクリプトディレクトリを作成し、環境変数を構成します。 6.コンテナを起動し、ログを確認します。 Webコンテナでタイミングタスクを実行するのと比較して、独立したコンテナには、リソースの分離、純粋な環境、強力な安定性、容易な拡張の利点があります。ロギングとエラーキャプチャを確保するため

See all articles