Micro-Architectural Power Simulator (MAPS) สำหรับ Cortex-M3
ภาพรวม
Fast Cortex-M3 Simulator ที่สร้างร่องรอยพลังงาน ข้อมูลเพิ่มเติมสามารถพบได้ใน https://eprint.iacr.org/2017/1253.pdf
- เขียนเป็น C ++ ด้วยความเร็ว
- อ่านและจำลองไฟล์. bin ที่สร้างขึ้นจากแหล่งประกอบ/C ด้วยเครื่องมือ GNU ARM Toolchain
โดยทั่วไปจะพบคำแนะนำเฉพาะในการเข้ารหัสของ crypto primitives คำแนะนำที่ไม่ได้รับการสนับสนุนอาจถูกเพิ่มใน CPU.CPP
การรวบรวม
- Compile Simulator: ตัวจำลอง (รวม) ฟังก์ชั่นหลักถูกเก็บไว้ในไลบรารีคงที่
- cd libsim/build
- ทำ
- ติดตั้ง
- รวบรวมเฟิร์มแวร์การใช้งาน เราใช้ sec_add_v05 เป็นตัวอย่าง:
- cd sec_add_v05/fw/build
- ทำ
- รวบรวมตัวจำลองการใช้งาน (ยังคงใช้ sec_add_v05 เป็นตัวอย่าง):
- cd sec_add_v05/sim/build
- ทำ
ใช้เครื่องจำลอง
ตัวจำลองอ่านไฟล์. bin ที่ต้องอยู่ในไดเรกทอรีปัจจุบัน ชื่อของไฟล์. bin ขึ้นอยู่กับสิ่งที่ระบุไว้ในแหล่งจำลอง
เครื่องจำลองควรจะใช้เมื่อพัฒนาเฟิร์มแวร์ดังนั้นวิธีการจำลองแบบจำลองปกติคือ
- เปลี่ยนไดเรกทอรีเป็นไดเรกทอรีเฟิร์มแวร์: CD SEC_ADD_V05/FW/BUILD
- รันตัวจำลอง: ../../sim/build/sim_sec_add_v05 -n 1000
ตัวเลือก '-h' แสดงตัวเลือกและพารามิเตอร์ที่ถูกต้อง
การเข้ารหัสการใช้งาน FW ใหม่
การใช้งาน FW เป็นเพียงฟังก์ชั่น C (อาจมีรหัสประกอบ) ตาม ARM ABI (พารามิเตอร์ที่ 1 ใน R0, ฯลฯ ... ) ไม่มีฟังก์ชั่นหลัก อาจใช้ฟังก์ชัน C และ Pre-Processor ทั้งหมด
เฟิร์มแวร์อาจถูกรวบรวมโดยคอมไพเลอร์ ARM ใด ๆ ที่รองรับ Cortex-M3 มีการทดสอบ ARM GCC เท่านั้น เส้นทางไปยัง ARM Compiler Conecutable อาจมีการเปลี่ยนแปลงในสคริปต์/fw.mak โดยการแก้ไขตัวแปร "dir"
การเข้ารหัสแบบจำลองใหม่
เป็นการดีที่สุดที่จะเริ่มต้นและปรับเปลี่ยนเครื่องจำลองที่มีอยู่แล้ว ตัวจำลองต้องมี 3 ฟังก์ชั่น:
- เป็นโมฆะ check_sec_algo (เป็นโมฆะ): ฟังก์ชั่นนี้ใช้เวกเตอร์ทดสอบและการพิมพ์บางอย่างผ่านการทดสอบผ่านหรือไม่
- เป็นโมฆะ T_TEST_SEC_ALGO (ตัวเลือกและตัวเลือก): ฟังก์ชั่นนี้ทำงาน T_Test โดยการสร้างอินพุตและการรวบรวมร่องรอย
- เสื้อคลุมเพื่อเรียกใช้ฟังก์ชัน FW (ที่จะจำลอง) wrapper นี้ (ซึ่งลายเซ็นนั้นขึ้นอยู่กับฟังก์ชั่น FW) จะต้องเขียนอาร์กิวเมนต์ในหน่วยความจำจำลองและตั้งค่าโปรเซสเซอร์ลงทะเบียนตามนั้น จากนั้นมันก็เริ่มการจำลอง หลังจากการจำลองจะต้องคัดลอกผลลัพธ์จากหน่วยความจำจำลอง
สนับสนุนคำแนะนำ ARM V7-M เพิ่มเติม
ทำตามขั้นตอนเหล่านั้นเพื่อสนับสนุนคำสั่งในตัวจำลอง:
- เพิ่มค่าการถอดรหัสและหน้ากากในไฟล์ libsim/src/opcodes.h
- ถอดรหัสคำสั่งในขั้นตอนฟังก์ชัน () ใน libsim/src/cpu.cpp
- เพิ่มการดำเนินการของฟังก์ชั่นในไฟล์เดียวกัน
- อย่าลืมเพิ่มฟังก์ชั่นใหม่นี้ในรายการวิธีการใน CPU.H
macros test_ins32 และ test_ins16 ทำให้การถอดรหัสของคำสั่งง่ายขึ้นอย่าลืมตรวจสอบพฤติกรรมของคำสั่งจำลองใหม่โดยเฉพาะอย่างยิ่งพฤติกรรมของการลงทะเบียนท่อส่ง Reg_a และ reg_b!
การตรวจสอบความถูกต้อง
แต่ละคำสั่งที่รองรับโดยเครื่องจำลองจะต้องตรวจสอบกับการจำลอง RTL ต้นไม้ RTL ไม่ได้ถูกเก็บไว้ในที่เก็บนี้เพราะมันเป็นของ ARM Limited ขั้นตอนส่วนใหญ่ที่อธิบายไว้ด้านล่างมีเฉพาะสำหรับเอกสารของฉันเอง
- เพิ่มคำสั่งใหม่ในไฟล์ experiment.c ในแผนจำลอง
- ดำเนินการตรวจสอบ> sim_trace.log 2> & 1 ในทิศทางการสร้าง FW ในทรีจำลอง
- เพิ่มคำสั่งใหม่ในไฟล์รั่วไหล c ในทรี RTL
- คอมไพล์: ทำ testCode testName = การรั่วไหล
- Simulate: Make Run testName = การรั่วไหล
- แปลงไฟล์ tarmac.log trace เป็นไฟล์ Trace Register: ../../../../../python/gen_trace.py> verilog_trace.log
- คัดลอกไฟล์ Trace Register ในแผนผัง Simulator: 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 การจำลองจะถูกต้อง