題:
為什麼會有這麼多不同的Android內核(請提供技術答案)
user974896
2012-08-11 01:03:15 UTC
view on stackexchange narkive permalink

Android不是所有設備上都使用的通用內核嗎?例如,CentOS將安裝在Dell,HP和其他各種硬件上。當然有不同的模塊,但仍然是CentOS。

CyanogenMod總是“損壞”的原因是什麼?我經常在論壇上聽到他們正在努力移植該驅動程序或該驅動程序。如果他們使用相同的內核,驅動程序就不能使用它嗎?我還看到了用於不同設備的一百萬種不同類型的內核。

六 答案:
t0mm13b
2012-08-11 02:36:12 UTC
view on stackexchange narkive permalink

內核因製造商而異。這些內核中有很多來自CAF上的純內核內核,這些製造商所做的就是獲取這些內核,根據所使用的主板/芯片組對其進行修改,以實現其適應性,同時實現自己的驅動程序。

好好看看周圍,有各種觸摸屏,各種WiFi芯片組,更不用說加速度計,傳感器,電池,指南針,聲音,圖形了。

從中獲取一個內核源示例HTC無法在Samsung上使用,反之亦然。

製造商可以自由選擇或外包各種整合到電路板中的位。沒有硬性規定或快速規定。因此,要使內核正常工作,需要進行大量修改/修改。

您絕對不能與擁有PCI,PCI-Express,SATA,VGA,SVGA,USB的台式機Linux發行版內核進行比較。以太網,因為它們是完全不同的遊戲。與CentOS和Android的Linux內核的主要區別在於- ALL 驅動程序可以模塊編譯或內置編譯,因此任何Linux發行版都將“立即可用”。同樣,在台式機Linux發行版中-您只有一種體系結構-x86,因此,例如戴爾PC上的一個Linux內核,可以在聯想已提供編譯標準驅動程序的情況下立即使用。 / p>

別忘了,在Android世界中,為特定的ARM芯片集(例如ARMv6,ARMv7,TEGRA,EXYNOS)構建的內核有多種版本,並且它們彼此之間是二進制不兼容的。因此,如果為TEGRA編譯了內核,則將其忘記,它將無法在ARMv7上運行!

製造商認為,Android上的某些內核似乎“損壞”的原因。某些(Zte是一個很好的例子)釋放了一個被宰殺的源,該源可以從源編譯,但由於缺少GPLv2或GPLv3許可證未涵蓋的驅動程序而無法啟動。這就是問題所在,因此一些黑客必須在github上搜尋以尋找一些線索。一些製造商(如果不是全部)確實遵守。 Zte的源代碼的當前版本據稱是2.6.35.7,但實際上它實際上是2.6.32.9的源代碼庫,經過大量修改,因此並不代表2.6.35.7的真正內核源代碼!

製造商必須在這裡發佈各自的資源,不僅僅是出於與GPLv2或更高版本的兼容,而是為了使社區能夠對其進行修改,例如添加超頻功能。

因此,幕後涉及到黑客攻擊,並且很多試圖使它工作的驅動程序都弄得一團糟,而且也不容易調試。.有些驅動程序可能是交叉許可的, BUT 可能無法分發,具體取決於商定的條款和條件。

幸運的是,現在內核3.x.x改變了一切。來源,因為Android驅動程序現已集成到主流來源中。但是有一個陷阱!

嘗試移植3.x.x。內核安裝到大約12-18個月大的現有手機中;在地獄中滾雪球的機會不會起作用,這是因為,由於因素的不同,3.xx源代碼與2.6.x源代碼有很大不同,並且需要花很多時間才能使其正常工作-我應該知道,已經嘗試過為Zte Blade移植2.6.38.6源並失敗。

同樣,最新的內核版本3.0.1-在Modaco上的ics4blade項目上工作時,已經進行了很多嘗試來移植它,但這歸結為簡單的事實,即Zte造成了非常糟糕的混亂。使得幾乎無法移植的資源。

