arm linux 開機電路_【技術角度看問題之一】ARM到底是個啥?

【小宅按】近期公司推出來基于ARM芯片的服務器,本文就一些基本概念,比如ARM, ARM64, ARMv8, ARM7,ARMv7, 64位等讓人費解的概念進行了粗淺地分析,涉及的關鍵字已用粗體標出。文中觀點僅僅是一家之言,拙劣之處,歡迎斧正。

427315e20c5b8ec8688d6dc144ebfcec.png
(圖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位。在2013年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的差別(此處為了簡潔明了的闡述我們的問題,實際過程比這個復雜,我們提綱挈領,再講就深了,后面有空再開貼)

866c93cce50dc436aad5b8bec8bb4b16.png
(圖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,側重于實時系統的場合。

Cortex-A系列: A-Profile,即“Application”-Profile,側重于應用功能的場合。

比如我司生產的Hi3798mv200芯片,大的架構基于ARMv8(又叫ARM64)的,而ARMv8中又有Cortex A53分支,準確表達應該是:華為Hi3798mv200是基于ARMv8的Cortex-A53系列的一款芯片。下面是從wiki百科扣的圖,從中可以窺出ARM家族的架構和產品系列的一斑。

94e7b80038b3e28bef3f606d40472d65.png

基于統一標準的ARMvX架構標準制造出的芯片,好處非常多,生產芯片的目的是顯然是為了運行應用程序。一個典型的場景是linux操作系統的應用,華為和三星生產了兩款不同的cortex A53芯片,內核架構是相同的,不同的是外設基地址,請參考前面“驅動”章節的描述。Linux操作系統移植到華為和三星的這兩款芯片上,只需要修改相關外設所對應的的頭文件中的基地址就可完成大部分功能的移植(注意是大部分,不是全部),當然這依賴于linux開源系統優秀的設計。基于linux以及android系統之上的應用,也實現了統一,基本不會出現一個app既要開發基于三星芯片的版本,又要開發基于華為芯片的另外一個版本的情況,從而推進了移動互聯網生態鏈的大發展(請對比考慮基于X86 linux和基于armv8 linux的確是需要開發兩套不同的APP版本的情況),ARM統一架構的好處是顯而易見的。Intel顯然已經意識到這種優勢,自己也買了ARM的授權,推出相應的“ARM核”芯片產品。

劃重點,有助于理解,試想這樣一個場景:有四款cpu,分別是1.intel x86_64,2.三星Cortex a57,3.華為Cortex a53,4.博通bcm2837,這4款cpu運行的都是64位linux 4.0,現在有個app要上市,請問這個app需要上架幾個不同版本?答案是兩個,intelx86一個,其他三個同一個。?為什么是兩個?根本原因是前面所說的指令集和驅動。

最后,再來談談我司推出的ARM芯片服務器,從本質上來看,我認為這種服務器在功耗方面與Intel x86系列差別不大,這是數字電路的原理使然,VOH和VOL(請百度)的邏輯電平是一樣的,差別在于電路工藝以及散熱等系統的設計。 我個人粗淺地認為,ARM服務器的優勢有兩點:

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

2.開源優勢,因為ARM的生態鏈上公司很多,各個公司在商業實踐過程中會產生各種新的改良建議和想法,ARM架構集中了太多的智慧,而Intel實際是在單打獨斗。一個典型的例子就是ARM的SIMD技術:NEON(下一篇我會結合NEON實例來聊GPU、人工智能、TPU)。

更多精彩內容,請滑至頂部點擊右上角關注小宅哦~

f623e95a1ecda1646b10ecf53ebfbe72.gif

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393822.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode77. 組合(回溯)

給定兩個整數 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 個數的組合。 示例: 輸入: n 4, k 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 代碼 class Solution {List<List<Integer>> cListnew ArrayList<>();public List<List<I…

linux系統配置腳本,Linux系統配置腳本開機自啟

在日常使用過程中&#xff0c;當有時候需要運行開機自啟腳本&#xff0c;同時想看到輸出結果的時候&#xff0c;不免就需要將系統配置為免密登錄模式&#xff0c;本文主要介紹再init3模式(多用戶命令行界面)&#xff0c;運行開機自啟腳本及輸出腳本指令運行數據結果。本文使用的…

WPF多線程UI更新

前言 在WPF中&#xff0c;在使用多線程在后臺進行計算限制的異步操作的時候&#xff0c;如果在后臺線程中對UI進行了修改&#xff0c;則會出現一個錯誤&#xff1a;&#xff08;調用線程無法訪問此對象&#xff0c;因為另一個線程擁有該對象。&#xff09;這是很常見的一個錯誤…

iOS------App之間傳遞數據的幾種方式

UIDocumentInteractionController UIActivityViewController Shared Keychain Access Custom URL Scheme Web Service iCloud API UIPasteboard 參考 http://enharmonichq.com/sharing-data-locally-between-ios-apps/http://stackoverflow.com/questions/9425706/share-data-b…

了解如何使用Vue.js CLI

Interested in learning Vue.js? Get my ebook at vuehandbook.com有興趣學習Vue.js嗎&#xff1f; 在vuehandbook.com上獲取我的電子書 One of them is the Vue Command Line Interface (CLI).其中之一是Vue命令行界面(CLI)。 Note: There is a huge rework of the CLI goin…

rabbitmq學習——隊列

public class Send { public static final String routingKey "wuqidi_task_durable"; /*工作隊列 也叫任務隊列 目的是將任務發送到隊列中 由工作者進行處理 在后臺的多個工作者中 任務是共享的*/ public static void main(String[] args) throws Exception{ Conne…

python 戰艦_簡單Python戰艦

我最近開始學習python&#xff0c;并決定嘗試制作我的第一個項目。我正在嘗試做一個戰艦游戲&#xff0c;隨機放置兩個3塊長的船在一塊板上。但效果不太好。我為2號飛船做了一個臨時的循環&#xff0c;它應該檢查一下旁邊的兩個空間是否空閑&#xff0c;然后在那里建立自己的空…

leetcode面試題 08.12. 八皇后(回溯)

設計一種算法&#xff0c;打印 N 皇后在 N N 棋盤上的各種擺法&#xff0c;其中每個皇后都不同行、不同列&#xff0c;也不在對角線上。這里的“對角線”指的是所有的對角線&#xff0c;不只是平分整個棋盤的那兩條對角線。 注意&#xff1a;本題相對原題做了擴展 示例: 輸…

linux 進入redis 數據庫,Linux下Redis數據庫的安裝方法與自動啟動腳本分享

安裝Redis(1) 下載Rediswget http://redis.googlecode.com/files/redis-2.2.11.tar.gztar xzvf redis-2.2.11.tar.gz(2) 編譯并安裝Redismake && make install(3) 復制并修改配置文件cp redis.conf /etc/redis.confvi /etc/redis.conf注意修改以下幾項&#xff1a;daem…

Flutter 36: 圖解自定義 View 之 Canvas (三)

小菜繼續學習 Canvas 的相關方法&#xff1a; drawVertices 繪制頂點 小菜上次沒有整理 drawVertices 的繪制方法&#xff0c;這次補上&#xff1b;Vertice 即頂點&#xff0c;通過繪制多個頂點&#xff0c;在進行連線&#xff0c;多用于 3D 模型中&#xff1b; drawVertices 包…

sphinx 項目根目錄_如何使用Sphinx工具記錄Django項目

sphinx 項目根目錄I recently visited a company where I had a nice talk with one of its employees. We talked about technology and programming. Then we touched the subject of project documentation. Specifically how React does it automatically but Django doesn…

程序員必知之浮點數運算原理詳解

導讀&#xff1a;浮點數運算是一個非常有技術含量的話題&#xff0c;不太容易掌握。許多程序員都不清楚使用操作符比較float/double類型的話到底出現什么問題。 許多人使用float/double進行貨幣計算時經常會犯錯。這篇文章是這一系列中的精華&#xff0c;所有的軟件開發人員都應…

axure選中后橫線切換_3、開關狀態切換 —— Axure實用交互

寫在開頭:開關的制作在幾乎所有原型設計中都會用到&#xff0c;所以美觀自然的交互開關可以給你的原型設計加分不少。本次開關設計主要用到的是邏輯為&#xff1a;選中狀態的切換首先&#xff0c;來看一下演示動畫開始原型設計一、創建元件首先需要打開Axure軟件&#xff0c;并…

Django框架——模型(數據庫操作)

-- models.py-- ORM(object-relation mapping) 實現數據模型與數據庫的解耦&#xff1b;# 對象&#xff0c;關系&#xff0c;映射&#xff1b;1.根 據對象的類型生成表結構&#xff1b;2.將對象、列表的操作&#xff0c;轉換為sql語句&#xff1b;3.將sql查詢到的結果轉換為對象…

leetcode140. 單詞拆分 II(回溯+記憶化)

給定一個非空字符串 s 和一個包含非空單詞列表的字典 wordDict&#xff0c;在字符串中增加空格來構建一個句子&#xff0c;使得句子中所有的單詞都在詞典中。返回所有這些可能的句子。 說明&#xff1a; 分隔時可以重復使用字典中的單詞。 你可以假設字典中沒有重復的單詞。 …

#loj 3058 [HNOI2019] 白兔之舞

單位根反演思博題 模數是亂給的記得整個任意模數ntt k為p-1的約數意味著一定存在k次單位根&#xff0c;設g是p的原根則\(w_{k}^{1}g^{\frac{k-1}{p}}\) 既然k次單位根存在自然考慮單位根反演了 設\(f(i)\)表示跳了i步并且停在了第二維為y的頂點的方案數 設\(st\)表示初始向量而…

標桿徐2018 Linux自動化運維實戰,標桿徐2018 Linux自動化運維系列⑦: SaltStack自動化配置管理實戰...

結合企業自動化集群場景講解&#xff0c;輕松玩轉SaltStack自動化配置管理工具第1章 SaltStack基礎應用SaltStack安裝SaltStack認證Saltstack遠程執行SaltStack配置管理第2章 SaltStack數據系統SaltStack數據系統-Grains 客戶端向服務端發送狀態SaltStack數據系統-paiil 服務…

JS 對象引用問題

var a {n:1}; var b a; a {n:2}; a.x a ;console.log(a.x);console.log(b.x); var a {n:1}; var b a; a.x a {n:2}; console.log(a.x);console.log(b.x); 這兩個問題主要理解兩點就很簡單了。 對象是引用類型&#xff0c;改變賦值只是改變指針的引用。運算符相當于改變…

工程代碼_Egret開發筆記(二)基礎工程代碼閱讀

代碼目錄結構在Egret Wing中打開上一節中我們創建的項目工程&#xff0c;查看代碼目錄結構&#xff0c;Forward在如下圖中標記了各個目錄的及關鍵文件的用途。代碼閱讀理解接下來我們從web入口一步一步閱讀初始代碼。首先打開index.html文件&#xff0c;我們看到index文件內容如…

知曉云助力小程序開發

小程序開發遇到瓶頸雖然騰訊提供了小程序解決方案&#xff0c;https://cloud.tencent.com/solution/la。但是對于普通開發者或者小企業的開發人員來說&#xff0c;購買域名&#xff0c;網站備案、部署SSL證書&#xff0c;安裝會話服務器。業務邏輯上要使用數據庫&#xff0c;緩…