CMSIS-DAP - 4 - 介紹 SVC
收錄於 : 關於Ameba的一百篇
前篇 : CMSIS-DAP -3 -timer
在前篇介紹了 CMSIS-DAP 所用的 gcc SVC 寫法, 大家有沒有覺得好像天書一般.
筆者一開始看的時候也是. 不過努力看懂後, 覺得 SVC 的確是 ARM cortex-M 的一大創舉.
( 以前在 cortex-A 是 IRQ 和 SWI interrupt handler)
SVC 的縮寫是 supervisor call , 顧名思義, 他是想設計像 Linux 這般, 作為 kernel mode 和
user mode 的橋樑 (ioctl). 首先先回顧 privileged mode / un-privileged mode , 和
thread-mode / handler mode 的 狀態圖.
有沒有發現, 當進入 user thread mode 狀態時, 並沒有一條路直接到 privileged thread ,
而是要透過 exception 進到 privileged handler. 且 user thread 並沒有權限直接去改
program CONTROL register. ( user thread mode 是 unprivileged 的 )
那怎麼去進到 所謂的 privileged kernel mode 去管理資源呢.
這時候靠的就是 SVC exception.
SVC 是 exception 的一種, 在之前 vector table 介紹中, 他是 HW exception. '
exception no. 11 , vector table address 0x2C.
怎麼觸發這個 SVC exception 呢? 其實很簡單. 我們看 gcc SVC 中的 SVCCall
__asm volatile \
( \
"ldr r12,="#f"\n\t" \
"svc 0" \
: "=r" (__r0), "=r" (__r1), "=r" (__r2), "=r" (__r3) \
: "r" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) \
: "r12", "lr", "cc" \
);
CPU 只要執行 svc 指令, 就會 觸發 svc exception.
這邊 R12 在 macro 中, 會對應到要執行 SVC function 的位置.
而 SVC handler , 在原本 RTOS 那包, 是用 組合語言寫在 HAL_CM0.s
並且在看 code 時不要忘記, cortex-m 從 thread mode 進到 handler mode,
硬體會自動 push 底下這些進到 stack
所以 LDMIA 在 load stack 時, load 到 R4 的值, 就是之前 放到 stack 的 R12.
有了 SVC, 切割 user mode 和 kernel mode, 大家是否有些啟發, 想來做一個 Secure OS?
當然 RTX 是 ARM 所寫的一個簡單基本的 RTOS, 如果想真正做一個 Secure OS.
可能還得多加一些判斷在 SVC Handler 的入口. 像 Linux ioctl 所做的.
在 RTX 會發現, 其實 這邊 memory 管理 很基本. 沒有過多的保護.
SVC function 有可能被污染.
在 ARM mbed OS 有做一個 用 MPU 來實現的 uvisor , 但 MPU 保護也有限.
也因此, 在 cortex-v8M 時, 推出 Trustzone 的機制,
開始有 secure / non-secure mode 的概念. 能更進一步地來保護系統.
之後 ARM 解密時, 有機會再和大家介紹.
留言
張貼留言