2017-02-15 4 views
0

私は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システムコールからどのように処理されるかを示します。

+0

システムコールはそれとはまったく関係ありません。 – user2357112

+0

メモリ保護は、最新のプロセッサアーキテクチャの一部です。所有されていないメモリにアクセスしようとすると「ハードウェア障害」が発生し、OSは単に「ハードウェア障害」を処理します –

答えて

1

ここで、書込みシステムコールが、与えられたポインタに基づいてメモリのアクセスを内部的にチェックする方法と、SIGSEGVが書込みシステムコールからどのように処理されるかを知りたいと思います。

これはありません。

不良メモリアクセスは、コードの断片では、あなたのmain機能で起こっている:

*(&a+i) 

このコードprintfが全く呼び出される前に評価され、それがwriteを呼び出す終わるずっと前にされています。

writeに無効なポインタが渡された場合、エラーEFAULTが返されます。クラッシュしません。 SIGSEGVは、プロセス内で実行されているコードが不正なメモリアクセスを実行している場合にのみ生成されます。

+0

それは実際に評価されたアドレスのアクセスをどのようにチェックしますか?私はSIGSEGVがMMU自体から投げられたと聞きましたが、裏で何が起こりますか? –

+0

@PiyushAroraこれはCPUによって処理されます。それは悪いメモリアクセスの例外を発生させ、カーネルはそれを信号に変換します。システムコールは全く画像には入りません。 – duskwuff

関連する問題