问题描述
当我们学习OS的时候,往往需要接触到虚拟地址分配的相关知识。当接触到《Operating Systems: Three Easy Pieces》(Operating Systems: Three Easy Pieces)
中的示例程序mem.c时(文末附上common.h)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "usage: mem <value>\n");
exit(1);
}
int *p;
p = malloc(sizeof(int));
assert(p != NULL);
printf("(%d) addr pointed to by p: %p\n", (int) getpid(), p);
*p = atoi(argv[1]); // assign value to addr stored in p
while (1) {
Spin(1);
*p = *p + 1;
printf("(%d) value of p: %d\n", getpid(), *p);
}
return 0;
}
当输入执行
./mem 1 & ./mem 2 &
时,却发现和书中的“两者在相同的地址分配内存的说法不同”。显示出
(6832) addr pointed to by p: 0x55796cae82a0
(6833) addr pointed to by p: 0x55ad109c42a0
最终查阅资料发现,这是因为现在在 Linux 系统中,地址空间随机化(ASLR,Address Space Layout Randomization)是一种安全特性,它通过随机化进程地址空间中的关键区域(如堆、栈和共享库)的位置来增加对缓冲区溢出攻击的抵抗力。然而,在当前情况下,我们需要禁用 ASLR来减少我们学习的痛苦。。。
问题解决
禁用ASLR(仅仅建议在非生产环境中):
sudo sysctl -w kernel.randomize_va_space=0
重启ASLR
sudo sysctl -w kernel.randomize_va_space=1
最后
附上common.h
#ifndef __common_h__
#define __common_h__
#include <sys/time.h>
#include <sys/stat.h>
#include <assert.h>
double GetTime() {
struct timeval t;
int rc = gettimeofday(&t, NULL);
assert(rc == 0);
return (double) t.tv_sec + (double) t.tv_usec/1e6;
}
void Spin(int howlong) {
double t = GetTime();
while ((GetTime() - t) < (double) howlong)
; // do nothing in loop
}
#endif // __common_h__
Tips:
新手一枚,如果觉得有疑问可以私信询问!
如果上述文章内容有讲得不正确或者不清楚的地方,欢迎留言评论区或者私信!
最后,能给我一个小小的赞或者关注吗
标签:__,addr,int,禁用,double,随机化,common,Linux,include From: https://blog.csdn.net/2301_79273066/article/details/143316438