2016-06-28 4 views
0

알다시피 ARM에는 splr과 같은 일부 뱅크 된 레지스터가 있습니다. IRQ 모드 ( lr_usr 및 ) sp_usr이 보이지 않는 상태 즉, 즉, sp_irq 미행된다. 그래서, 내 질문은 인터럽트 처리기를 저장하는 방법입니다 sp_usr. 어떤 사람들은 sp_usr이 인터럽트 처리 중에 자동으로 변경되지 않으므로 irq 모드에서는 보이지 않고 액세스 할 수 없으므로 불필요하다고 생각할 수도 있습니다. 그러나 이것이 항상 그런 것은 아닙니다. 다음 시나리오를 고려하십시오.ARM에서 사용자 모드로 실행중인 스레드가 인터럽트 된 경우 sp_usr 레지스터를 저장하는 방법

a) 스레드 A가 사용자 공간에서 실행 중입니다.

b) 외부 인터럽트가 발생합니다.

c) 핸들러가 실행되어 더 높은 우선 순위를 가진 스레드 B가 현재 대기중인 자원을 가지고 있으므로 재 스케줄을 결정합니다.

d)는 스레드 A의 콘텍스트가 이제 B는 다시 사용자 모드, SVC 모드로 먼저 실행 스레드 저장한다. 이 sp_usr의 값이

전자) 스레드 B가 같은 것을 호출 스레드 B에 의해 무시되는 순간은입니다. 스레드 A는 인터럽트 된 지점부터 실행을 재개합니다.

따라서 스레드 A가 인터럽트되었을 때 sp_usr이 저장되지 않은 경우 스레드 A는 컨텍스트를 어떻게 복원합니까?

+0

분명히 SP & LR을 저장하고 나중에 복원해야합니다. CPU가 사용자 또는 시스템 모드에있을 때 저장해야합니다. –

+0

보고있는 ARM 아키텍처 버전을 분명히해야합니다. 이는 대답의 세부 사항에 영향을 줄 수 있습니다. –

+0

@Sean Houlihane ARMv7 Cortex-A9를 사용하고 있습니다. – xiaokaoy

답변

1

sp_usr은 스레드 B로 컨텍스트 전환하기 전에 저장해야하며 스레드 B가 절전 모드로 전환되고 스레드 A의 컨텍스트가 복원 될 때 저장해야합니다. 스레드 A에 대한 sp_usr이 저장되지 않으면 손실됩니다. 일반적으로 컨텍스트 스위치에서 현재 sp는 현재 작업 제어 블록에 저장됩니다. 새 작업이 선택되면 sp가 새 작업 제어 블록에서 복원됩니다. 아키텍처를 사용하는 팔 된 ARM. Access user R13 and R14 from Supervisor mode

이의 많은 의존 않습니다

이 스레드를 참조하십시오!