為什麼Windows可以安裝在所有不同的PC上,而安卓刷機包必須對應機型?
Windows的驅動比安卓豐富,這個很多人都說了,我不重複,操作系統的尺寸擺在那呢。
@崔巍 提到了實模式和BSP,其實這跟實模式沒什麼關係,說BSP倒是對。而在x86體系里,最重要的一環是BIOS和ACPI。在這個問題里:為什麼Intel的CPU要規定加電時進入實模式?直接進保護模式不可以嗎? - 中央處理器 (CPU) - 知乎,我有更詳細的說明。
操作系統要啟動不同硬體配置的計算機,首先要知道硬體配置。比如說CPU是什麼型號的,橋片是什麼型號的,有多少條PCI,各個IRQ怎麼連接的。在x86體系里,BIOS、ACPI可以告訴操作系統具體的硬體配置(UEFI也有類似介面)。
安卓的刷機包問題在於,非x86體系里,沒有一套公共的機制能告訴操作系統,設備的具體硬體配置情況,這樣的話軟體根本沒辦法知道硬體驅動。比如網卡,在某個設備上用的IRQ是10,在另一個是11,而操作系統沒辦法知道這些信息。
所以安卓(以及Linux、嵌入式開發等)需要BSP(board support package),需要根據硬體來定製一些最基礎的代碼。
所以安卓系統不能像Windows那樣適應多個機型,哪怕帶上足夠的驅動也不行。
那麼ARM架構為什麼不搞類似ACPI或者BIOS的東西?因為ARM是賣CPU的(準確的說只賣授權),BIOS這套體系是在IBM之類的賣機器的廠商推動下發展起來的,而不是單純靠Intel推動的,兩家走的路完全不同,自然ARM沒辦法做類似的事情。
(註:制定ACPI標準的時候,是Intel和微軟一起坐下來討論的,但ARM沒這個條件,做硬體的是ARM沒錯,但做安卓的軟體廠商就太多了,而且內核又是Linux,即使跟谷歌談,也不一定能推動整個Linux社區跟著改)
ACPI也不是完美的,因為它實際上是在內存里放著的,有些硬體在軟重啟時不重置ACPI的信息,就可能導致ACPI有可能被人修改而導致安全問題,所以現在又有了UEFI,總之,這些東西是告訴軟體,硬體都有什麼東西。感謝CPU實模式的偉大堅持。
————
計算機的工作方式:啟動-CPU實模式-啟動實模式的代碼-載入操作系統-操作系統控制如何載入驅動。
手機的工作方式:啟動-載入BSP代碼控制的工作模式-直接啟動系統。簡單理解上,電腦是先載入系統的引導程序(通用),再真系統與驅動;手機的模式是直接載入驅動,再載入系統。
CPU實模式簡單理解:不論你的電腦多新多牛逼,開機的一瞬間,它就是一台386帶1M多點的內存。不論你的操作系統多新多牛逼,開始引導的那塊代碼必須在這個老古董的機器上跑起來。
————
驅動,英文原名driver,就是個司機的概念。你有了車,但是你不會開,或者開的不夠好,所以你雇個司機來開車。司機開的是你的車,車歸你所有,司機只是執行你的命令。你可以隨時招募一個司機來開車,也可以隨時把司機扔出車外。對於計算機系統,整個CPU和RING0、整個內存、整個IO都是它一把抓。在系統啟動後並讓BIOS回家睡覺後,它就是計算機絕對的老大。所有的驅動,要麼通過操作系統與硬體通訊;要麼在操作系統的允許下,使用操作系統批准的內存、進程、IO與硬體通訊,而別忘記這些仍然是完全被操作系統掌控的。
對於手機來說,情況不一樣。BSP隔離了系統與硬體。系統想與硬體發生任何關係,都必須通過BSP進行。而硬體加電的時候,是先初始化掉BSP的部分,才由BSP來啟動系統。這時候系統只不過是個資源管家而已,表面看來控制了整個場面,但實際上如果工人不幹活它就只能幹瞪眼。
所謂的硬體是否標準、驅動是否兼容也是跟這個沒太大關係。每個廠家每個代際的CPU、不同型號的主板晶元組,指令集都不能做到兼容。但是根據計算機的要求,他們必須支持工作在CPU實模式下,除非他們不參與啟動過程。
那計算機裡面有沒有類似BSP的存在呢?有,也沒有。在位置上,有。BIOS就是一定程度上實現了BSP的工作。它負責了啟動過程,並提供了各類「中斷」。上層操作系統可以通過調用中斷實現訪問硬體的功能。在控制上,沒有。BIOS只是被啟動的第一段代碼,而不是一個永遠佔據最終控制地位的代碼。BIOS已經習慣於被卸磨殺驢。從上個世紀90年代中期開始,每次啟動系統後,操作系統在被BIOS叫醒後就將CPU轉換為保護模式,從而間接的把BIOS冷凍起來。而新的硬體由於只需要工作在新的操作系統下,而不參與啟動過程,所以都無需考慮如何與BIOS匹配。新的計算機更是可能直接用EFI取代了BIOS的功能。驅動程序問題。
Windows系統中一般會帶很多通用的驅動,即使不是全功能的,也能保證正常開機運轉。需要的可以在另外去安裝具體硬體的專用驅動。
而安卓手機有時候不太可能做這種通用的驅動,由於各家手機廠商的硬體有時有些封閉並不對外提供驅動。每個刷機包內一般只包含該機型對應的驅動程序。對於很多手機廠商使用自己定製的安卓系統,如果要安裝原版安卓系統的話,需要從原來的系統包中提取出驅動程序,然後植入到原版系統中,再打包成刷機包。這樣搞一般來說非常費勁,也源於安卓系統並沒有像Windows一樣設計成那麼好的通用性。
舉個比較相近的例子,Mac OS系統如果強行安裝在除了Mac之外的其他電腦上,一般都會面臨驅動的問題導致無法正常使用。
其實主要是因為很多廠商壓根不對外提供驅動程序。
感覺嵌入式硬體的問題其實不大啊,在沒有acpi和uefi的時代pc操作系統不還是有自己的一套枚舉外設的方法,當然確實是和pc的各種匯流排設計有關,gpio枚舉的難度確實略大,但是如果硬體廠商願意公開硬體枚舉,握手,初始化,配置等等這些流程的話,即使在這種嵌入式系統上操作系統也完全不需要依賴bsp,只不過需要特殊的「匯流排驅動」來枚舉外設。不過可能使得開機時間變長一些。
這還不是android設計的鍋,這麼輕易得放棄開源傳染性。其實也不是,因為android如果不這麼搞可能現在的主流手機系統就不是android了。
當然實際上,因為arm/嵌入式平台的「嵌入式」三個字,導致手機硬體工程師們是以嵌入式的思維做硬體,而嵌入式從來是軟體將就硬體的,所以arm的匯流排枚舉機制比較坑,也沒有統一標準,所以更加加重了通用os的困難。
所以其實……我們pc用戶要感謝pci。windows有統一的架構和分區,無論是安裝系統還是更換系統都有統一的流程。
安卓刷機是由於各個手機架構不一樣廠家定製也有差異,底層分區等等各不相同, 所以安卓刷機包不能通刷 。
實際上就是硬體和軟體分的不夠清晰,android主流硬體基於arm,arm從啟動到引導沒什麼像pc/at那樣的公共規範,本來也是專有硬體,各個廠商為了拉開距離也是搞得五花八樣~所以搞不了通用的。現在有了個機會,UEFI開始在arm上發力,ms和高通的合作已經取得了階段性成果。我知道的高通的8996有UEFI for LA版BSP.當然出於商業考慮或者各家方案提供商的成熟考慮,不知道回不回被應用到實際設備。
驅動程序問題。Windows自帶了好多通用驅動,而且你還能自己裝驅動。另一個似乎不能自己裝驅動。
現在Windows 10的 iso 已經 over 4gb了。如果你們接受一個 update.zip這麼大,倒也無妨。
一個內核自帶大部分硬體的公版驅動
一個內核只帶自己硬體的驅動以壓縮體積而且電腦隨時可以更換/升級硬體,手機是定死了aha 這個原因很多。
總體上最大的原因是Google目前還沒有完全收緊對Android的控制,控制點還只是在CTS和GTS上,各設備廠商的自由度還比較大。但這不代表Google不願意或者沒想過把Android做到Windows的控制程度。。
系統鏡像本身含帶的驅動量不一樣,還有一點就是windows裝載的大部分機U都是符合行業標準的,而手機上的U不一定,雖然都是ARM公版改良。
Android也可以安裝在PC上啊!Android x86你們沒用過嗎?鳳凰os remix os聽過吧?但是Windows可以安裝在手機上嗎?
說個題外話,你有了解過最近市場上的Windows10平板嗎?就是搭載英特爾Atom晶元的X86板板,這些平板大多數是安卓+Win10雙系統!而且,它是有Bios和uefi啟動的!這意味著它能夠像電腦一樣安裝任何系統!受限於經濟問題(好了 承認學生黨沒錢買平板)我是借別人的平板研究的。。。
...
各位答主說的都有道理,我還是忍不住bb幾句。歡迎互懟!這倆個系統不是一個時代的產物,註定了走不同的道路。微軟貌似一直是靠賣軟體發家致富的,華碩聯想IN,ADM應該都是靠賣硬體賺錢的。所以大家為了更好的賺錢,賺大錢,在一起搞個統一標準什麼的,皆大歡喜。但是安卓不行啊!我想不僅中國,整個地球都知道,賣硬體不賺錢。賣軟體也不賺錢,只有軟硬結合才賺錢,你看小米就是個好例子。內置軟體,應用市場,音樂等等。這都是流量呀!這個時代流量不就是金錢嗎?所以大家想想,如果小米手機可以隨便刷系統,那你有什麼理由買小米手機?直接買個8888塊錢的手機,一天換一個系統多爽!2333333333
windows的賣點就是這個
pc系統的一家獨大,windows是個商業系統,不公開源碼,無法定製,無法碎片化,大家都用我這套標準,就也沒有必要系統差異化了。安卓不同了,隨便玩,定製化就出現了。
不為啥 商業原因
一個手機有好多層的,一般用戶面對的是應用程序,對應用開發人員來說sdk.ndk就到頂了。然後手機廠家有fw.hal.驅動程序。這些有Java,有native code 個家都會用不同的廠家的硬體,無線方案,攝像,音頻,顯卡晶元等方案,這個都是大的模塊,小的器件更多。然後哪個接到那個口,用哪些內存,都是沒有具體的規定的。導致驅動就會亂來的。每家都不一樣。然後hal層也是個家不一樣的,hal和fw隔離做的不好的,再耦合。說到底,開源,規矩沒有做好,導致可替換很難。
歷史沿革上原生系統問題也多,沒有辦法要求太多,先用起來,佔領市場。
現在一些問題也挺難搞的,比如死機,功耗問題。如果你說的實現,後面測試會死人的。同樣的問題。Linux也可以幾乎安裝在任意pc
推薦閱讀:
※互聯網開發如何保證後台交付質量,聯調效率?
※大家都是怎樣處理Gradle中的這個文件下載慢的問題的?
※怎樣從零開始學習安卓軟體開發?
※如何防止 Android App 被反編譯後介面泄露?
※Smartisan OS 全局禁止第三方桌面小工具(Widgets),會為其帶來哪些好的和壞的影響?
TAG:MicrosoftWindows | Android開發 | Android手機 | Android | WindowsPhone |