TrustZone Debugging시 유용한 기능
목차
1. Overview
ARMv6에서부터 Security를 위해 Security Extenstion을 제공하고 있습니다. 해당 Feature를 Implemention할경우 CPU는 Secure State와 Non-Secure State를 Physically 구분하여 code를 실행하게 됩니다. Secure State에서는 모든 Resource에 대한 Access권한을 가질 수 있으며 Non-Secure State에서는 Secure Area로 정의된 영역을 Access하는데 제한을 받게 됨을 통해 보안을 유지하도록 합니다. 아래 그림에서 보는 것처럼 Secrue State 변경은 TrustZone Monitor를 통해서만 허용하게 됩니다.
Debugging관점에서 볼 때 현재 MMU가 켜져 있을 경우 Secure와 Non-Secure Code는 각각 동일 Virtual Address에서 실행하는 환경이 있을 수 있으며 이런 경우 Secure와 Non-Secure에 대한 인지가 필수적으로 필요하게 됩니다. 즉 동일 Address에서 Secure/Non-Secure에 따라 다른 코드가 동작하게 될 것입니다. 따라서 개발자 의동에 따라 원하는 Secure State에서만 유효한 BreakPoint 설정이 가능하고 해당 State에 맞는 C/C++ Code를 찾아 개발자에게 보여줄 수 있어야 할 것입니다.
다음 장에서는 바로 이러한 환경에서 각 State에 따라 소스코드와 BreakPoint를 관리하는 TRACE32 명령들에 대한 내용을 살표보도록 하겠습니다.
자료출처: Extensions to the ARMv7-A Architecture from ARM
1.1. Secure/NonSecure/ Hyervisor(EL2) Breakpoint 설정
Processor 동작 모드에 따라 Breakpoint 설정이 가능합니다(2015년 1월~ 버전). 아래 그림은 같은 Address이지만 Secure와 NonScure에 따라 다른 BreakPoint가 설정되어 있는 것을 볼 수 있습니다.
또한 동일 Address이지만 Source code도 다른 code가 보이는 것을 볼 수 있습니다. 즉 동작 Mode에 따라 동일 Address에 다른 Application이 동작할 수 있고 Debugger는 이런 환경에서 구분하여 Debugging할 수 있느 환경을 제공해 주어야 합니다.
1.1.1. 동작 Mode(or Exception Level)에 따른 BreakPoint 설정
기본적으로 Breakpoint를 설정하면 동작모드에 상관없이 설정됩니다. 그러나 어떤 경우에는 특정 동작 Mode에서만 유효하도록 설정할 수 있습니다. 특히 Secure OS를 Debugging 한다거나 Hypervisor Mode debugging을 효율적으로 하고자 할 경우 필요하게 될 것입니다.
사용방법은
1) SYStem.Option.ZoneSPACES ON ; 동작 Mode를 구분하여 BreakPoint 관리
2) 의도하는 동작 모드에 대해 BreakPoint를 설정
Ex) Break.Set H:0x30E000 ; Hypervisor Mode(EL2) SoftBreakpoint(RAM 공간인 경우)
Break.Set N:0x202000 ; NonSecure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)
Break.Set Z:0x202004 ; Secure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)
Break.Set H:0x30E000 /Onchip ; Hypervisor(EL2) Mode Onchip Breakpoint
Break.Set N:0x202000 /Onchip ; NonSecure(EL1&EL0) World Onchip Breakpoint
Break.Set Z:0x202004 /Onchip ; Secure World(EL1&EL0) Onchip Breakpoint
Break.Set Z:0x300014 /Write ; Secure World(EL1&EL0) data write breakpoint
1.1.2. 동작 Mode(or Exception Level)에 따라 구분하여 Symbol 다운로드 하기
기본적으로 Symbol을 다운로드하면 동작 Mode(or EL)에 상관없이 Symbol을 로드 합니다. 따라서 Linux와 Secure OS가 동시에 동작하는 Application과 같은 개발환경에서 두 동작 Mode를 동시에 Debugging하기 원한다면 매우 불편한 상황을 접하게 될 것입니다. 즉, 어드레스는 같지만 Secure/Non-Secure World에 따라 다른 코드가 위치될 수 있기 때문에 필요시마다 해당 동작모드에 대한 Symbol을 로드하여 사용해야 할 것입니다. 따라서 TRACE32는 동작모드에 따라 동일 어드레스라 할지라도 다른 Symbol을 다운로드하는 기능이 있어 이러한 번거러움을 해결해 줍니다.(2014년 11월~ 버전)
방법은 다음과 같습니다.
1) SYStem.Option.ZoneSPACES ON ; 동작 Mode를 구분하여 Symbol 관리
2) 동작 Mode(Exception Level)에 따라 Symbol 로드
Ex) Data.LOAD.Elf HyperAppFileName.elf H: /nocode /noclear ; @HyperVisor(or EL2)
Data.LOAD.Elf SecureAppFileName.elf Z: /nocode /noclear ; @Secure World
Data.LOAD.Elf NonSecAppFileName.elf N: /nocode /noclear ; @NonSecure World