技術角度看問題之一 ARM到底是個啥?

2021-09-23 08:02:09 字數 3893 閱讀 5956

(圖1)

基本原理(記住1byte=8bit):

電子計算機本質上是通過給三極體 (或mos管用半導體材料如矽和硒製成的) 的基極輸送不同的電壓(大於或小於0.7伏特,再講就深了,今天先不講了),進而控制三極體對電容進行充電和放電,實際是通過控制電子的流動(所以叫做電子計算機,個人理解),抽象出0和1的表示。圖1中紅線標出的記憶體,每行可以理解為8個電容,由記憶體控制器控制充放電以及讀取電壓,充電狀態(與地電壓(電勢差)大於3.3v)表示1,放電狀態(電壓小於1.8v)表示0,紅線部分的寬度永遠是8bit,不會變。有專門的的電路對這些電容的充放電狀態進行讀取,比如讀到了某byte的8個電容是00000110,就表示十進位制數字6,(當然也有可能理解為96,比如某些摩托羅拉晶元下,大尾或小尾從左還是從右開始算的區別,超出本文討論範圍)

驅動:

簡單來說,cpu與記憶體之間通過若干根連線(位址、控制、資料匯流排)來互動資訊,比如把0x00f800c這個記憶體位址的第2個bit位寫為1,就會觸發顯示卡讀取某些記憶體位址裡的內容並顯示到顯示器上。(實際上顯示裝置和記憶體之間也有連線,實現dma操作,深了今天不講)。當然為什麼寫第2個bit位就能觸發某種動作,這是人為規定的,叫做架構規範,架構後面通過一系列複雜的電路來實現這個規定,比如intelx86規定記憶體位址0x00f800c的第2個bit位寫1可以觸發顯示動作,而armv8架構下,雖然同樣都是觸發顯示動作,但不一定是操作這個位。這就是兩種架構的差異。如果你作為程式設計師,編寫intelx86架構下的顯示卡驅動程式,實際是在編寫程式來操作0x00f800c位址byte的第2個bit位。這個特定位是通過將基位址+偏移寫進晶元的datasheet來告知晶元應用者(公司)的。比如這個例子中,0x00f8000是基位址,而c是偏移,用0x00f8000+0x0c來表示實際位址。這是乙個極其聰明和有用的規定,這樣做的好處,後面章節會詳細描述。

64位與32位:是指圖1中的綠線和黃線標出的部分,在32位cpu模式下,某個位址是十六進製制表示為00f8000c,這裡每個數字包含4個二進位制bite位,共32位。而64位狀態下,這個數字實際是 0000000000f8000c,有64個bit位。在cpu內部有暫存器,intel 80x86架構的暫存器名稱是ax,bx,cx等,而arm架構下是r0,r1,r2,r3,r4,r5等,暫存器的寬度也分32位和64位。在armv7以及以前的架構中,只有32位。在2023年arm推出64位架構armv8,暫存器是64位寬,相應的暫存器名稱為x0,x1,x2,x3等。在c語言中,64位和32位的差異體現在sizeof(指標)上,實際代表的是記憶體位址的寬度,注意是圖1中綠線標出的寬度,不是紅線,紅線永遠是8bit寬,不要混淆。

指令集:

cpu讀取硬碟或flash的上物理位置從0到4k之間的一段二進位製流,這段流稱為程式,這段程式的大小就是4k,cpu把這段程式寫入記憶體位址0x00000000到0x00001000 (這裡0x00001000=4096=4k),之後,cpu內的pc暫存器內寫入0x00000000,表示從記憶體位址0處開始執行機器指令。本質是讀出該位址後4個位址(指令長度規定,指令週期涉及cpu主頻,再講就深了,後面再開貼)中共4byte長度的二進位制數字,比如讀到了52800e01,這個數字實際上對應的是一套電路編號,執行的操作是add r0,r1,意思是將r0和r1中存放的數字相加,把結果寫進r0,這個過程實際上是呼叫編號為52800e01的電路來完成的,而這種不同編號的電路的集合,就是所謂的指令集。intel cpu用的是複雜指令集cisc(complex instruction set computer),前面說的add r0,r1,這是乙個cpu指令,實際對應一套複雜的電路實現(包含若干電阻電容mos等)。intel80x86系統有300條指令,就表示至少有300套不同的電路來實現這300個功能。 而arm採用的是精簡指令集risc(reduced instruction set computer),有100條指令,實際對應100套不同的電路裝置來實現這100個功能。我們用乙個簡單的c語言函式來剖析risc和cisc的區別:

int test_mul(void)

return 6*8;

這個函式算出6乘以8,返回結果,我們來看看實際執行時,cisc和risc的差別(此處為了簡潔明瞭的闡述我們的問題,實際過程比這個複雜,我們提綱挈領,再講就深了,後面有空再開貼)

