說明:
本文講述的是armv8-aarch64、armv9架構在設計模式上,本文帶有一些個人的見解,如有不同的見解,可以評論區或微信群參與討論。
思考:
1、一個大的系統里,有多少個Timer?這些Timer的作用分別是什么?這些Timer有什么區別?它們的精確度有什么不同嗎?
2、Linux Kernel的Tick使用的是哪個Timer?watchdog是用的哪個Timer?
3、一個ARM Core里有又多少個Timer?不同軟件系統中的Timer的使用方式有何不同嗎?
4、應用程序中的 setitimer()這樣的函數是否會調用到底層程序?
5、應用程序要讀取當前系統時間戳的時候,是否需要調用到kernel space? 在glibc中是否就可以實現了?
6、什么是arch timer?什么是SOC Timer、apb timer、memory-mapped timer?
7、對于arch timer,又分為物理timer和虛擬timer?那么什么時候使用物理timer,什么時候使用虛擬timer?為什么?
8、EL1和S-EL1中使用的arch timer是如何隔離的?(這里所說的隔離是指寄存器如何隔離的,中斷如何隔離的)9、EL3 Physical Timer對應的寄存器為什么是xxxEL1, 不應該是xxxEL3嗎?
1、系統里面有多少個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不區分secure和non-secure,但在ATF的switch cpucontext的時候,會保存和恢復相關寄存器,所以從軟件視角來看是有兩套寄存器,也就是有non-secure EL1PhysicalTimer和secure EL1PhysicalTimer,這也是最最理想的設計方案。然而非常非常非常非常的遺憾的是,寄存器通過軟件switch cpucontext可以變成2套,但中斷呢?中斷是無法同時給non-secure和secure同時使用的,也無法做到中斷在Security State之間的隔離。既然這樣,說明這樣的硬件是一個"非常嚴重"的問題,那么我們看下軟件是怎么使用的呢?
(1)Linux Kernel正常使用,在讀取counter值、counter頻率的同時,也會設置CTL、CVAL、TVAL等相關寄存器,也會觸發和處理30中斷(EL1 Physical Timer的默認中斷號是30);
(2)optee中,僅僅是讀取counter值、counter頻率的同時,就可以計算時間戳了。optee不會讀取CTL、CVAL、TVAL等相關寄存器,當然也不會觸發和處理30中斷了。
以上便是軟件基于“硬件缺陷”而進行的設計,自然也不會出現什么問題。然后你說ARM Timer有缺陷就有缺陷了?你真的懂它們的設計嗎?事實上ARM的設計中,也考慮了上面描述的問題。你仔細看看它的EL3PhysicalTimer,他的寄存器的名字竟然是xxx_EL1(而不是xxx_EL3),也就是說它本身就是想給secure security用的(EL3也屬于secure security)。另外我也參考了具體的arm core trm手冊,發現EL3PhysicalTimer所對應的中斷號(29號中斷)的signal configuration描述為"Secure EL1 Pyhsical Timer"。我們再查一下BL32(Secure EL1)的參考程序trusted-firmware-a/bl32/tsp/tsp_timer.c, 它操作的也正是EL3PhysicalTimer。
總結:
(1)、EL1PhysicalTimer不區分secure和non-secure,在secure和non-secure之間也無法做到隔離。一般情況下它是給NS-EL1使用的。當然S-EL1如果是僅僅讀取counter和頻率獲取當前時間戳,也是可以用的,但這不應該是建議的。因為這樣造車non-secure也可以竊取到secure側的時間戳。
(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)使用的,那么對于一個操作系統,它到底是使用 EL1PhysicalTimer還是使用 EL1VirtualTimer ? 由宏控決定,在編譯的時候就決定了。例如你這個OS沒有跑在VM中,那么就使用 EL1PhysicalTimer,如果你這個OS是要跑在VM中的,那么就使用 EL1VirtualTimer
EL2PhysicalTimer是很好理解的,就是給EL2管理程序使用的嘛,但是 EL2VirtualTimer是給誰用的呢? 這里就需要一點虛擬化的概念了, EL2VirtualTimer是給Host App使用的。
審核編輯 :李倩
-
寄存器
+關注
關注
31文章
5336瀏覽量
120235 -
Timer
+關注
關注
1文章
64瀏覽量
12784
原文標題:圖解SOC中的Timer(一):系統里有哪些Timer?
文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論