【问题标题】:A problem about the code example in OSTEP关于OSTEP中代码示例的问题
【发布时间】:2020-08-03 19:10:28
【问题描述】:

在OSTEP(Operating Systems: Three Easy Pieces)中,作者提供了一个简单的c程序代码来展示OS如何虚拟化它的内存

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

int
main(int argc, char *argv[])
{
        int *p = malloc(sizeof(int));
        //assert(p != NULL);
        printf("(%d) address pointed to by p: %p\n",    getpid(), p);
        *p = 0;
        while (1) {
                sleep(1);
                *p = *p + 1;
                printf("(%d) p: %d\n", getpid(), *p);
        }
        return 0;
}

这本书说,由于虚拟化过程,结果应该是:

提示> ./mem &; ./mem &

[1]24113

[2]24114

(24113) p 指向的地址: 0x200000 (24114) 地址指向 (24114) p指向的地址:0x200000

(24113) p: 1

(24114) p: 1

(24114) p: 2

(24113) p: 2

(24113) p: 3

(24114) p: 3

(24113) p: 4

(24114) p: 4

作者解释了为什么会这样:

现在,我们再次运行同一个程序的多个实例,看看会发生什么 发生(图 2.4)。我们从示例中看到,每次运行 程序已在同一地址(0x200000)分配内存,但 每个似乎都在独立更新 0x200000 的值!它是 好像每个正在运行的程序都有自己的私有内存,而不是 与其他正在运行的程序共享相同的物理内存 5 .

... 但在我的电脑(ubuntu)中,结果是:

这让我感到很困惑......

【问题讨论】:

    标签: memory memory-management operating-system shared-memory


    【解决方案1】:

    为了阻止恶意软件,ubuntu 被配置为以伪随机地址加载程序;因此,当您的程序加载到内存中时,操作系统会选择一些基地址,然后加载相对于该地址的程序。这被广泛称为地址空间布局随机化 (ASLR)。

    有一个内核选项:/proc/sys/kernel/randomize_va_space,您可以将其设置为零以禁用此功能。请注意,如果这提供了任何安全性,那么通过禁用它,您将失去该安全性功能。 作为根:

    $ oldval = $(cat /proc/sys/kernel/randomize_va_space)
    $ echo 0 >> /proc/sys/kernel/randomize_va_space 
    

    然后,在您以非 root 用户身份运行示例后,返回此会话并:

    $ echo "$oldval" >> /proc/sys/kernel/randomize_va_space 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多