2012-04-26 6 views
1

私はセグメンテーションフォルトでウィキペディアを読んでいました。読み取り専用とマークされたプログラム実行可能ファイル

int main(void) 
{ 
    char *s = "hello world"; 
    *s = 'H'; 
} 

このコードを含むプログラムをコンパイルすると、文字列は「ハロー 世界は、」プログラムの実行可能ファイルのセクションに配置され、読み取り専用として をマーク。ロードされると、オペレーティングシステムは、他の 文字列と定数データをメモリの読み取り専用セグメントに配置します。 が実行されると、変数sが文字列の場所を指すように設定され、 変数を介してメモリに にH文字を書き込もうとすると、セグメント化エラーが発生します。このようなプログラムを にコンパイルすると、コンパイル時に読み取り専用の の場所の割り当てがチェックされません。

私の質問はファイルのアクセス許可にあります。つまり、実行可能ファイルが読み取り専用で、読み書き時に などと書かれていますか?

私はファイルのアクセス許可についてすべて知りたいと思います。ファイルのアクセス許可を明示的に変更できますか?

+0

ファイルと言うと、ここにスタックするのですか? – noMAD

+2

実行中のプログラム内のファイルアクセス許可とメモリアクセス許可は関連していません。実行可能プログラムを書き込み可能としてマークしても、そのテキストページは読み書き可能にマッピングされません。反対に、それを読み取り専用にマークしても、データページが予期せずに読み取り専用になることはありません。 – geekosaur

+0

ファイル権限がどのように関連しているのかよく分かりません.Wikiの記事ではメモリ*のページのパーミッションを参照しています。 POSIXシステムの 'mprotect() 'のように、システム特有の方法でページパーミッションを変更することができます。 – FatalError

答えて

5

「hello world」は、メモリの読み取り専用セクションに格納されます。実行可能ファイルのメモリの特定の部分に書き込む機能は、ディスク上の実行可能ファイルに書き込む機能とは関係ありません。

+0

はすべてメモリの読み取り専用セクションに格納されている実行可能ファイルですか? – IndieProgrammer

+0

実行可能ファイルのメモリのすべてが読み取り専用ではありません。たとえば、 'i = 0; i = 2 'であれば、「i」は読み書き可能メモリに格納されます(コンパイラがそれを1つの割り当てに最適化しないと仮定します)。 – Venge

+0

@IndieProgrammerデフォルトでは、yesです。これは、実行可能ファイル内のロード可能なセグメントの属性です。デフォルトのテキスト(=コード)セグメントは読み取り専用とマークされますが、これを上書きすることができます。読み取り専用セグメントの利点は、不正なコードからの保護だけでなく、実行中の複数のインスタンスのメモリイメージ間での共有が容易になることです。 – geekosaur

2

あなたはこの質問に話している3つの無関係な概念があります(一部のOSでサポートされている、つまりWindowsの場合)

  • ファイル属性は - そのうちの一つは読み取り専用です。通常のファイルのオープン方法を管理します。ファイルを変更する権限を持つユーザーは、自由にファイルの属性を変更できます。
  • (ほとんどのOSでサポートされている)ファイルのアクセス許可。指定されたユーザーがアクセスまたは変更する権限を持っていて、一部のシステムでファイルを実行している場合
  • メモリのページ上のメモリ保護属性。仮想メモリを実装するほとんどのOSでサポートされています。メモリの各ページ(すなわち、4Kbブロック)は、CPUと共にOSのメモリ管理部分によって設定され強制される属性のセット(すなわち、読み出し、書き込み、実行)を取得する。最新のCPUのほとんどは、このページ属性を使用してメモリ操作を検証します。

e.e.e. Windowsでは、VirtualProtect関数を使用して、プログラムのアドレス空間に割り当てられたメモリブロックに与えられる属性を指定することができます。

関連する問題