標籤:

linux為什麼可以支持多個架構的CPU?

我實在是小白中的小白,又第一次利用知乎提問,所以可能問題問的不夠清晰請原諒。

是這樣,我看到很多地方說linux能實現硬體無關是因為內核把硬體無關部分和硬體相關部分分開了,移植的時候只要修改硬體相關的部分就可以了。我不太理解的是,這個硬體相關的部分是什麼?驅動嗎?換個問法就是,假設某廠商生產了一款全新架構的CPU,假設就叫「真漢芯」。如果它想要Linux能運行在上面,它會做哪些事情呢?又比如有一款應用軟體,能再X86的linux上運行,如果它想在「搭載真漢芯」的計算機中運行,需要作出哪些改動呢?

非常感謝回答問題的人


推薦初步了解下計算機體系結構,任何操作系統要想做到跨平台,必須在底層將硬體抽象出來,再建立在HAL上,編寫與體系結構無關的代碼。

推薦你下載一份linux源碼,查看下arch文件夾下的內容,大概你就明白為什麼這麼做了。


你要是出了一個前所未有的架構,當然要去改linux的代碼,然後說服linus來merge你的東西,然後linux才能用在你的新架構上。


應用程序如果不涉及底層操作並且沒有自帶奇怪的假設的話,倒是應該沒多少需要改的地方。

操作系統這邊,你首先需要自己移植gcc到新的平台下,然後把linux內核里跟硬體直接打交道的那部分(主要在arch/目錄下面)針對新體系結構重寫一遍。

能不能說服linus來merge是另一回事……我覺得還是取決於你的硬體賣得好不好。不過從名字上來說大概賣不好……總之如果硬體沒什麼銷量,linus拒絕你的merge request,你是這個fork的唯一維護者的話,你就要不然永遠用一個特定的linux版本,要不然每次linux升級了你自己要做相應的維護……

EDIT: 如果系統調用的機制有變化的話(幾乎是一定的)應該libc一類的地方也要跟著改一下,不過工作量大頭應該還是改編譯器和內核上。


除了改動Linux arch相關代碼,你還要添加編譯器的支持新的架構ABI,讓編譯出來的彙編碼兼容新架構的指令集。這還不夠,你還要小心解決多核,cache等並發同步問題,否則運行效率非常低下。


抽象


架構相關的部分在arch目錄下,下面有不同架構處理器的實現. 當你編譯內核的時候,需要配置架構,makefile會吧相應架構的目錄加進來。


一個c編譯器,一個彙編器,寫的好的話代碼都不用改一條


一個架構一份代碼撒。跨平台這麼做,跨架構應該也沒有太好的解決方案。


推薦閱讀:

內核頁表和linux的夥伴系統是不是有衝突?
諸如 __u32 __u16 __u8 這類定義主要適用於什麼情況?
學習操作系統的知識,看哪本書好?
C語言里,main 函數中 return x和 exit(x) 到底有什麼區別 ?
為何linux作為伺服器端十年不重啟都不卡而安卓用半年就十分卡?

TAG:Linux內核 |