본문 바로가기

Operating System/xv6

[xv6]Homework 1: boot xv6

Boot xv6


xv6 환경 세팅

호스트 OS Window 10 (64bit)
가상 머신 VMware Workstation 14
게스트 OS Ubuntu 14.04
컴파일러 Gcc version 4.4.7
게스트 OS의 가상머신 qemu version 2.1.2

 

xv6 프로젝트는 "make" 커맨드를 이용해서 빌드하고, "make qemu" 커맨드를 이용하여 부팅한다.

 

그림1. xv6 부팅 

 

Exercise : What is on the stack? (스택에 어떤 것이 있는가?)

스택 포인터는 bootasm.S에서 부트 로더의 시작 주소로 초기화된다.(그림 2) call bootmain 인스트럭션이 실행 되면 eip에 저장되어있는 다음 인스트럭션 주소가 스택에 저장되고 eip에는 bootmain 함수의 주소가 들어가면서 프로그램의 실행 흐름이 변경된다.

 

그림 2. bootasm.S line 65 – 처음으로 스택포인터가 초기화

bootmain 함수에서 부트 로더로 작업이 완료되면 kernel entry point로 이동한다. (그림 3)

 

그림 3. bootblock.asm line 386 – bootloader에서 kernel entry point로 점프하는 부분

그리고 kernel entry point에서 레지스터 설정 값은 그림 4와 같다. 현재 esp 및 ebp 레지스터는 각각 0x7bbc 및 0x7bf8이다. esp 레지스터 값이 ebp 레지스터 값보다 작기 때문에 이 스택은 descent stack이고 스택 영역의 범위는 0x7bf8 ~ 0x7bbc이다.

 

그림4. 0x0010000c 에서 레지스터 상태

그림 5kernel entry point에서 스택 영역을 출력한 것 이다. 0x7bfc 주소가 가리키는 0x00007c4d 값은 call bootmain 호출시 저장 했던 주소이다. 이 주소는 호출한 procedure가 끝난후 리턴 주소로 사용된다. 또한 0x7bbc 주소가 가리키는 0x00007dc2 값은 kernel entry point로 시작될 때 리턴 주소를 의미한다. 0x7dc2 값은 그림 3의 386행에서 확인할 수 있다. 그리고 서브 루틴을 호출 하면 현재 컨택스의 레지스터 값을 스택에 저장한다. 따라서 그림 5에서 스택에 있는 0인 값은 스택에 저장된 레지스터 값을 의미한다. 그리고 0x7bdc 주소의 값 0x00010074는 그림 4의 ebx 레지스터 값과 동일하다. 마지막으로 0x7c00 ~ 0x7dff 범위의 주소는 스택영역이 아니고 부트로더 instruction 이다.

 

그림 5. 스택영역의 값( gcc version 4.4.7)

※ 주의

gcc 버전 차이 따라 메모리 값의 구조가 다르게 나타난다. 이는 gcc 버전으로 생성 된 명령어 차이에 따라 실행흐름이 다르다고 추측 할 수 있지만 정확히 확인하지 않았다. 그림 6은 gcc 버전 4.8.4에서 그림 5와 같이 출력한 것 이다.

 

그림 6. 스택영역의 값 ( gcc version 4.8.4)

'Operating System > xv6' 카테고리의 다른 글

[xv6] introduce  (4) 2018.12.24