Be myself :: 6. 유저모드 Task switching

달력

42024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

1 개요

유저모드의 Task switching 이 어떻게 일어나는지 살펴보고, 그를 위해 준비해야 할 것들이 무엇인지 알아보자. 여기서 주목할 점은, 태스크 스위칭에 따른 스택과 메모리의 변화가 어떻게 되는지 이다.

2 유저모드 태스크 스위칭

2-1 설정할 것

먼저 당연한 것이지만, 유저모드 세그먼트를 설정한다. GDT테이블에 DPL값3으로 등록하고, 디스크립터 셀렉터 번호도 RPL값 3으로 설정한다. 다음으로 콜게이트를 설정한다. 태스크 스위칭을 할 때, 콜게이트를 이용하여 할 것이기 때문이다.

2-2 커널->유저모드

먼저 또한 각 세그먼트들을 유저 데이터 셀렉터로 변경하고 esp도 유저모드가 쓸 esp로 변경한다. 그리고 여기서 우리는 하나의 트릭을 이용할 것이다. 앞 장에서 콜게이트가 호출 되었을 때 유저->커널과 커널->유저모드로 스택이 어떻게 변하는지 살펴 봤다. 우리는 커널->유저모드로 스택이 변해가는 과정을 이용할 것이다. 즉, 스택에 SS, ESP, CS, EIP, ES, EAX등을 PUSH하고 iret명령을 사용한다면, 자동적으로 레지스터 값들이 POP되면서 유저영역의 레지스터 들로 맞추어 져 모드 전환이 이루어 진다.

2-3 유저모드 멀티태스킹

유저모드에서 멀티태스킹이 어떻게 이루어 지는지 살펴보자. 유저모드에서 콜게이트나 트랩게이트를 이용하여 커널모드로 접근 했을 시 스택이 어떻게 변하는지 앞에서 살펴 보았다. 다시 한번 그림으로 파악해 보자.

이렇듯, 모드 전환이 이루어 지면 각종 레지스터의 값들이 자동적으로 스택에 PUSH된다. 이 점을 이용하여 FLAG값이나 DS값들 등 다른 값들도 PUSH한 후 별도로 마련해 놓은(TSS영역의 역할과 같다)메모리에 저장하고, 모두 저장하고 난 후 ESP값을 조절 한 후 새로 실행할 프로세스의 레지스터 저장 영역에서 값을 PUSH하여 콜게이트 핸들러의 수행명령이 끝난 후 iret명령으로 인하여 레지스터 들은 새로 실행할 프로세스의 레지스터로 세팅되고 결과적으로 컨텍스트 스위칭이 일어난 것이 되었다.

'컴퓨터구조&OS > OS' 카테고리의 다른 글

7. 페이징  (0) 2014.05.05
5. 보호  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
2. Protected 모드로의 전환  (0) 2014.05.05
Posted by flack3r
|