为什么会有这么多不同的Android内核(请提供技术答案)


17

Android是否不是在所有设备上都使用的通用内核?例如,CentOS将安装在Dell,HP和其他各种硬件上。当然有不同的模块,但仍然是CentOS。

CyanogenMod总是“损坏”的原因是什么?我经常在论坛上听到他们正在努力移植该驱动程序或该驱动程序。如果他们使用相同的内核,驱动程序就不能使用它吗?我还看到了一百万种用于不同设备的不同类型的内核。

Answers:


24

内核因制造商而异。这些内核中有很多来自CAF上的纯内核内核,这些制造商所做的就是获取这些常规源,根据所使用的板/芯片组对其进行修改以适应需要,并实现自己的驱动程序。

环顾四周,您会发现各种触摸屏,各种WiFi芯片组,更不用说加速度计,传感器,电池,指南针,声音,图形了。

例如,从HTC中获取一个内核源将不适用于Samsung,反之亦然。

制造商可以自由选择或外包各种整合到电路板中的位。没有硬性规定或快速规定。因此,为了使内核正常工作,进行了大量的修改/修改。

绝对不能与拥有PCI,PCI-Express,SATA,VGA,SVGA,USB和以太网的台式机Linux发行版内核相比,因为它们是完全不同的游戏。与CentOS和Android的Linux内核的主要区别在于- 所有驱动程序都以模块或内置方式编译,因此任何Linux发行版都将“立即可用”。再次,与桌面Linux发行版-你有一个架构- 86因此,从说戴尔PC一个Linux内核,可以制定出一个联想盒子提供的沼泽标准驱动程序编译。

不要忘记,在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无法分发洽谈。

值得庆幸的是,由于Android驱动程序已集成到主流源代码中,因此内核3.xx系列源代码现在都改变了这一切。但是有一个陷阱!

尝试将3.xx内核移植到大约12-18个月大的现有手机中;在地狱中滚雪球的机会不会奏效,这是因为,由于因素的不同,3.xx源与2.6.x源有很大不同,并且需要大量的黑客工作才能使其正常工作-我应该知道,已经尝试过为Zte Blade移植2.6.38.6源并失败。

同样,最新的内核版本3.0.1-在Modaco上的ics4blade项目上进行工作时,曾进行过多次尝试移植,但这仅是因为Zte对源代码进行了非常糟糕的处理,使移植几乎不可能实现。 。


到处投票!!!感谢您的详细回答。
user974896

不客气!您需要了解的其他任何信息!:D
t0mm13b 2012年

用你的话说,驱动程序不是全部编译为模块,而是集成到内核本身,因此,即使CM在设备上获得可用的内核,也不能简单地“将XXX模块”移动到新版本并使其工作,因为可能没有XXX moduels。必须对驱动程序进行追捕,破解(可能)并重新编译。
user974896 2012年

2
正确,并且驱动程序也不同,因此一个手机上的触摸屏驱动程序将无法在使用其他触摸屏的另一手机上运行。另外,要注意的另一个关键点-一些驱动程序取决于内核版本-Zte推出了适用于Blade的Atheros Wifi驱动程序版本,该驱动程序将无法运行,除非内核的版本为2.6.35.7,或其他任何版本, wifi中断-这是通过一种相当破烂的方式演示这种依赖性的过程。
t0mm13b 2012年

12

PC架构是围绕商品零件构建的,因为它最初是特定产品(IBM PC)的克隆而设计的,目的是为了与之兼容,从而相互兼容。一般而言,您可以从一台兼容PC的程序或外围设备中将其放入另一台PC中,然后期望它能正常工作。该功能足够有用,以至于技术不断发展,人们仍在继续要求它。您可以将PCI Express卡放在任何现代PC中,就像那时可以将ISA卡放在任何PC克隆中一样。

智能手机没有这样的历史。它们被设计为整体产品,一个完整的系统,包含按原样“正常工作”的硬件和软件。人们不会期望人们从一部手机中取出零件,然后将它们放入另一部手机中,因此工程师在设计产品时不必考虑互操作性。

即使在Linux内核源代码树中,ARM平台的驱动程序中也存在很多碎片。由于电话通常是闭门造车的,因此不同公司的工程团队通常会做重复的工作,设计与竞争对手基本相同的硬件,然后为自己的设计编写自己的驱动程序。一旦完成并发布了产品,便可以直接着手开发下一个产品。浪费他们的时间去重构过去产品的驱动程序或将它们与竞争对手的驱动程序合并是不值得的。结果是为相似但不完全相同的设备提供了大量的一次性驱动程序。

此外,智能手机通常基于SOC,这些SOC具有与处理器集成在一起的专用硬件。对于某些情况,这不仅是加载或不加载某个驱动程序的问题。整个内核可能需要使用在一个SOC上运行的特殊配置选项来构建,这与在另一SOC上运行所需的特殊选项不兼容。