到處投票!!!感謝您的詳細回答。
不客氣!您需要了解的其他任何信息! :D
用你的話說,驅動程序並沒有全部編譯成模塊,而是集成到了內核本身,因此,即使CM在設備上獲得可用的內核,它也不能簡單地“將XXX模塊”移動到新版本並使其工作,因為可能沒有XXX moduels。必須對驅動程序進行追捕,破解(可能)並重新編譯。
正確,並且驅動程序也不同,因此一個手機上的觸摸屏驅動程序將無法在使用其他觸摸屏的另一手機上運行。另外,要注意的另一個要點-一些驅動程序取決於內核版本-Zte推出了適用於Blade的Atheros Wifi驅動程序版本,該驅動程序將無法工作,除非內核的版本為2.6.35.7,或其他任何版本, wifi中斷-這是通過一種相當破爛的方式演示這種依賴性的過程。
Wyzard
2012-08-12 00:27:13 UTC
view on stackexchange narkive permalink

PC體系結構是圍繞商品零件構建的,因為它最初是特定產品(IBM PC)的克隆而設計的,專門設計為與之兼容,因此彼此兼容。一般而言,您可以從一台兼容PC的程序或外圍設備中將其放入另一台PC中,然後期望它能正常工作。這種功能足夠有用,以至於技術不斷發展,人們仍然不斷要求它。您可以將PCI Express卡放在任何現代PC上,就像將ISA卡放在當時的任何PC克隆中一樣。

智能手機沒有這樣的歷史。它們被設計為整體產品,一個完整的系統,包括按原樣“正常工作”的硬件和軟件。人們不會期望人們將一部手機拆下來放進另一部手機中,因此工程師在設計產品時不必考慮互操作性。

即使在Linux內核源代碼樹中, ARM平台的驅動程序中有很多碎片。由於電話通常是閉門造車的,因此不同公司的工程團隊通常會做重複的工作,設計與競爭對手基本相同的硬件,然後為自己的設計編寫自己的驅動程序。一旦完成並發布了產品,便可以直接著手開發下一個產品。浪費他們的時間去重構過去產品的驅動程序或將它們與競爭對手的驅動程序合併是不值得的。結果是為相似但不完全相同的設備提供了大量一次性驅動程序。

此外,智能手機通常基於 SOC,後者俱有與處理器集成在一起的專用硬件。對於某些情況,這不僅僅是要加載某個驅動程序,而是要加載一個驅動程序。整個內核可能需要使用在一個SOC上運行的特殊配置選項來構建,這與在另一SOC上運行所需的特殊選項不兼容。

Lie Ryan
2012-08-11 10:30:15 UTC
view on stackexchange narkive permalink

原因是因為Android的Linux內核通常不是在Android本身上編譯的,而是必須從另一台計算機交叉編譯的。這會導致各種問題,因為設備配置在編譯時不可用,並且由於空間限制,用所有驅動程序編譯通用內核是不可行的(而大多數桌面發行版只是將所有驅動程序編譯成從initramfs加載的模塊)。 。因此,開發人員必須找出為每個特定設備打包的驅動程序。不僅如此,每個驅動程序通常都有十幾個編譯時選項來切換各種驅動程序功能,而且製造商通常不會發布其官方配置(最嚴重的違規者甚至不開源其驅動程序,或者不保留上游驅動程序的功能。驅動程序副本)。因為製造商不發布其配置,所以開發人員使用的略有不同的配置通常會暴露出製造商配置中不存在的細微錯誤。

驅動程序編程比應用程序編程困難得多,因為沒有內核可以保護您免受具有特定實時定時要求等變化無常的硬件的侵害,這意味著甚至具有不同的性能。特性可能導致驅動程序錯過一些來自硬件的實時事件;這些錯誤可能會由於錯誤或性能問題而浮出水面。

