為什麼Windows可以運行在不同的硬體環境下?
不同的電腦有時候硬體差異很大,為什麼Windows都可以在這些電腦上運行?
適配/驅動程序
不同硬體提供自己的驅動程序,插到操作系統中。操作系統可能自帶一些常用的驅動程序,但是一些不常用的硬體,你就需要從光碟或網上下載驅動程序。
操作系統只跟輸入輸出設備的驅動打交道,比如顯卡,音效卡,滑鼠,鍵盤,遊戲手柄,手寫板,印表機,硬碟,軟盤,光碟,而由驅動程序和這些硬體打交道,這就簡單了,對嗎?
標準/協議
不同的硬體遵從相同的標準,比如USB,TCP/IP,HDMI,PCI,ATX這些硬體就可以彼此協作起來。
指令集/CPU
操作系統需要根據指令集和CPU的特性進行編寫和編譯。指令集就相當於一種標準,操作系統就可以跑在支持指令集的CPU上。目前Windows支持的主要指令集是X86,X86-64,ARM等。
而且好長時間內,Windows只支持X86,因此和Intel結成了Wintel聯盟。當時的6502,68000,21064,Power PC,MIPS,Windows都不支持。
生態
龐大的兼容機市場,Windows這麼大用戶量,哪個個人電腦的硬體不支持Windows不是找死嗎?
在家用電腦和商業電腦中(不包括伺服器和移動設備),大多數還是Windows吧,OSX只能合法地安裝在Apple自己的硬體上,而Linux的桌面發行版對於最終用戶來說還有一定難度。
硬體差異,不用考慮外形差異。題主所說的硬體差異應該是指
1.不同品牌的,不同大小,規格的內存。
2.不同的音效卡,顯卡3.不同的cpu4.不同的晶元組等等。這其實是一個互相兼容的結果。首先,不同的廠商設計的電腦他都有類似的結構,遵循一定的規範。比如,都需要有cpu,內存,顯卡(沒有其實也可以)等等。其次是這些配置硬體本身也都是要遵循一定的規範,例如絕大多數pc 的cpu都是x86和x64架構,那麼這就簡化了很多問題。win只要去適配好這些指令集的cpu,並能識別對應廠商的特定型號的cpu,針對性的優化。這背後當然少不了intel和amd的支持,台灣的那家就不算了。顯卡都支持標準驅動,那麼即使沒有特定顯卡的驅動,win也能夠按照標準顯卡的方式驅動特定顯卡,由用戶事後來安裝特定的驅動。內存的不同規格也有類似的標準,win只要支持這些通用的標準即可。同樣這反過來也要求,硬體和模塊設計者本身按照標準來,否則不被支持。如上。能做到這一步,實際上即使在互聯網高度發達的今天,也是非常牛逼的。蟹妖。開頭說結論,windows看上去兼容了五花八門的硬體,其實本質上首先是兼容了一個核心x86。在此基礎上,x86晶元組提供了非常良好的擴展性,可以兼容非常多的外部配件(人可以兼容非常多的衣服,其實是因為這些衣服都是為人設計的)。由於wintel之間不能不說的py關係,所以windows才變成現在這樣。
btw(正餐系列):windows的系統設計時候就是基於x86考慮的,這個從最初的ms dos開始一路走到黑都是這樣,所以現在ms試圖去兼容arm會遇到非常多的問題。而真正意義上的系統兼容性王者是linux,linux在設計上很少為cpu特化,大部分都是自己設計的feature,性能可能會受到一定影響,但是有興趣可以去看看linux兼容的cpu架構列表…… 至於windows為x86特化的例子,頁表是很典型的一個。
題主提到的"這些"平台有個特點,就是基於x86-64的平台,同時遵循ACPI,所以巨硬Windows能在上面跑,脫離了這些特點,windows跑起來恐怕會有很多問題,需要底層改動,近期的高通平台windows好像就準備許久了,通過改進底層實現了x86應用的兼容。
因為Wintel聯盟的原因,制定了兼容PC的標準。大家品牌再多,只要還在標準之內,就能用。
你讓Windows跑在龍芯上試試……不行!不是Windows能安裝在任何平台,而是就兩個主流平台,Intel和AMD。市面上幾乎所有的PC,不是Intel就是AMD,適配起來當然簡單咯。除CPU以外的所有硬體,只需要通過安裝驅動就行。
一句話結論就是,別看windows安裝包大,裡面一大半都是各種驅動
你可以想一想
DirectX,各種驅動的存在是幹嘛用的
至於蘋果,你見過這些東西嗎
你裝黑蘋果的時候也會注意到最麻煩的就是修改硬體配置文件
做引導,比若說四葉草吧,你要修改config.plist文件,這個就是為識別硬體做準備的
你再想想為什麼Linux也可以運行在不同的硬體平台上
因為也需要驅動來兼容各個硬體
但由於Linux強制開源的性質
導致了各大硬體廠商並不喜歡給Linux提供支持
進而也導致Linux用戶娛樂體驗差的結果
如果指的是具體的硬體外設的不同,開發相應的設備驅動程序就可以解決。有些驅動可以在用戶態的某個宿主進程中運行。必須開發內核態驅動的,也可以通過內核態下部分公開的介面和工具包,由第三方開發驅動。如果指的是CPU體系架構的區別。當代的操作系統無論Windows還是Linux都儘可能設計成易於移植的。有人認為Windows只適用於x86/x64,這種看法是不正確的。Windows自從問世以來有兩條並行的發展路徑:Win 1.0、Win 2.0、Win 3.0、Win 3.1、Win 95、Win 98、Win Me。這條路徑嚴格依賴x86架構,充斥著大量的16位不可重入的舊代碼,不支持多處理器。進入新世紀後已被淘汰。另一條路徑是Win NT 3.1、NT 3.5、NT 3.51、NT 4.0、Win 2000、Win XP、WinServer2003、Win Vista、WinServer2008、Win 7、Win 8、WinServer2012、Win 10、WinServer2016。這個基於微軟從上個世紀80年代末把David Cutler從DEC挖來主持開發的NT內核。從開始設計時就考慮了可移植性。大部分代碼用C/C++寫的,只有直接與硬體交互或者對性能要求很高的代碼才用彙編寫,並且與其他代碼仔細的分開以便於移植和維護。為了確保可移植性,一開始編碼和測試時刻意採用RISC機器,後來才往x86移植,可能也跟起初x86的性能弱於RISC工作站有關。後來RISC處理器在桌面系統的份額遠不及x86了,這一OS發展路徑才取消了對一些RISC機器的支持。具體來說:NT 3.1/3.5支持MIPS、Alpha、x86NT 3.51/4.0支持MIPS、Alpha、x86、PowerPC2000支持Alpha、x86XP/2003支持x86、x64、ItaniumVista/Win7支持x86、x642008支持x64、ItaniumWin8支持x86、x64、ARM32(WinRT)
2012支持x64
Win10支持x86、x64、ARM642016支持x64、ARM64電腦硬體差異不大啊,都是x86
差異再大的硬體 也是遵循介面規範的。
其實和蘋果系統之類的相對比,windows系統類似一個標準,處在良性循環中,不是它去兼容硬體,而是硬體來兼容它。
首先要給你科普一下:
win10是一個以x86架構為主的系統,只要你的硬體架構是x86理論上都能給你強行裝上去
但是微軟也一直在嘗試給arm架構裝win10,參考以前的win10rt版和最近和高通合作的事宜。
所以並不能說是win10能在不同電腦上運行,而是win10可以在x86架構的電腦上運行
而win10對於硬體的優化是非常好的,親測8年前的電腦都能流暢運行,這歸功於系統的工程師的優化功勞。
以上,win10隻不過是一個兼容性很好切配置要求相對較低的x86架構系統
說實話第一次聽說Windows可以運行在各種平台上
除了極少數特殊版本,Windows只能運行在x86-64平台上……軟體沒辦法去兼容硬體,因為指令集不一樣比如在x86架構下加法用彙編表示為add ax, bx(ax與bx相加結果保存在ax中),arm下則是add R0,R1,R2(R1與R2相加結果保存在R0中),可以看到這兩者區別有多大,甚至一個指令集中的加法在另一個指令集中卻可能是減法(理論上可能,實際上確實會有差異(我說的是指令的差異,似乎有人理解錯了,,,),但可能存在業界標準)這樣無論代碼怎麼寫都不可能正常運行。硬要兼容只能重新編譯甚至重寫(高級語言不操作寄存器,所以只要重新編譯,編譯器會替你解決問題,但是如果用到了彙編,那就要重寫了),不過如果兩個型號的CPU是同一套指令集的話就不需要了。
Windows兼容性不算很好吧,只不過PC 幾乎用的都是x86和x64所以只需要分清楚32位的還是64位的就行了,然而ARM方面我只見過很少的機型可以運行,比如樹莓派的版本(這是專門適配的)。
至於顯卡之類的兼容性問題,NT是混合內核,驅動又不寫入內核,只要Windows還有人用,驅動自有人來寫,不用微軟去操心兼容性。
倒不如說,是硬體選擇兼容windows,更進一步是兼容x86
我想你應該弄混了一個概念,軟體和硬體是密切相關的,分不開的。
所以,操作系統會根據新的硬體標準編寫底層代碼,而不僅僅是你看到的GUI操作界面。
一個成熟的硬體規範,可以使用很多年。
舉個例子,USB3.0 ,在老舊的BIOS主板上,是沒有這種介面的。
而此時的操作系統版本(WINDOWS)假設為WINXP;
基於以上情況有兩種可能:
1、winXP已包含了usb3.0介面驅動(傳輸協議比硬體普及要早),新主板包含USB3.0介面,裝了XP也一樣能用。
2、winXP未包含usb3.0介面驅動(硬體先普及,系統後續升級),於是主板自帶USB3.0驅動,winxp安裝一下主板附帶的光碟中驅動,即可使用USB3.0.
所以,總結一點,雖然硬體差異很大,但是硬體底層規範是沒有太大變化的,即便有,也可以使用驅動實現更新,實在不能更新的,也基本上瀕臨淘汰了,這個淘汰的周期,就是硬體設計規範和軟體商更新代碼的緩衝期。
操作系統 = 底層代碼 + 驅動 + GUI界面
以上,個人見解。
如果是為了搞清楚跨平台,那可以看看linux,他支持的更多,而且是開源,資料也更多。
你讓Windows在單片機里運行一下吧……
推薦閱讀:
※編程的時候 命名 方法或變數 詞窮了怎麼辦?
※學過C,如何快速上手C++?
※清華大學計算機系與普通大學計算機系的區別?
※自學c#目的unity遊戲開發,基礎幾乎為零,沒學過數據結構和演算法。怎麼辦?
※如何通俗易懂地解釋什麼是演算法?