1

我正在阅读有关分段错误的维基百科,并通过以下代码和语句来阅读。

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

当包含此代码的程序被编译时,字符串“hello world”被放置在程序可执行文件中标记为只读的部分;加载时,操作系统会将其与其他字符串和常量数据一起放在内存的只读段中。执行时,变量 s 被设置为指向字符串的位置,并尝试通过变量将 H 字符写入内存,从而导致分段错误。使用在编译时不检查只读位置分配的编译器编译这样的程序。

我的问题是关于文件权限,即当可执行文件标记为只读时以及何时读写等等?

我想了解有关文件权限的所有信息。我们可以明确更改文件权限吗?

4

2 回答 2

5

“hello world”存储在内存的只读部分中。写入可执行文件内存的给定部分的能力与写入磁盘上的可执行文件的能力无关。

于 2012-04-26T03:21:44.353 回答
2

您在这个问题中讨论了 3 个不相关的概念:

  • 文件属性(某些操作系统支持,例如 Windows)- 其中之一是只读的。管理文件的正常打开方式,具有修改文件权限的用户可以随意更改文件属性。
  • 文件权限(大多数操作系统支持)。如果给定的用户有权访问/修改,并且在某些系统中执行该文件。
  • 内存页上的内存保护属性。大多数实现虚拟内存的操作系统都支持。内存的每个页面(即 4Kb 块)都有一组属性(即读、写、执行),这些属性由操作系统的内存管理部分与 CPU 一起设置和执行。大多数现代 CPU 直接使用此页面属性来验证内存操作。

即在Windows 上,您可以使用VirtualProtect函数来指定给定在程序地址空间中分配的内存块应该具有的属性。

于 2012-04-26T03:43:46.203 回答