1

私はセグメンテーション違反に関するウィキペディアを読んでいて、次のコードとステートメントを通り抜けました。

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

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

私の質問は、ファイルのパーミッション、つまり、実行可能ファイルが読み取り専用としてマークされている場合、および読み取りと書き込みの場合などです。

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

4

2 に答える 2

5

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

于 2012-04-26T03:21:44.353 に答える
2

この質問で話している3つの無関係な概念があります:

  • ファイル属性(一部のOS、つまりWindowsでサポートされています)-そのうちの1つは読み取り専用です。ファイルが通常どのように開かれるかを管理します。ファイルを変更する権限を持つユーザーは、ファイル属性を自由に変更できます。
  • ファイルのアクセス許可(ほとんどのOSでサポートされています)。与えられたユーザーがアクセス/変更する権限を持っている場合、一部のシステムではファイルを実行します。
  • メモリのページのメモリ保護属性。仮想メモリを実装するほとんどのOSでサポートされています。メモリの各ページ(つまり、4Kbブロック)は、CPUとともにOSのメモリ管理部分によって設定および適用される属性のセット(つまり、読み取り、書き込み、実行)を取得します。最近のほとんどのCPUは、このページ属性を直接使用してメモリ操作を検証します。

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

于 2012-04-26T03:43:46.203 に答える