圖解SOC中的Time:系統(tǒng)里有哪些Timer?
說明:
本文講述的是armv8-aarch64、armv9架構(gòu)在設(shè)計模式上,本文帶有一些個人的見解,如有不同的見解,可以評論區(qū)或微信群參與討論。
思考:
- 一個大的系統(tǒng)里,有多少個Timer?這些Timer的作用分別是什么?這些Timer有什么區(qū)別?它們的精確度有什么不同嗎?
- Linux Kernel的Tick使用的是哪個Timer?watchdog是用的哪個Timer?
- 一個ARM Core里有又多少個Timer?不同軟件系統(tǒng)中的Timer的使用方式有何不同嗎?
- 應(yīng)用程序中的 setitimer()這樣的函數(shù)是否會調(diào)用到底層程序?
- 應(yīng)用程序要讀取當(dāng)前系統(tǒng)時間戳的時候,是否需要調(diào)用到kernel space? 在glibc中是否就可以實現(xiàn)了?
- 什么是arch timer?什么是SOC Timer、apb timer、memory-mapped timer?
- 對于arch timer,又分為物理timer和虛擬timer?那么什么時候使用物理timer,什么時候使用虛擬timer?為什么?
- EL1和S-EL1中使用的arch timer是如何隔離的?(這里所說的隔離是指寄存器如何隔離的,中斷如何隔離的) 9、EL3 Physical Timer對應(yīng)的寄存器為什么是xxxEL1, 不應(yīng)該是xxxEL3嗎?
1、系統(tǒng)里面有多少個Timer?
如上圖所示,在一個SOC中一定/可能存在:
- core timer(也叫arch timer),每個core中都有這個Timer
- SOC Timer(也叫apb timer、memory-mapped Timer),可能會有多個,可以存在以下這樣的:
(1) 一個專門給Non-secure 使用的timer
(2) 一個專門給Secure 使用的timer
(3) 一個專門用于特定用途的timer(4) 、綁定core的Timer,例如8個timer,固定某個timer給某個core使用
2、每一個core里面又有多少個Timer
2.1、四個物理Timer
- EL1 Physical Timer 不區(qū)分secure和non-secure,但在ATF的switch cpucontext的時候,會保存和恢復(fù)相關(guān)寄存器,所以從軟件視角來看是有兩套寄存器,也就是有 non-secure EL1PhysicalTimer? 和 secure EL1PhysicalTimer?,這也是最最理想的設(shè)計方案。然而非常非常非常非常的遺憾的是,寄存器通過軟件switch cpucontext可以變成2套,但中斷呢?中斷是無法同時給non-secure和secure同時使用的,也無法做到中斷在Security State之間的隔離。既然這樣,說明這樣的硬件是一個"非常嚴(yán)重"的問題,那么我們看下軟件是怎么使用的呢?
(1)Linux Kernel正常使用,在讀取counter值、counter頻率的同時,也會設(shè)置CTL、CVAL、TVAL等相關(guān)寄存器,也會觸發(fā)和處理30中斷(EL1 Physical Timer的默認中斷號是30);(2)optee中,僅僅是讀取counter值、counter頻率的同時,就可以計算時間戳了。optee不會讀取CTL、CVAL、TVAL等相關(guān)寄存器,當(dāng)然也不會觸發(fā)和處理30中斷了。
以上便是軟件基于“硬件缺陷”而進行的設(shè)計,自然也不會出現(xiàn)什么問題。然后你說ARM Timer有缺陷就有缺陷了?你真的懂它們的設(shè)計嗎?事實上ARM的設(shè)計中,也考慮了上面描述的問題。你仔細看看它的 ?EL3PhysicalTimer?,他的寄存器的名字竟然是 xxx_EL1?(而不是 xxx_EL3?),也就是說它本身就是想給secure security用的(EL3也屬于secure security)。另外我也參考了具體的arm core trm手冊,發(fā)現(xiàn) EL3PhysicalTimer?所對應(yīng)的中斷號(29號中斷)的signal configuration描述為"Secure EL1 Pyhsical Timer"。我們再查一下BL32(Secure EL1)的參考程序 trusted-firmware-a/bl32/tsp/tsp_timer.c?, 它操作的也正是 EL3PhysicalTimer。
總結(jié):
(1) ?EL1PhysicalTimer? 不區(qū)分secure和non-secure,在secure和non-secure之間也無法做到隔離。一般情況下它是給NS-EL1使用的。當(dāng)然S-EL1如果是僅僅讀取counter和頻率獲取當(dāng)前時間戳,也是可以用的,但這不應(yīng)該是建議的。因為這樣造車non-secure也可以竊取到secure側(cè)的時間戳。
(2) ?EL3PhysicalTimer? 的本意就是想給secure用的,包括EL3和S-EL1
- EL2 Physical Timer 給non-secure EL2使用的
- S-EL2 Physical Timer 給secure EL2使用的
- EL3 Physical Timer 給Secure使用的,包括EL3和S-EL1
2.2、三個虛擬Timer
EL1VirtualTimer?主要是給EL1 OS(guest os)使用的,那么對于一個操作系統(tǒng),它到底是使用 EL1PhysicalTimer?還是使用 EL1VirtualTimer? ? 由宏控決定,在編譯的時候就決定了。例如你這個OS沒有跑在VM中,那么就使用 EL1PhysicalTimer?,如果你這個OS是要跑在VM中的,那么就使用 EL1VirtualTimer
EL2PhysicalTimer?是很好理解的,就是給EL2管理程序使用的嘛,但是 EL2VirtualTimer?是給誰用的呢? 這里就需要一點虛擬化的概念了, EL2VirtualTimer是給Host App使用的。
作者簡介:
Baron (csdn:代碼改變世界ctw),九年手機安全/SOC底層安全開發(fā)經(jīng)驗。擅長trustzone/tee安全產(chǎn)品的設(shè)計和開發(fā)。