실습목표:
virtual address zero에서는 null pointer를 나타낸다. xv6에서는 null pointer dereference가 가능하다. 이를 방지하기 위해 null pointer 접근을 막도록 한다. 접근 시 trap이 발생하도록 Page Table의 첫 번째 페이지를 접근하지 못하도록 한다. 이를 위해 첫 번째 페이지 주소를 변경한다.
Null pointer dereference?
null pointer란 아무런 유효한 메모리 주소도 가리키지않는 포인터라고 보면된다.
일반적으로 Null Pointer는 주소 0을 의미하는데, 기본적으로 xv6에서는 아래 그림처럼 데이터가 주소 0에 위치한다.
하지만 보통의 운영체제는 주소0에는 어떠한 유효한 데이터도 위치하지 않도록 보호하는 영역이다.
프로그램이 null 포인터를 역참조하려고 시도하면, 운영체제는 이를 감지하고 해당 프로그램이 잘못된 메모리 접근을 시도했다고 판단하여 예외를 발생시킨다.
이번 기존의 메모리 구조에서 아래 사진처럼, 0번지의 주소공간을 비워두고, 다음 페이지인 0x1000부터 채우도록 메모리 구조를 변경하는것이다.
실습 :
핵심적인 수정사항은 아래와 같다.
1. Makefile 수정
-Ttext 0x1000:
이 옵션이 중요한데, 프로그램의 텍스트(코드) 섹션의 시작 주소를 기존의 0에서 0x1000으로 설정한다.
2. exec.c 에서의 수정
sz 변수를 페이지 크기(PGSIZE)로 초기화하여 프로그램을 메모리에 로드할 때 최소한 한 페이지의 크기만큼 메모리 공간을 예약하거나 할당.
3. vm.c 함수에서의 수정
copyuvm 함수는 child process에 parent process의 page table copy를 해준다. 이때, i = 0이 아니라 다음 페이지부터 pte 복제를 위해 PGSIZE를 넣는다.
실습 결과:
test_null 는 첫 번째 주소를 참조해 NULLpointer를 역참조하여 출력하는 코드이다. xv6 운영체제에서 테스트 실행 시 trap14가 발생하여 원래 설계대로 nullpointer dereference가 실패하는 것을 확인할 수 있다. trap 14 는 page fault를 나타내는 trap이다.
'운영체제 > xv6 실습' 카테고리의 다른 글
[xv6] 실습3: thread (0) | 2024.08.15 |
---|---|
[xv6] 실습1 : Lottery scheduler 설계 (0) | 2024.08.14 |
[xv6] xv6란? (0) | 2024.08.14 |