5

原因是因为Android的Linux内核通常不是在Android本身上编译的,而是必须从另一台计算机交叉编译的。这会导致各种问题,因为设备配置在编译时不可用,并且由于空间限制,用所有驱动程序编译通用内核是不可行的(而大多数台式机发行版只是将所有驱动程序编译成从initramfs加载的模块)。 。因此,开发人员必须找出为每个特定设备打包的驱动程序。不仅如此,每个驱动程序通常都有十几个编译时间选项来切换各种驱动程序功能,而且制造商通常不会发布其官方配置(最严重的违规者甚至不开源其驱动程序,或者不保留其上游驱动程序。驱动程序副本)。

与没有应用程序编程相比,驱动程序编程要困难得多,因为没有内核可以使您免受具有特定实时定时要求等变化无常的硬件的影响,这意味着即使具有不同的性能特征也可能导致驱动程序丢失来自硬件的一些硬实时事件;这些错误可能会由于错误或性能问题而出现。

另一个问题是二进制不兼容。二进制不兼容的原因有两个,首先是CPU类型,这已经由t0mm13b很好地解决了,但是与移植更相关的另一个问题是ABI不兼容(应用程序二进制接口)。如果制造商不开源其驱动程序,则开发人员必须使用库存ROM中的编译模块。这引起了各种ABI不兼容问题,因为驱动程序模块本身对结构布局和函数调用参数有特定的期望,并且在编译内核时,它没有在驱动程序时描述ABI的头文件。被编译,因此,开发人员必须对驱动程序进行反向工程以创建头文件,否则由于对驱动程序进行了编译,因此源树中的头文件可能已被重大修改,并且开发人员必须还原这些修改以使内核再次与驱动程序的ABI兼容。与从源代码进行编译不同,针对二进制驱动程序进行编译不会因功能参数不匹配或结构不兼容而触发编译错误,只会使设备在运行时崩溃,因此调试这些问题非常困难。在PC世界中,我们很熟悉nVidia和ATi所带来的混乱,因为它们坚持发布仅二进制驱动程序,想象所有驱动程序都陷入混乱,想象它所产生的“乐趣”。

PC硬件通常也比移动硬件更好地标准化,大多数PC不需要振动器,加速计,陀螺仪,3G无线电,接近传感器,NFC等驱动程序。即使在具有3G的设备上,它也通常使用标准化的方式连接到硬件PCMCIA或PCI-E之类的连接。


4

嗯...驱动程序和内核并不完全相同。

驱动程序是控制单元天线,wifi,蓝牙等的驱动程序。它们是专有驱动程序,因为制造商必须创建一种方法(驱动程序)来与其硬件进行通讯。

内核是OS /应用程序和实际驱动程序(或cpu或内存或任何其他硬件)之间的中间层。它是使您的OS /应用与这些硬件组件进行交互的基础。

您看到的所有数百万个内核之间确实并没有太大区别。通常,程序员/调制器将采用现有内核并对其进行“调整”,以尝试从中获得不同的性能。基本上可以说,它们只是在(大部分)调整内核的“配置”。在Android世界中,这些修改器主要关注:CPU时钟超频或超频(对于节省电池寿命或尝试运行大多数进程密集型应用程序(例如视频游戏模拟器或视频播放)很重要),或者它们正在关注以下情况:电压调整(通过在原始设置参数之外运行CPU来节省电池寿命,因人而异,因为没有两个CPU的100%完全相同)。


我的意思是,例如,对于CyanogenMod,总是抱怨我的wifi,蓝牙等不起作用。为什么必须将这些驱动程序“移植”到CyanogenMod。他们为什么不能只使用库存驱动程序,将其复制到设备上,然后使用CyanogenMod运行它们?
user974896

没有设备的“库存”驱动程序。每个设备的硬件(如相机,wifi芯片等)都有不同的驱动程序。它们通常是封闭源代码,因此必须“破解”使驱动程序正常工作。
瑞安·康拉德

1
是的,但是为什么需要破解。如果它们使用OEM内核,那么为什么不能仅将驱动程序文件和关联的库移至Cyanogen mod安装中,因为内核基本相同。
user974896 2012年

1

手机和其他嵌入式设备没有BIOS来提供硬件和操作系统之间的抽象,因此,操作系统针对其部署到的硬件进行了编译。即使使用相同芯片组的设备也可以以不同的方式进行配置(使用备用通信总线等)。结果是必须相应地编译内核。由于不期望硬件发生更改,因此不会执行硬件检测。内核启动更快,因此更小-这是嵌入式OS的标准原理


0

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

  1. 所有PC的差异都小于手机,
  2. Ubuntu内核,Debian内核和Elementary内核都是不同的内核源。

关于第二点,请参阅先前发布的答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.