Cortex-M3에 대한 미세 아키텍처 파워 시뮬레이터 (MAPS)
개요
파워 트레이스를 생성하는 빠른 피질 M3 시뮬레이터. 자세한 내용은 https://eprint.iacr.org/2017/1253.pdf를 참조하십시오
- 속도를 위해 C ++로 작성되었습니다
- GNU ARM Toolchain으로 Assembly/C 소스에서 만든 .Bin 파일을 읽고 시뮬레이션합니다.
암호화 프리미티브 코딩에서 일반적으로 발견되는 지침 만 지원됩니다. 지원되지 않은 지침은 CPU.CPP에 추가 될 수 있습니다.
컴파일
- 컴파일 시뮬레이터 : 주 함수를 포함하는 시뮬레이터 (포함)는 정적 라이브러리에 저장됩니다.
- cd libsim/빌드
- 만들다
- 설치하십시오
- 구현 펌웨어를 컴파일하십시오. SEC_ADD_V05를 예로 사용합니다.
- CD SEC_ADD_V05/FW/빌드
- 만들다
- 구현 시뮬레이터를 컴파일합니다 (여전히 sec_add_v05를 사용하여 사용) :
- CD SEC_ADD_V05/SIM/빌드
- 만들다
시뮬레이터 사용
시뮬레이터는 현재 디렉토리에 위치 해야하는 .bin 파일을 읽습니다. .bin 파일의 이름은 시뮬레이터 소스에 지정된 내용에 따라 다릅니다.
펌웨어를 개발할 때 시뮬레이터를 사용해야하므로 시뮬레이션을 실행하는 일반적인 방법은 다음과 같습니다.
- 디렉토리를 펌웨어 디렉토리로 변경하십시오. CD SEC_ADD_V05/FW/BUILD
- 시뮬레이터를 실행하십시오 : ../../sim/build/sim_sec_add_v05 -n 1000
옵션 '-h'는 유효한 옵션과 매개 변수를 보여줍니다.
새로운 FW 구현 코딩
FW 구현은 ARM ABI (R0의 첫 번째 매개 변수 등)에 따라 단순히 C 함수 (어셈블리 코드를 포함 함)입니다. 모든 C 및 사전 프로세서 기능이 사용될 수 있습니다.
펌웨어는 Cortex-M3을지지하는 모든 ARM 컴파일러에 의해 컴파일 될 수 있습니다. ARM GCC 만 테스트되었습니다. ARM 컴파일러 실행 가능 경로는 변수 "dir"를 수정하여 스크립트/fw.mak에서 변경 될 수 있습니다.
새로운 시뮬레이터 코딩
이미 실행하는 시뮬레이터를 시작하고 수정하는 것이 가장 좋습니다. 시뮬레이터에는 3 가지 기능이 포함되어야합니다.
- void check_sec_algo (void) :이 함수는 테스트 벡터를 적용하고 테스트가 통과되는지 여부를 인쇄합니다.
- void t_test_sec_algo (옵션 및 옵션) :이 함수는 입력을 생성하고 흔적을 수집하여 t_test를 실행합니다.
- FW 함수를 호출하는 래퍼 (시뮬레이션). 이 래퍼 (서명은 FW 함수에 의존하는)는 시뮬레이터 메모리에 인수를 작성하고 그에 따라 프로세서 레지스터를 설정해야합니다. 그런 다음 시뮬레이션을 시작합니다. 시뮬레이션 후 시뮬레이션 된 메모리의 결과를 복사해야합니다.
더 많은 ARM V7-M 지침 지원
시뮬레이터의 지침을 지원하기 위해이 단계를 따르십시오.
- 파일에 디코딩 및 마스크 값을 추가하십시오. libsim/src/opcodes.h.
- libsim/src/cpu.cpp의 함수 step ()에서 명령어를 해독합니다.
- 같은 파일에서 함수 실행 추가
- 이 새로운 기능을 CPU.H의 메소드 목록에 추가하는 것을 잊지 마십시오.
macros test_ins32 및 test_ins16은 명령의 디코딩을 단순화하고 새로운 시뮬레이션 된 명령의 동작, 특히 파이프 라인 레지스터 Reg_A 및 Reg_B의 동작을 검증하는 것을 잊지 마십시오!
검증
시뮬레이터에서 지원하는 각 명령어는 RTL 시뮬레이션에 대해 검증되어야합니다. RTL 트리는 ARM Limited에 속하므로이 저장소에 저장되지 않습니다. 아래에 설명 된 대부분의 절차는 내 문서에만 해당됩니다.
- 시뮬레이터 트리에서 파일 실험에 새 명령어 추가
- 시뮬레이터 트리의 FW 빌드 방향에서 make check> sim_trace.log 2> & 1을 실행하십시오.
- RTL 트리에서 파일 Leakage.c의 새 명령어 추가
- 컴파일 : TestCode TestName = Leakage를 만듭니다
- 시뮬레이션 : RUN TESTNAME = Leakage를 만듭니다
- tarmac.log 추적 파일을 레지스터 추적 파일로 변환합니다.
- 시뮬레이터 트리에서 레지스터 트레이스 파일을 복사하십시오 : CP ~/Documents/Repos/Maps/Rendered/SSE050/LOGICAL/TESTBENCH/EXECUTION_TB/VERILOG_TRACE.LOG.
- 시뮬레이터 추적과 RTL 추적을 비교하십시오. GVIM -D SIM_TRACE.LOG VERILOG_TRACE.LOG를 시각적으로 사용하거나 : ./../../Python/compare_traces.py 사용
버그/제한
한계는 다음과 같습니다.
- LDRB/STRB 지침의 파이프 라인은 시뮬레이터에서 구현 된 것보다 더 복잡합니다. 예를 들어 다음 코드의 경우 :
ldrb r2, [r0]
strb r2, [r0]
REG_A 및 REG_B는 시뮬레이터에 의해 올바르게 시뮬레이션되지 않습니다. 기능은 여전히 정확합니다. LDRB와 STRB 명령간에 다른 명령이 삽입되면 시뮬레이션이 정확합니다.