이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.
메모리라고 하는것에 대해서 어느 한 단위가 있는데 크기가 1byte가 되는 것이고 이 1byte마다 메모리 주소가 붙는데 이 주소가 64bit 체계이면 64bit system, 32bit체계이면 32bit system이라고 불린다. 근데 이것이 Application 수준에도 적용된다.
중요한 것은 RAM에는 하드웨어 수준에 부여된 주소체계가 있고 Application Process수준에 부여된 주소체계가 있는데 이 둘이 조금 다르다. 즉 이 둘의 차이가 있는데 애네 둘이 서로 다른 번호를 쓰게 되는데 왜냐하면 이 둘은 가상메모리 체계를 쓰기 때문에 이 두 주소는 일치하지 않는다. 그래서 메모리의 어떤 주소를 애기할때는 2가지 기준으로 간다. 절대주소와 상대주소로 가는데 쉽게 생각해서 배열을 생각하면 된다. 어떤 배열이 있으면 배열의 이름이 주소인데 이 주소를 가지고 어느 특정 메모리를 식별이 가능하다.
상대주소는 배열의 인덱스 연산(인덱싱)해서 특정 메모리를 찾는게 그것이 상대주소이다. 예를 들어 어떤 PC 메모리 주소가 0부터 999까지 있다고 했을 때 0~360까지 OS가 쓰고 이 영역은 다른 프로세스들이 절대 침범할 수 없는 영역이다. 또한 사용자 영역이 쓸 수 있는 메모리 공간이 360~999까지 있다고 가정했을 때 이 중 어딘가를 어느 프로세스가 쓰고 있는데 이 메모리 주소가 400이라고 가정했을때 0번지부터 400번째 떨어진곳 이것이 절대주소이고 사용자영역 360부터 40만큼 떨어진곳이라고 표현하는것은 상대주소이다. 즉, 상대주소는 논리적 메모리 주소이고 논리적은 가상이기 때문에 가상메모리에서 상대주소 애기가 나오는 것이다.
가상메모리 체계에서 RAM메모리의 0~3번지까지 OS가 사용한다고 가정해보자. 근데 Process1의 VMS에 0번지가 실제 RAM 7번지와 매핑되었다고 했을 때 절대주소는 7이되는 것이고 상대주소는 0이되는 것이다. 그리고 Process1이 종료되면 Process1이 쓰는 공간을 OS가 회수한다.
그러면 한번 코드로 알아보자.
여기서 g_data 전역변수와 a,b,c 지역변수가 존재하는데 디스어셈블리를 해보면 g_data는 절대주소를 사용하고 a,b,c는 상대주소를 사용한다.