私はlinuxのメモリ管理の実装について読んでいました。メモリセグメンテーションについて知りたかったので、メモリがどのように保護されているかを知ろうとしていました。私は今、straceのユーザスペースにないアドレスの値を印刷しようとすると、SIGSEGVフォルトがどのように働くか
write(1, "value is - 1937059584\n", 22value is - 1937059584
) = 22
write(1, "value is - 1768042354\n", 22value is - 1768042354
) = 22
write(1, "value is - 1701326702\n", 22value is - 1701326702
) = 22
write(1, "value is - 7302252\n", 19value is - 7302252
) = 19
write(1, "value is - 0\n", 13value is - 0
) = 13
write(1, "value is - 0\n", 13value is - 0
) = 13
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x7ffec6ddd000} ---
+++ killed by SIGSEGV +++
Segmentation fault
を使用して、以下のような出力を提供します
void main()
{
int a=10;
for(int i=0;i<5000;i++)
{
printf("value is - %d",*(&a+i));
printf("\n");
}
}
以下のようにセグメンテーションフォールトを作成するためのプログラムを作成し、私は、writeシステムコールが内部的に基づいて、メモリのアクセスをチェックする方法を知りたいです提供されたポインタ、およびSIGSEGVがwriteシステムコールからどのように処理されるかを示します。
システムコールはそれとはまったく関係ありません。 – user2357112
メモリ保護は、最新のプロセッサアーキテクチャの一部です。所有されていないメモリにアクセスしようとすると「ハードウェア障害」が発生し、OSは単に「ハードウェア障害」を処理します –