Setup Linux & Android Debug Environment
목차
Overview
본 과정의 교육자료는 TRACE32 입문/중급 과정을 마치거나 동등 수준에 이른 분을 대상으로 작성되었으나 상황에 따라 사용에 미숙한 분들을 고려해 기본 개념
및 기초 사용에 대한 설명을 추가해 놓은 경우도 있습니다. 따라서 필요한 부분만 참조하여 보는 것도 좋은 방법이 되겠으며 내용은 Target OS가 Linux인 경우를
기준으로 작성되었습니다. 그러나 지극히 Linux에 특화된 내용을 제외하고는 다른 OS 환경에서 적용 및 사용이 가능할 것으로 보입니다.
본 교제의 사용 방법은 우선 앞의 목차에서 큰 제목을 확인하시고 관심항목을 Click 하시면 해당 내용으로 이동하니 사용에 참조하시기 바랍니다.
실습환경
본 과정 실습 환경은 다음과 같습니다. TRACE32를 이용한 디버깅 측면에서는 최근 사용되고 있는 big.LITTLE processing 환경에서도 동일하게 적용하셔도 무방합니다.
CPU |
CortexA57x4+CortexA53x4 big.LITTLE System CortexA9MPcorex2 System |
Target OS |
Linux 3.10.44 based Android LollyPop Linux 3.07.10 based Android JellyBean |
TRACE32 PowerView version |
2014. 10 이상 버전 |
iTSP version |
iTSP version 3.8.5 이상 버전 |
TRACE32 ICD(In Circuit Debugger) = PDMU(Power Debug Modue) + License Module |
PowerDebug USB2/USB3 or PowerDebug II License Module |
l PowerView : PC에서 동작하는 Trace32 Software GUI 개발환경의 이름입니다.
l PDMU(Power Debug Module) : PC와 통신 및 디버그 인터페이스 신호을 만들어 내는 본체를 통틀어 지칭하는 이름입니다.
l License Module : JTAG License Cable이라고도 하며 License 정보를 가지고 있으며 Target과 연결하기 위해 Cable을 포함하고 있는 삼각형 형태의모듈입니다.
SoC에서 Debug 제약사항
JTAG을 이용한 Debug 환경 셋업이 완료되고 난 후 제약 사항은 따로 없으나, Target이 big.LITTLE과 같은 절전모드를 사용하여 특정 하드웨어 블록의 전원을 끈다거나
하는 경우에 SoC의 Power/Clock/Reset Domain의 설계에 따라서 칩내 Debug Logic 동작에 영향을 주어 정상적으로 동작 하지 않을 수 있습니다. 이는 해당 SoC의
특성이므로 초기 셋업 시 TRACE32 기술지원 담당자에게 문의하시면 관련 정보를 얻으실 수 있으며 Debug를 위한 Software Feature 추가가 필요할 수 있으니 확인하시기
바랍니다. 또한 OS Kerenl에서 Profiling과 같은 특정 기능을 실행하기 위해 Debug Logic Resource를 사용하는 경우가 있는데 이럴 경우에도 BreakPoint에 의한 Break
Event가 발생하지 않는다든지 의도하지 않는 동작을 할 수 있습니다.
상기 기술된 내용 이외에 문제가 될만한 것은 Secure JTAG이 적용된 것일 수 있으며 Debug를 위한 보안 해제를 위해 SoC Secure Key 값을 미리 설정하여 Debug 가능
상태로 변경이 필요할 수 있습니다.
iTSP(Integraged TRACE32 Support Package)에 대한 이해 및 기능
iTSP는 최근 복작한 SoC 구조에 따른 Debug를 위한 환경 셋업이 매우 복잡해짐으로 인해 매우 번거롭고 어려움을 느낄 수 있어 TRACE32 Debugger에 대한 기본
지식이 없는 초기 사용자라 할지라도 쉽게 설정하여 셋업할 수 있도록 도와주는 TRACE32 Script Package입니다. 기본적으로 설정 환경이 GUI로 되어 있어 쉽게
설정이 가능합니다. 설정 방법은 2. How to setup을 참조하시기 바랍니다.
또한 필요할 경우 요청하시면 해당 SoC를 추가하고 있으니 참조하시기 바랍니다. 현재는 주로 Linux/ Android/QnX/Nucleus/SLP/L4/WinCE6/WinCE7/WP8 등의
OS에 대한 iTSP를 제공하고 있습니다.
How to setup
여기서는 TRACE32 설치 및 Target Debug를 위한 환경 셋업에 대해 알아 봅니다.
Installation of PowerView
1) 우선 TRACE32 설치 CD를 넣은 후 setup.bat 파일을 실행하여 installer를 실행합니다. 다음 화면이 나올 때까지 Next를 선택하고 다음과 같이 설치 장비를 ICD
(In Circuit Debugger)를 선택합니다.
2) 다음은 Host Interface 타입을 선택하는 윈도우가 나오는데 대부분은 USB Interface를 사용하므로 기본 설정대로 Next합니다.
3) 다음 윈도우가 나올 때까지 Next하시고 다음 윈도우가 나오면 설치할 CPU Debugger를 선택하는 항목으로 다음과 같이 ARM series debugger를 선택합니다.
- ICD ARM(ARM7/9/11, Cortex, XScale) : 기존 ARMv7 Architecture debugger 설치 선택
- ICD ARM64(ARMv8-A) : 64bit ARMv8 Architecture(CortexA57/CortexA53) debugger 설치 선택
필요에 따라 사용할 여러 processor들을 선택하여 설치할 수 있습니다.
4) 호스트 PC OS가 64bit Windows인 경우 64bit용 실행파일을 설치할 것인지 32bit용 실행파일을 설치할 것인지를 묻는 메시지 윈도우를 띄웁니다.
64bit인 경우 simulator사용 시 이점이 있으므로 “예(Y)”를 선택합니다. 32bit Windows에서 설치하는 경우는 본 순서는 없으며 자동으로 32bit용 SW를 설치합니다.
5) 다음은 모두 Next나 확인을 선택하여 설치하시고 USB driver설치 윈도우가 나오면 다음(Next)를 선택하여 USB Driver 설치 Resource를 복사하도록 합니다.
모든 설치가 완료된 후 장비를 연결하고 Power를 켜면 자동으로 USB Driver를 설치하게 됩니다. PC에 따라 설치하는 시간이 최대 1분여 정도 걸릴 수 있습니다.
추후 USB Driver를 Update하고자 하는 경우 Driver는 설치폴더나 CD:\files\bin 폴더에 있으니 해당 폴더를 선택하여 설치하시면 되겠습니다.
6) 다음 내용들은 모두 Next하여 설치하시고 다음과 같이 시작프로그램에 등록하는 윈도우가 나온 후 Next
하여 설치를 마무리 합니다.
iTSP 설치와 TRACE32 Update
iTSP 설치하기
iTSP 설치를 순서를 확인하기 위해 다음 링크을 클릭합니다.
TRACE32 Update 하기
1) http://trace32.com/wiki/index.php/TRACE32_Update Wep Page를 여시고 원하는 SoC와 Software Version을 찾아 다운 받습니다.
- 날짜별 Update 버전을 확인한 후 보유한 License Mainternace 기간 내의 SW 다운 받습니다.
2) Unzip 후 압축 해제된 파일들을 TRACE32가 설치된 루트 폴더(Ex. C:\T32\)에 덮어 씌웁니다.
아래 그림은 Unzip했들 때 파일들이며 다음 그림은 TRACE32가 설치된 루트의 폴더 구조입니다.
Starting PowerView
iTSP 설치가 완료되면 아래 그림과 같이 설치 폴더에 ARMv8 Core(CortexA5x series) Debugging 시는 “TRACE32 ICD Target ARM 64.lnk” 파일을,
ARMv7(CortexA15x/Ax/Rx/Mx) Core의 경우 “TRACE32 ICD Target ARM.lnk” 파일을 실행하여 TRACE32 PowerView를 실행합니다.
실행하게 되면 아래 그림과 같이 연결할 SoC용 iTSP 선택 Dialog가 열리게 되는데 원하는 Target SoC와 OS를 선택한 후 Start 버튼을 클릭합니다.
그러면 해당 SoC와 OS에 맞는 Target 메뉴가 생성되며 추가로 두개의 아이콘도 생성됩니다. 다음은 디버깅할 Target의 Boot Loader나 OS에 대한 iTSP설정 후 디버징
작업을 진행하면 되겠습니다.
iTSP Setup for u-boot debugging & Linux Kernel & Android
u-boot 나 Kernel debugging을 위한 iTSP 환경 Setup에 대하여 알아 봅니다. 아래 그림과 같이 Target Setting 아이콘을 클릭하면 iTSP Setup 윈도우가 열립니다.
프로젝트마다 사용될 iTSP 프로젝트 이름, 각종 심볼 경로 등 디버깅에 필요한 필수 정보들을 설정해 줍니다. 설정이 필요한 항목은 다음과 같습니다.
Project |
5개까지 프로젝트 별로 iTSP 설정을 저장 가능 |
Bootloader Symbol |
부트로더 심볼(ELF) 파일 선택 |
Linux Kernel Symbol |
리눅스 커널 심볼 파일인 vmlinux ELF 파일 선택 |
Android Symbol Directory |
Android 빌드 시 생성되는 out 폴더 내에 있는 Anroid ELF 파일들을 모아 놓은 symbols라는 폴더의 Network 경로를 지정 ex) <Android Root>\out\target\product\smdkc210\symbols |
Kernel Address Range |
Kernel이 위치해 있는 물리메모리 영역(Low Memory Range) 지정 |
AutoMMU |
Booting 후 vmlinux ELF를 /nocode 옵션과 로드(Linux 심볼 로드) 후 AutoMMU 버튼을 누르면 Kernel Address Range를 자동으로 찾아 설정. vmlinux 파일은 반드시 현재 보드에 올라간 image 빌드시 파일이어야 함 |
Symbol Path |
위의 Android Symbol Directory에 설정된 폴더에 위치하지 않은 image를 디버깅 하고자 한다면 해당 ELF image가 있는 폴더 위치를 추가로 지정하기 위한 설정 |
모든 설정이 완료된 후 설정을 Save하고 Target Power를 OFF >> ON 한 다음 아래 그림과 같이
Kernel-Debug 버튼을 클릭하게 되면
Target은 booting 후 Start_Kernel()까지 실행하고 멈추게 되는데 여기까지 동작이 확인 되면 모든 설정이 정상적으로 완료된 것이라고 생각해도 되겠습니다.
마지막으로 Kernel Address Range의 정확한 확인을 위해 Target를 일정시간(3~5초) 실행시켜 멈춘 후 TRACE32 Command line에서
do ./OS/linux/mmu_setinfo.cmm
명령을 입력하여 실행하거나
MMU.List.PageTable 0xC0000000
or
MMU.List.KernelPageTable
입력하여 실행하면 정확한 Kernel Physical Range를 확인할 수 있습니다. MMU Table에서 리니어하게 배치된 커널 물리 영역을 얻어 냅니다.
<32bit Kernel에서 Kernel MMU Table List>
위 예제의 경우 0x40000000—0x6F7FFFFF가 됩니다.
만약 ARMv8의 경우라면
MMU.List.PageTable 0xFFFFFFC000000000
를 실행하면
아래와 같이 64bit Address space를 갖는 형태로 현재 Mapping된 MMU Table List를 보여줍니다.
<64bit Kernel에서 Kernel MMU Table List>
참고로 Target의 Kernel Binary Image와 로드된 vmlinux 파일의 일치 여부를 확인하기 위해 TRACE32 Command Line에서
TASK.TEST
명령을 실행하면 정확한 Linux text banner와 현재 사용된 Linux 정보들을 확인할 수 있습니다. 만약
<32bit Kernel에서 TASK.TEST 결과>
Binary Image와 vmlinux 파일이 같은 빌드시 생성된 것이 아니(다른 경우)라면 banner의 String이 일부 보이지 않거나 모두 보이지 않는 현상을 볼 수 있습니다.
<64bit Kernel에서 TASK.TEST 결과>
위와 같이 64bit Linux Kernel이라면 “ptr size”와 “MMU format”이 64bit 인것을 확인할 수 있습니다.
u-boot Debugging
앞의 iTSP 설정이 완료되고 난 후 u-boot debugging을 위해서는 Target 메뉴 >> boot-Debug 항목을 클릭하게 되면 u-boot의 맨처음 실행되는 C-함수 실행 중
멈추게 됩니다.
만약 JTAG debugging을 위해 JTAG Port에 “System Reset” 신호가 연결되어 있지 않은 경우나, JTAG Port의 “System Reset”에 연결된 신호에 의해 재부팅 제어가
불가한 경우는 Target을 재 부팅시킬 수 없기 때문에 Power를 Off 한 후 ON 하고 “boot-Debug” 항목을 클릭하도록 합니다.
Kernel Debugging
Kernel debugging시 경우에 따라
1) start_kernel() 코드 실행부터 디버깅 하기
2) smp_cpus_done() 코드 실행부터 debugging 하기
를 원하는 경우가 있을 것입니다. SMP 환경에서 모든 core들이 깨어난 뒤 Kernel 코드실행을 보고자 한다면 smp_cpus_done() 코드 실행부터 debugging 하기를
따라하시면 되겠습니다.
start_kernel() 함수부터 debugging 하기
앞의 iTSP 설정이 완료되고 난 후 Target 메뉴 >> Kernel-Debug 항목을 클릭하게 되면 Kernel의 start_kernel()함수 실행 시작에서 멈추게 됩니다.
만약 debugging을 위한 JTAG Port에 “System Reset”이 연결되어 있지 않은 경우나 JTAG Port의 “System Reset” 핀에 연결된 신호에 의해 재부팅 제어가 불가능한
경우는 Target을 재 부팅시킬 수 없기 때문에 Power를 Off 한 후 ON 한 다음 바로 Kernel-Debug 항목을 클릭하도록 합니다.
smp_cpus_done() 함수부터 debugging 하기
앞의 iTSP 설정이 완료되고 난 후 Target 메뉴 >> Kernel SMP-Debug 항목을 클릭하게 되면 Kernel의 smp_cpus_done()함수 실행 시작에서 멈추게 됩니다.
만약 debugging을 위한 JTAG Port에 “System Reset”이 연결되어 있지 않은 경우나 JTAG Port의 “System Reset” 핀에 연결된 신호에 의해 재부팅 제어가 불가능한
경우는 TRACE32가 Target을 재 부팅시킬 수 없기 때문에 Power를 Off 한 다음 ON 하고 바로 Kernel SMP-Debug 항목을 클릭하도록 합니다.
부팅후 Kernel 동작 중 중간에 연결하여 디버깅하기
앞의 iTSP 설정이 완료되고 난 후 Target 메뉴 >> Kernel-Attach 나 Kernel SMP(Attach)-Debug 항목을 클릭하게 되면 Target Reset을 실행하지 않고 Target 동작 중
중간에 연결하여 디버깅 모드로 진입하게 됩니다.
Kernel-Attach 항목은 SMP core 중 main core 하나만 연결하게 되며 Kernel SMP(Attach)-Debug는 SMP로 구성된 모든 core를 연결하여 디버깅 상태로 전환합니다.