참고 : http://recipes.egloos.com/4985227
이번 시간에 공부한 7가지 프로세서 모드에 대한 설명이 알기 쉽게 잘 나와 있습니다.
원채 유명한 블로그라 다들 한번씩은 들어가 보셨을거에요. ㅋ
블로그 맨 아래 링크도 추가로 들어가보세요.
Supervisor 모드는 보통 OS에서 시스템 콜을 구현하기 위한 모드라고 합니다.
System 모드는 잘 이해가 안가네요.
댓글 7
-
김태훈
2011.06.08 20:30
-
이종인
2011.06.10 21:38
뚱단지 같은 질문일 수 도 있지만,
system mode를 사용하지 않는 다면 왜 아키텍처 설계자들이 그런 mode를 추가 한걸까요;;
아키텍처 설계자들은 그저 OS나 미들웨어 개발자들이 사용할만 한 다양한 mode를 제공하고,
그 mode들을 사용하는 것은 개발자 마음인가요?..
그렇다면, 아키텍처를 설계할 때 운영체제가 어떤식으로 동작 할 것이다 라는 것을 이미 운영체제 개발자와 암묵적인 합의하에 (아키텍처를)개발 하는 건가요?
또, 어떤 운영체제에 최적화된 아키텍처가 존재하는 지도 궁금하네요 ㅎㅎ
-
홍문화
2011.06.08 21:17
와우~ 커널 개발 중이신가보네요.
컨텍스트 스위칭 이해하기도 힘든데 구현을 하시나보네요.
저희는 소스 분석 할 때 컨텍스트 스위칭을 제대로 이해 할지나 모르겠네요. ㅋ
답변 감사합니다.
-
정현철
2011.06.11 01:39
휴... ARM 문서 뒤지다가 찾았는데 나름 정리해 볼라고 적어봅니다.
프로세서 익셉션이 일어 났을때, 현재 PC값은 LR에 복사가 되고, CPSR은 SPSR로 복사가 됩니다. 그 후에 CPSR은 어떤 익셉션이냐에 따라서 변할 것이고, PC도 익셉션 핸들러를 돌리기 위해 익셉션에 맞게 정의된 주소로 바뀝니다.
그후, ARM의 서브루틴 콜(BL)은 서브루틴으로 뛰기 전에 r14에 리턴할 주소를, PC값을 바꾸기 전에 복사해놓고, 서브루틴에서 돌아올때는 PC에 r14값을 넘겨줍니다. 그러므로 지금 일어난 익셉션을 핸들하고 있는 현 ARM 모드는 같은 종류의 익셉션이 일어낳지 않도록 해야 합니다.(안 그러면 서브루틴 리턴 주소가 익셉션 리턴 주소로 덮어씌어질테니까요)
ARMv4이전까지는 익셉션 코드에서 서브루틴콜을 피하거나 권한모드에서 유저모드로 들어가서 처리했는데, 전자는 너무 제한적이고, 후자는 태스크가 필요한 권한을 가지지 못할 수도 있다는 문제가 있습니다. 그래서 ARM v4 이후에서는 시스템 모드라는 걸 지원해서 이러한 문제를 해결했습니다. 시스템 모드는, 유저모드에 있는 레지스터를 공유할 수 있는 권한모드이기 때문입니다.
비슷한 얘기지만 인터럽트 핸들러를 재진입시에도 시스템 모드를 사용해서 문제를 해결 할 수 있습니다. ARV v4이전까지는 Supervisor 모드로 들어가야 했습니다.
-
홍문화
2011.06.13 00:57
간단히 말씀 드리면 인터럽트가 발생되어 lr_irq = pc 가 실행되고 인터럽트 핸들러가 호출 되면서
지속적으로 서브루틴이 호출 될 경우에 lr_irq(유저모드로 복귀 할 주소)는 sp_irq에 저장이 되고
서브루틴에서의 복귀주소가 lr_irq에 들어가게 되지 않나 하는것입니다. 이렇게 처리가 되면
lr_irq(유저모드로 복귀 할 주소)가 깨지지 않기 때문에 시스템 모드로 들어가서 뭔가를 한다던가
할 필요가 없지 않나 하는것입니다.
이번 스터디 시간에 공부한 내용에 중첩 인터럽트 처리에 대한 내용을 공부 했는데 인터럽트가 중첩 될 경우
lr_irq가 깨지기 때문에 프로세서 모드를 System이나 SVC로 바꾸고 스택 프레임을 복사한다는 내용이
나왔는데 앞부분을 건너뛰는 바람에 아직 제대로 이해를 못했습니다. ㅋ
이 부분을 제대로 이해하게 되면 정현철님이 올리신 글의 내용을 이해하게 되지 않을까 생각합니다. ^^;
-
김태훈
2011.06.11 17:45
유저 모드에서 인터럽트 발생시 인터럽트 처리 후에 복귀 할 주소는 IRQ 모드의 lr 값에 저장 됩니다.(lr_irq = pc)
유저 모드에서 사용하고 있던 lr 값(lr_usr)은 저장했다가 인터럽트 처리가 끝나고 복원해 주어야 하죠.
-
홍문화
2011.06.11 13:54
스터디 하려고 준비하다가 글을 보게 되었습니다.
"안 그러면 서브루틴 리턴 주소가 익셉션 리턴 주소로 덮어씌어질테니까요" 이 부분이 이해가 좀 안되네요.
예를 들어 유저모드에서 실행 중에 인터럽트가 발생합니다. 말씀하신대로 현재 PC값은 LR에 복사가 되고,
CPSR은 SPSR로 복사가 됩니다. CPSR이 변경 됨과 함께 유저모드에서 IRQ(인터럽트)모드로 변경이 될것입니다.
PC값은 익셉션 벡터 테이블을 거쳐서 인터럽트 핸들러를 호출하게 될텐데 이 과정에서 서브루틴 콜이 지속적으로
발생하게 될것입니다. 이때 LR(r14)의 처리가 어떻게 되느냐가 문제인데 최초 모드 변환 시 LR이 가지고
있는 주소는 유저모드로 복귀할 주소 였습니다. 이상태에서 서브루틴이 호출 되면 LR은 서브루틴에서 복귀할
주소로 바뀌어야 할 것입니다. 그렇다면 유저모드로 돌아갈 주소는 어딘가에 저장이 되어야 할텐데 그 주소가
SP(r13)이 가리키는 주소가 되어야 하지 않나 생각합니다. 이러한 방식으로 생각 한다면 인터럽트가 중첩된다고
해서 유저모드로의 복귀 주소가 사라지지 않을것입니다.
스터디 시간에 얘기 할까 하다가 좀 더 많은 사람들이 생각을 같이 할 수 있지 않을까 하는 바람에 답글을 달아봅니다.
.
제 생각에는 system mode와 SVC mode는 같은 용도로 사용 할 것 같습니다. 현재 개발 중인 커널에도 SVC mode만 사용하고 system mode는 사용하지 않습니다.
ps. 요즘 user mode context switch 디버깅 때문에 죽을 맛입니다. kerenl thread와 user process를 동일한 매커니즘으로 context switch하는데, kerenl mode context switch는 잘되고, kernel task + user process가 한개일때까지는 잘되는데 2개 이상이 되면 한참 돌다가 뻗어버리네요.