"TrustZone Debugging시 유용한 기능"의 두 판 사이의 차이
(같은 사용자에 의한 2개의 중간 편집이 숨겨짐) | |||
1번째 줄: | 1번째 줄: | ||
− | <h1><span style="font-size: 2em;"> | + | <h1><span style="font-size: 2em;"> Overview</span></h1> |
<p>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를 통해서만 허용하게 됩니다.</p> | <p>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를 통해서만 허용하게 됩니다.</p> | ||
<p>Debugging관점에서 볼 때 현재 MMU가 켜져 있을 경우 Secure와 Non-Secure Code는 각각 동일 Virtual Address에서 실행하는 환경이 있을 수 있으며 이런 경우 Secure와 Non-Secure에 대한 인지가 필수적으로 필요하게 됩니다. 즉 동일 Address에서 Secure/Non-Secure에 따라 다른 코드가 동작하게 될 것입니다. 따라서 개발자 의동에 따라 원하는 Secure State에서만 유효한 BreakPoint 설정이 가능하고 해당 State에 맞는 C/C++ Code를 찾아 개발자에게 보여줄 수 있어야 할 것입니다.</p> | <p>Debugging관점에서 볼 때 현재 MMU가 켜져 있을 경우 Secure와 Non-Secure Code는 각각 동일 Virtual Address에서 실행하는 환경이 있을 수 있으며 이런 경우 Secure와 Non-Secure에 대한 인지가 필수적으로 필요하게 됩니다. 즉 동일 Address에서 Secure/Non-Secure에 따라 다른 코드가 동작하게 될 것입니다. 따라서 개발자 의동에 따라 원하는 Secure State에서만 유효한 BreakPoint 설정이 가능하고 해당 State에 맞는 C/C++ Code를 찾아 개발자에게 보여줄 수 있어야 할 것입니다.</p> | ||
<p>다음 장에서는 바로 이러한 환경에서 각 State에 따라 소스코드와 BreakPoint를 관리하는 TRACE32 명령들에 대한 내용을 살표보도록 하겠습니다.</p> | <p>다음 장에서는 바로 이러한 환경에서 각 State에 따라 소스코드와 BreakPoint를 관리하는 TRACE32 명령들에 대한 내용을 살표보도록 하겠습니다.</p> | ||
<p> </p> | <p> </p> | ||
− | <p> | + | <p><img src="/data/wiki/2015-05-29/1432883172.png" alt="" width="600" /></p> |
<p>자료출처: Extensions to the ARMv7-A Architecture from ARM</p> | <p>자료출처: Extensions to the ARMv7-A Architecture from ARM</p> | ||
<p> </p> | <p> </p> | ||
− | <h2> | + | <h2> Secure/NonSecure/ Hyervisor(EL2) Breakpoint 설정</h2> |
<p>Processor 동작 모드에 따라 Breakpoint 설정이 가능합니다(2015년 1월~ 버전). 아래 그림은 같은 Address이지만 Secure와 NonScure에 따라 다른 BreakPoint가 설정되어 있는 것을 볼 수 있습니다.</p> | <p>Processor 동작 모드에 따라 Breakpoint 설정이 가능합니다(2015년 1월~ 버전). 아래 그림은 같은 Address이지만 Secure와 NonScure에 따라 다른 BreakPoint가 설정되어 있는 것을 볼 수 있습니다.</p> | ||
<p>또한 동일 Address이지만 Source code도 다른 code가 보이는 것을 볼 수 있습니다. 즉 동작 Mode에 따라 동일 Address에 다른 Application이 동작할 수 있고 Debugger는 이런 환경에서 구분하여 Debugging할 수 있느 환경을 제공해 주어야 합니다.</p> | <p>또한 동일 Address이지만 Source code도 다른 code가 보이는 것을 볼 수 있습니다. 즉 동작 Mode에 따라 동일 Address에 다른 Application이 동작할 수 있고 Debugger는 이런 환경에서 구분하여 Debugging할 수 있느 환경을 제공해 주어야 합니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-29/1432883214.png" alt="" width="750" /></p> | ||
<p> </p> | <p> </p> | ||
− | + | <h3> 동작 Mode(or Exception Level)에 따른 BreakPoint 설정</h3> | |
− | <h3> | + | |
<p>기본적으로 Breakpoint를 설정하면 동작모드에 상관없이 설정됩니다. 그러나 어떤 경우에는 특정 동작 Mode에서만 유효하도록 설정할 수 있습니다. 특히 Secure OS를 Debugging 한다거나 Hypervisor Mode debugging을 효율적으로 하고자 할 경우 필요하게 될 것입니다.</p> | <p>기본적으로 Breakpoint를 설정하면 동작모드에 상관없이 설정됩니다. 그러나 어떤 경우에는 특정 동작 Mode에서만 유효하도록 설정할 수 있습니다. 특히 Secure OS를 Debugging 한다거나 Hypervisor Mode debugging을 효율적으로 하고자 할 경우 필요하게 될 것입니다.</p> | ||
<p>사용방법은</p> | <p>사용방법은</p> | ||
20번째 줄: | 20번째 줄: | ||
<p> Break.Set N:0x202000 ; NonSecure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)</p> | <p> Break.Set N:0x202000 ; NonSecure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)</p> | ||
<p> Break.Set Z:0x202004 ; Secure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)</p> | <p> Break.Set Z:0x202004 ; Secure World(EL1&EL0) SoftBreakpoint(RAM 공간인 경우)</p> | ||
− | <p>Break.Set H:0x30E000 /Onchip ; Hypervisor(EL2) Mode Onchip Breakpoint</p> | + | <p> Break.Set H:0x30E000 /Onchip ; Hypervisor(EL2) Mode Onchip Breakpoint</p> |
<p> Break.Set N:0x202000 /Onchip ; NonSecure(EL1&EL0) World Onchip Breakpoint</p> | <p> Break.Set N:0x202000 /Onchip ; NonSecure(EL1&EL0) World Onchip Breakpoint</p> | ||
<p> Break.Set Z:0x202004 /Onchip ; Secure World(EL1&EL0) Onchip Breakpoint</p> | <p> Break.Set Z:0x202004 /Onchip ; Secure World(EL1&EL0) Onchip Breakpoint</p> | ||
<p> Break.Set Z:0x300014 /Write ; Secure World(EL1&EL0) data write breakpoint</p> | <p> Break.Set Z:0x300014 /Write ; Secure World(EL1&EL0) data write breakpoint</p> | ||
<p> </p> | <p> </p> | ||
− | <h3> | + | <h3> 동작 Mode(or Exception Level)에 따라 구분하여 Symbol 다운로드 하기</h3> |
<p>기본적으로 Symbol을 다운로드하면 동작 Mode(or EL)에 상관없이 Symbol을 로드 합니다. 따라서 Linux와 Secure OS가 동시에 동작하는 Application과 같은 개발환경에서 두 동작 Mode를 동시에 Debugging하기 원한다면 매우 불편한 상황을 접하게 될 것입니다. 즉, 어드레스는 같지만 Secure/Non-Secure World에 따라 다른 코드가 위치될 수 있기 때문에 필요시마다 해당 동작모드에 대한 Symbol을 로드하여 사용해야 할 것입니다. 따라서 TRACE32는 동작모드에 따라 동일 어드레스라 할지라도 다른 Symbol을 다운로드하는 기능이 있어 이러한 번거러움을 해결해 줍니다.(2014년 11월~ 버전)</p> | <p>기본적으로 Symbol을 다운로드하면 동작 Mode(or EL)에 상관없이 Symbol을 로드 합니다. 따라서 Linux와 Secure OS가 동시에 동작하는 Application과 같은 개발환경에서 두 동작 Mode를 동시에 Debugging하기 원한다면 매우 불편한 상황을 접하게 될 것입니다. 즉, 어드레스는 같지만 Secure/Non-Secure World에 따라 다른 코드가 위치될 수 있기 때문에 필요시마다 해당 동작모드에 대한 Symbol을 로드하여 사용해야 할 것입니다. 따라서 TRACE32는 동작모드에 따라 동일 어드레스라 할지라도 다른 Symbol을 다운로드하는 기능이 있어 이러한 번거러움을 해결해 줍니다.(2014년 11월~ 버전)</p> | ||
<p>방법은 다음과 같습니다.</p> | <p>방법은 다음과 같습니다.</p> | ||
33번째 줄: | 33번째 줄: | ||
<p>Ex) Data.LOAD.Elf HyperAppFileName.elf H: /nocode /noclear ; @HyperVisor(or EL2)</p> | <p>Ex) Data.LOAD.Elf HyperAppFileName.elf H: /nocode /noclear ; @HyperVisor(or EL2)</p> | ||
<p> Data.LOAD.Elf SecureAppFileName.elf Z: /nocode /noclear ; @Secure World</p> | <p> Data.LOAD.Elf SecureAppFileName.elf Z: /nocode /noclear ; @Secure World</p> | ||
− | <p>Data.LOAD.Elf NonSecAppFileName.elf N: /nocode /noclear ; @NonSecure World</p> | + | <p> Data.LOAD.Elf NonSecAppFileName.elf N: /nocode /noclear ; @NonSecure World</p> |
2015년 5월 29일 (금) 16:17 기준 최신판
목차
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
Secure/NonSecure/ Hyervisor(EL2) Breakpoint 설정
Processor 동작 모드에 따라 Breakpoint 설정이 가능합니다(2015년 1월~ 버전). 아래 그림은 같은 Address이지만 Secure와 NonScure에 따라 다른 BreakPoint가 설정되어 있는 것을 볼 수 있습니다.
또한 동일 Address이지만 Source code도 다른 code가 보이는 것을 볼 수 있습니다. 즉 동작 Mode에 따라 동일 Address에 다른 Application이 동작할 수 있고 Debugger는 이런 환경에서 구분하여 Debugging할 수 있느 환경을 제공해 주어야 합니다.
동작 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
동작 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