sparc體系架構的窗口寄存器的深入理解
1.概述
2.窗口寄存器的特性
3.程序的設計
1.概述
sparc這種架構有著特殊的窗口寄存器,使用sparc芯片,一定會對這種窗口寄存器產生疑惑,然而這種硬件特性卻讓軟件設計有著更加獨特的方式。下面來描述一下sparc架構中這種串口寄存器的特性以及編程模型。
采用窗口寄存器,可以減少函數調用過程中返回時間,因為通過硬件進行壓棧操作時,可以減少指令條數以及減少訪問存儲器的次數。
窗口寄存器的本質是每當執行一次函數調用過程時,寄存器窗口會自動的指向下一個窗口,當子程序返回時,也不需要額外的出棧操作,只是將窗口偏移到上個寄存器即可。
而兩個相鄰的窗口則有重疊部分,可以對兩個父子函數之間進行參數傳遞,這樣大大的提高了訪問的效率以及寄存器的專一性。
2.窗口寄存器的特性
當在實際的程序中使用時,往往會涉及到多個函數的嵌套,這些在復雜程序設計上非常的普遍,業務邏輯的增加會顯著的增加函數調用的深度。如果函數調用超過了這些8個窗口,sparc架構又是該如何處理呢?
在sparc的架構中,CWP(當前窗口指針)是PSR(程序狀態寄存器)的一部分,在某一固定的時刻,處理器中都只會有32個整數寄存器可以被使用。這32個寄存器為8個全局寄存器、8個返回結果寄存器、8個局部寄存器、8個輸入寄存器。CWP通常會因SAVE指令(SAVE指令一般在過程調用時使用,用來開辟新的棧幀并切換寄存器窗口)而減一,因RESTORE指令(在從過程中返回前切換回調用者的寄存器窗口)而加一,陷阱事件(中斷,異常或TRAP指令)和RETT指令(從陷阱中返回)也會改變CWP,不過函數調用比陷阱更為常見。
窗口無效掩碼(WIM) WIM指示了哪個窗口是無效的,無效的意思是該窗口保存了調用者的信息所以不可再使用,上圖中,WIM指向w7,而CWP指向w0,所以現在如果執行一條SAVE指令,則會觸發窗口溢出陷阱,反之,如果CWP指向w0且又執行了一條RESTORE指令,則會觸發窗口下溢陷阱。
所謂的窗口下溢則是說當前窗口不夠用了,需要將已經滿了的窗口寄存器的數據壓入到棧上,也就是內存中,壓入后的窗口寄存器又可以重新利用起來了,而上個滿了的窗口寄存器則存在內存中了。當函數返回到窗口無效寄存器時,則發生上溢陷阱,該陷阱中會執行出棧的操作,從而將寄存器進行恢復。
3.程序的設計
對于C語言來說,并不用關注架構的不同帶來的差異性,而對于匯編來說,則設計卻是完全的不同。GCC已經處理好了C轉換成匯編的邏輯。
每個save指令都是在被調用的函數的第一條指令處開始執行。而SAVE的指令與ADD的指令相同,其功能是可以將sparcCWP減一。讓CWP-1窗口成為新的當前的窗口。
當函數執行完成后,則執行restore指令,讓窗口指令加一。窗口就回歸原位了。
4.sparc設計對于嵌入式編程的優劣
對于嵌入式來說,如果只設計可控的程序,邏輯設計上盡可能的單一可控,并且最好函數的嵌套深度不應該超過8個,最好不發生上溢或者下溢操作。這樣不用訪問存儲器,并且底層的指令很少,對于程序的執行效率很有保障。有上溢或者下溢,一次性就需要壓棧或者出棧操作,使得其程序的執行效率不在那么高效。
而對于rtos來說,設計上也稍微復雜了一些,需要不僅需要判斷當前窗口的溢出情況,還需要保存窗口寄存器的棧,這樣對于系統上下文的線程棧需要的空間消耗是非常大的。目前也沒有想到合適方式去減少棧的消耗,而且在rtos上,sparc架構所占的優勢并不是很明顯,以上僅僅是我對這種架構在嵌入式上使用的一些看法。
總結起來,sparc架構的好處是由于有了窗口寄存器模型,如果程序設計的優秀簡單,這個是非常好的,效率也可以非常高,簡潔的寄存器、簡潔的控制狀態,需要編程人員要有很高的水平。缺點就是不考慮sparc架構的編程方式,將會使得程序的效率非常的低下,sparc芯片的使用也變得十分的困難。
責任編輯:xj
原文標題:sparc體系架構的窗口寄存器的深入理解
文章出處:【微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120365 -
窗口
+關注
關注
0文章
66瀏覽量
10856 -
SPARC
+關注
關注
0文章
16瀏覽量
9895
原文標題:sparc體系架構的窗口寄存器的深入理解
文章出處:【微信號:Embeded_IoT,微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論