操作系統內存虛擬化實驗現象

代碼mem.c:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main(){
int *p=malloc(sizeof(int));
printf("(%d) memory address of p: %08x\n", getpid(), p);
*p=0;
while(1){
sleep(1);
(*p)++;
printf("(%d) p: %d\n", getpid(), *p);
}
}
編譯: gcc -o mem mem.c

#關閉地址隨機化,從現象上觀察兩個進程分配給變量p的地址一樣
echo 0 >/proc/sys/kernel/randomize_va_space
[root@localhost operatingsystem]# ./mem & ./mem
[1] 35130
(35131) memory address of p: 00602010
(35130) memory address of p: 00602010
(35131) p: 1
(35130) p: 1
(35131) p: 2
(35130) p: 2
(35131) p: 3

#開啓地址隨機化,從現象上觀察兩個進程分配給變量p的地址不一致
echo 1 >/proc/sys/kernel/randomize_va_space
[root@localhost operatingsystem]# ./mem &./mem
[1] 24700
(24700) memory address of p: 019bd010
(24701) memory address of p: 00ee7010
(24700) p: 1
(24701) p: 1
(24700) p: 2
(24701) p: 2

結論:
操作系統內存虛擬化會爲每個進程分配內存空間,每個進程在自己的空間內進行尋址;從實驗看到的地址爲,進程內自己的地址,對於系統來看就是相對地址(偏移量)。
開啓內存隨機化後,進程爲變量分配的地址是隨機分配;隨機化分配可以很好地地址某些安全漏洞。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章