Проблема с примером кода в OSTEP - PullRequest
0 голосов
/ 21 апреля 2020

В OSTEP (Операционные системы: три простых компонента) автор предлагает простой программный код c, чтобы показать, как ОС виртуализирует свою память

#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) стр: 2

(24113) стр: 3

(24114) стр: 3

(24113) стр: 4

(24114) p: 4

автор объясняет, почему это происходит:

Теперь мы снова запускаем несколько экземпляров этой же программы, чтобы посмотреть, что происходит (рисунок 2.4). Из примера видно, что каждая запущенная программа выделяет память по одному и тому же адресу (0x200000), и, тем не менее, каждая из них обновляет значение по адресу 0x200000 независимо! Как будто каждая запущенная программа имеет свою собственную личную память вместо того, чтобы делить ту же физическую память с другими запущенными программами 5.

... но на моем компьютере (ubuntu) результат таков:

enter image description here

это меня очень смущает ...

1 Ответ

0 голосов
/ 21 апреля 2020

В попытке сорвать вредоносное ПО, ubuntu настроен на загрузку программ по псевдослучайным адресам; поэтому, когда ваша программа загружается в память, ОС выбирает некоторый базовый адрес, а затем загружает программу относительно этого. Это широко известно как рандомизация расположения адресного пространства (ASLR).

Существует параметр ядра: / proc / sys / kernel / randomize_va_space, который можно установить равным нулю, чтобы отключить эту функцию. Обратите внимание, что если это обеспечивает какую-либо безопасность, отключив ее, вы теряете эту функцию безопасности. как root:

$ 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 
...