前言 – What is semihosting?
Semihosting 是 ARM 中的一個機制,使得 ARM target 可以藉由運行 debugger 的 host computer 的 Input/Output 裝置來進行溝通。
Semihost 的實作是透過使用定義好的軟體中斷 (SVCs),使程式在執行過程中產生中斷。一旦目標系統上的程式呼叫到對應的指令 (semihosting call),便產生軟體中斷,接著 Debug Agent 就會負責處理此中斷,進行與主機的溝通。[1]
Semihosting Interface
Semihosting 透過 SVC
指令來調用相關的命令, 以下為三種不同的使用方式:
SVC 0x123456
-
In ARM state for all architectures.
SVC 0xAB
-
In ARM state and Thumb state, excluding ARMv6-M and ARMv7-M. This behavior is not guaranteed on all debug targets from ARM or from third parties.
BKPT 0xAB
-
For ARMv6-M and ARMv7-M, Thumb state only.
同時,Operations type 被存放於 R0
暫存器,parameters 之位置存放於 R1
暫存器
可用的 semihosting operation number 如下列表:
0x00-0x31
-
Used by ARM.
0x32-0xFF
-
Reserved for future use by ARM.
0x100-0x1FF
-
Reserved for user applications. These are not used by ARM.
If you are writing your own SVC operations, however, you are advised to use a different SVC number rather than using the semihosted SVC number and these operation type numbers.
0x200-0xFFFFFFFF
-
Undefined and currently unused. It is recommended that you do not use these.
範例
以下範例可用於 Cortex-M4 系列之 ARM CPU
Reference
[1] Lab7: On-Chip Debugger + semihosting, http://wiki.csie.ncku.edu.tw/embedded/Lab7
[2] debug.h, https://github.com/zhiyb/SRAMLoader/blob/0d38d09c973e88df3a9060dbbe02c2f5020e99bc/debug.h
[3] Semihosting on ARM with GCC and OpenOCD, http://bgamari.github.io/posts/2014-10-31-semihosting.html
[4]: What is semihosting?, http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bacbedji.html
Leave a Reply