(圖2)

從圖中可以看出,同樣是實現6乘以8的功能,risc用加法來實現,把8連續加了6次,也就是說呼叫了6次add電路來實現的,而cisc直接呼叫乘法電路,實現了6*8,你可以粗淺地理解為risc很精簡,沒有乘法電路。當然,隨著cpu技術的發展,risc和cisc一直在互相學習,取長補短慢慢融合了,目前界限已沒有那麼明顯。從例子可以看出,cisc程式編碼簡單。而risc程式編碼相對複雜,因為電路種類較少,實現同樣的功能需要用僅有的電路來變通實現。c語言編譯器和作業系統共同作用,遮蔽了這種差異中的大部分內容,使得不同晶元環境下,實現相同功能的**變得大同小異(記住是大同小異,實際還是有差異)。

理解了risc和cisc,我們再來談談arm。在微控制器時代,有很多設計以及製造晶元的公司,比如飛利浦,飛思卡爾,意法半導體,arm,恩智浦等公司,當然,領頭羊還是intel.這些公司中arm比較獨特,他依託牛津劍橋科研實力,不做具體的晶元,只設計指令集(電路),這些人很聰明,他們深知,市面上存在多種晶元,但實現原理都是大同小異,所以他們專注於研發各種科學且合理的指令電路的設計,並將自己的設計形成了規範,這個規範就是armvx架構,從8位時代的armv1,到32位的armv7,再到64位的armv8又叫arm64,這些不同的架構規範,後面對應的一整套risc指令集,也就是電路圖,arm公司的商業模式是**指令集授權。比如arm公司將armv4的指令集(電路圖)工藝以及實現樣片等打包授權給賣三星公司,三星拿到的是armv3的核心架構設計圖紙,裡面包含了risc 指令集的實現電路圖,三星在這個核架構的基礎上新增自己的外設,比如i2c模組及引腳、gpu顯示增強模組及引腳、汽車內網路can模組及引腳,ai人工智慧計算模組等,將cpu核以及這些外設模組整合到一塊晶元中,命名為arm7-s3c44b0x晶元,另一款基於armv5架構生產出的晶元產品命名為s5p4418-arm9等,投放市場**。

至此,你應該明白了arm,armv7以及arm7的概念了,armv7是架構名,arm7是基於armv3架構生產的乙個晶元的產品名稱。到arm11晶元之後,arm公司更改了晶元的命名規則,由老的armx改為 cortex系列,簡言之:

cortex-m系列:m-profile,即"microcontroller" -profile,側重微控制器微控制器方面的場合。

cortex-r系列:r-profile,即"real-time"-profile,側重於實時系統的場合。

比如我司生產的hi3798mv200晶元,大的架構基於armv8(又叫arm64)的,而armv8中又有cortex a53分支,準確表達應該是:華為hi3798mv200是基於armv8的cortex-a53系列的一款晶元。下面是從wiki百科扣的圖,從中可以窺出arm家族的架構和產品系列的一斑。

1.生態優勢,主要是基於arm linux 之上的應用產業鏈,前文已有闡述。

換乙個角度看問題 火柴棒等式

這個問題是說給定一定數量 最多 根 的火柴棒,用全部這些火柴棒組成乙個 的算式,其中每個數字拼法如下 而加號和等號均為 根火柴。這個問題題意沒有明確說明負號問題,但從出題者傳遞的 意境 來看,其中 均大於等於 第一眼看到這個問題的時候就在想,是不是要把火柴棍數目 然後看能分成幾個數字,再把這些數字擺...

眼睛到底是冷敷好還是熱敷好?敷眼睛是個技術活!

在生活中很多人都經歷過眼睛浮腫,比如失戀哭腫了眼睛 熬夜睡腫了眼睛 外傷打腫了眼睛等等,還有就是用眼過度後眼睛乾澀 瘙癢,嚴重的時候都睜不開眼睛。遇到這些情況怎麼辦呢?身邊的親人建議敷一敷眼睛吧!可是敷眼睛還分冷敷和熱敷,怎麼敷眼睛更對症狀呢?為大家科普一下熱敷和冷敷。熱敷 熱敷眼睛可以提高眼部周圍...

大資料分析到底是乙個怎樣的概念?

很多人聽說過大資料以及資料分析師這些詞,這些詞都是最近幾年新興的事物,同時大資料分析的好處多多,比如能對公司的決策有指導作用,而資料分析也能夠體現出公司或者企業的實際情況,以及對於公司的未來有 的功能。看到這裡,想必大家已經知道了大資料分析這個工作是乙個高大上的工作了,那麼大資料分析到底是乙個什麼樣...