[운영체제] 가상 메모리 접근 권한

Robert.Yang·2023년 4월 16일
1

OS

목록 보기
21/22
post-thumbnail

이 포스트는 널널한 개발자님의 강의를 듣고 작성한 글입니다.

가상메모리 접근 권한

메모리 접근권한으로 R/W/X가 있다. VMS는 특별한 이유가 없다면 32bit application이라면 4GB용량의 32bit 메모리를 갖는다. 그렇다면 메모리 파티셔닝을 앞에 user-mode, 뒤에 kernel영역으로 각각 2GB씩 갖는다. 결국 우리가 흔히 VMS라고 하면 user-mode영역이라고 보면 된다. 여기서부터 0번지부터 일정구간은 OS가 쓰게되어 있다. 그래서 VMS에서 쓸 수 있는 공간은 대략 1.8GB정도이다. 그래서 이 공간안에는 코드영역도 있고 데이터영역도 있다.

메모리 영역은 크게보면 데이터 영역과 실행코드가 들어가져 있는 코드영역으로 볼 수 있는데 여기서 데이터 영역은 Stack, Heap, 정적공간으로 나눠지는데 이 정적 영역중에서 R/W가 되는 영역이 있고 R만되는 영역이 있다. 흔히 Stack과 Heap은 특별한 이유가 없다면 R/W권한을 가진다. 근데 여기서 X권한은 없는데 여기서 주목해야한다.

코드영역은 R/X권한이 있는데 이 영역으로 정적영역에서 R/W권한이 있는 전역변수같은것은 제외하고 R권한만 있는 실행코드로 섞여들어간다. 왜냐하면 이 R만되는 영역에는 문자열 상수가 들어가는데 이것들이 코드영역으로 들어간다. 예로 hello-world 콘솔 어플리케이션을 생각할때 이 문자열은 코드영역으로 들어가고 나중에 메모리를 잡힐때 정적영역 R에 잡힌다.

페이지 테이블을 자세히 보면 3개의 bit로 구성된 권한비트가 있는데 R/W/X기능만 쓰기때문에 3개의 bit로만 잡힌다. 그래서 우리가 linux 명령어중 chmod라는 권한변경 명령어가 있는데 사용예시를 보면 3개의 bit로 조절한다는 걸 알수 있다.

권한비트는 페이지 테이블에만 속하고 세그먼트 테이블에는 속하지 않는다.

어떤 메모리를 접근할 때 R/W/X 권한이 있는데 예를 들어 이 메모리에 실행코드가 있다고 하면 이 권한들은 가상함수를 통해 제어하거나 변경이 가능하다. 무슨말이냐면 실행코드 권한은 기본적으로 R/X인데 굳이 Write권한을 넣으려고 하면 넣을 수 있다. chmod로 변경하는것처럼 말이다. 근데 데이터영역에서 x권한을 넣으면 이게 보안사고로 이루어질 수 있어서 OS가 DEP라는 것을 제공하여 데이터 영역에 실행코드를 넣는걸 막아둔다.

profile
모든 것을 즐길 줄 아는 개발자, 양성빈입니다.

0개의 댓글