另一個問題是二進制不兼容。二進制不兼容的原因有兩個,首先是CPU類型,這已經由t0mm13b很好地解決了,但是與移植更相關的另一個問題是ABI不兼容(應用程序二進制接口)。如果製造商不開源其驅動程序,那麼開發人員必須使用庫存ROM中的編譯模塊。這引起了各種ABI不兼容問題,因為驅動程序模塊本身對例如結構佈局和函數調用參數有特定的期望,並且在編譯內核時,它沒有在驅動程序時描述ABI的頭文件。由於已編譯,因此開發人員必須對驅動程序進行反向工程以創建頭文件,否則源代碼樹中的頭文件可能已被大量修改,因為驅動程序已被編譯,並且開發人員必須還原這些修改以使內核再次與驅動程序的兼容ABI。與從源代碼進行編譯不同,對於二進制驅動程序進行編譯不會因功能參數不匹配或結構不兼容而觸發編譯錯誤,只會使設備在運行時崩潰,因此調試這些問題非常困難。在PC世界中,我們很熟悉nVidia和ATi所帶來的混亂,因為他們堅持只發行二進制驅動程序,想像所有驅動程序都陷入混亂,想像它創建的“樂趣”。

PC硬件通常也比移動硬件更好地標準化,大多數PC不需要振動器,加速計,陀螺儀,3G無線電,接近傳感器,NFC等驅動程序。即使在具有3G的設備上,它通常也可以連接到硬件使用諸如PCMCIA或PCI-E之類的標準化連接。

Bryan Denny
2012-08-11 01:22:15 UTC
view on stackexchange narkive permalink

嗯....驅動程序和內核並不完全相同。

驅動程序是控制單元天線,wifi,藍牙等的驅動程序。這些是專有驅動程序,因為製造商必須創建一個

內核是操作系統/應用程序與實際驅動程序(或cpu或內存或任何其他硬件)之間的中間層。正是這樣,您的OS / app才能與這些硬件組件進行交互。

您看到的數百萬個內核之間確實並沒有太大區別。通常,程序員/修改者將採用現有內核並對其進行“調整”,以嘗試從中獲得不同的性能。可以說,它們基本上只是在調整內核的“配置”。在Android世界中,這些修改器主要關注:CPU時鐘超頻或超頻(對於節省電池壽命或嘗試運行大多數進程密集型應用程序(例如視頻遊戲模擬器或視頻播放)很重要),或者它們的目標是-進行電壓調整(以通過在原始設置參數之外運行CPU來節省電池壽命...因人而異,因為沒有兩個CPU的100%完全相同。

我的意思是,例如,對於CyanogenMod,總是抱怨我的wifi,藍牙等不起作用。為什麼必須將這些驅動程序“移植”到CyanogenMod。他們為什麼不能只使用庫存驅動程序,將其複製到設備,然後使用CyanogenMod運行它們
沒有設備的“庫存”驅動程序。每個設備的硬件(例如相機,wifi芯片等)都有不同的驅動程序。它們通常是封閉源代碼,因此必須通過使驅動程序正常工作來“破解”自己的方式。
是的,但是為什麼需要破解。如果它們使用OEM內核,為什麼您不能將驅動程序文件和關聯的庫移到Cyanogen mod安裝中,因為內核基本相同。
R C E Mortimer
2014-01-25 22:49:40 UTC
view on stackexchange narkive permalink

電話和其他嵌入式設備沒有用於在硬件和操作系統之間提供抽象的BIOS,因此,操作系統已針對其部署到的硬件進行了編譯。即使使用相同芯片組的設備也可以以不同的方式進行配置(使用備用通信總線等)。結果是必須相應地編譯內核。由於不期望硬件發生變化,因此不會執行硬件檢測。內核啟動更快,因此更小-這是嵌入式OS的標準原理

Evan Langlois
2015-09-01 04:38:15 UTC
view on stackexchange narkive permalink

CentOS安裝在不同的硬件上,但是

  1. 所有PC的差異都小於電話,
  2. Ubuntu內核,Debian內核和Elementary內核都不同內核資源。
  3. ol>

    關於第二點,請參見前面發布的答案。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...