Unix V6 함수 리턴과 스위칭 1


Unix v6 함수 리턴과 스위칭에 대해 한번 알아 보겠습니다.


저번 게시물에서 마지막에 스위칭에 대한 힌트를 마지막에 올렸습니다.


아래와 같았고 B함수에서 리턴(return) 되면 과연 어디로 리턴될 것인가를 묻고 끝냈었습니다.




그럼 오늘은 풀이를 한번 해보겠습니다.



1. 이상한 함수 리턴 문제 풀이 1

먼저 A() 함수에서  B() 함수를 호출하는 코드와 스택 구조를 한번 봐보겠습니다.





만약 위 그림이 이해 되지 않는다면 다시 첫 게시물부터 다시 보세요.

먼저 A() 함수 11라인을 보겠습니다.


여기서 r5 는 R5레지스터 라고 가정하겠습니다.

r5는 A함수 프레임 첫 스택 주소인 96를 가지고 있습니다.

s_r5 = r5(96) --> s_r5 = 96  : savu 함수와 비슷한 기능을 합니다.

R5 = 96

R6 = 94

R7 = 11 라인



2. 이상한 함수 리턴 문제 풀이 2


이제 A()함수에서 B()함수를 호출하고 17라인일때의 그림은 아래와 같습니다.




스택에 리턴 주소인 A() 함수 12라인과  A()함수 프레임 주소 96이 저장되어 있습니다.

R5 = 92

R6 = 92

R7 = B() 함수 17 line



3. 이상한 함수 리턴 문제 풀이 3



여기서 r5 = s_r5(96) 가 나옵니다.

그러면 r5 = 96 이 됩니다.


R5 = s_rt(96) -->R5 = 96  : unix v6의 retu 와 비슷한 기능을 합니다.

R6 = 92

R7 = B()함수 17 line




4. 이상한 함수 리턴 문제 풀이 4



그러면  B() 함수 18라인에서 return이 나오면 어떻게 될까요?

원래대로라면 A()함수 13라인으로 가야 맞겠지요..


하지만 위에서 R5 가 96(A함수 프레임)으로 바뀌었습니다.


이전 게시물에서 리턴을 한다면

1. 스택 포인터 R6에 R5를 넣고

2. R7(프로그램 카운터)에 리턴 어드레스(R6 기준)를 넣는다고 했습니다.


그럼 한번 그대로 한번 해보겠습니다.




5. 이상한 함수 리턴 문제 풀이  5




일단 R5에 스택에 저장되어 있는 main()함수  프레임 주소를 가져옵니다.

그리고 스택에서 R7에 리턴 주소인 main() 함수 6라인 값을 가져옵니다.

R6는 각각 1씩 줄어 98이 됩니다.


R5 = 100  --> 스택(주소 97)에서 main() 프레임 주소 100가져옴 

R6 = 98

R7 = 6 line --> 스택(주소 98)에서 리턴 어드레스(main() 6라인)를 가져옴


18라인 B()함수에서  리턴을 했는데  main()함수 6라인으로 리턴되었습니다.



6. Unix v6 스위칭 힌트


이것이 바로 Unix V6 스위칭힌트입니다.

savu 함수가 함수 프레임을 저장하는 것이고

retu 함수가 함수 프레임을 복구 시키는 것입니다.


결국 savu 는 현재 실행되고 있는 함수 위치를 저장하는 것이고

retu는 이전에 실행 되고 있는 함수 위치를 복구 시키는 것입니다.

단지 여기서는 R5, R6만 복구 하고 있다는 것입니다.


R5는 함수 프레임 시작위치이고 R6는 스택 포인터입니다.

하지만 이상하게도 R7(프로그램 카운터)는 복구 되지 않습니다.


그러나 잘 생각해 보시면 R7(프로그램 카운터) 값은 스택에 리턴 어드레스 값이  저장 되어 있다

사실을 알아둘 필요가 있습니다.


함수 프레임과 스택 프레임을 복구 시키고

C 언어에서 return를 만나게 되면 스택에서 리턴어드레스가 R7에 복구 되면서

비로소 기존에 실행 했던 함수 코드로 반환 되어 다시 실행 됩니다.


위에서는 같은 프로세스 내에서 B() 함수 프레임 위치를 A() 함수 프레임 위치로 바꾸어서 했습니다.

하지만 retu는 같은 프로세스의 R5, R6를 바꾸는것이 아니라

다른 프로세스의 R5, R6를 바꾸는것입니다.


그러므로 다른 프로세스의 다른 함수로 복구 된다는 말이 됩니다.


다음 게시물은 Unix V6 스위칭에 대해 써보겠습니다.


+ Recent posts