Answers:
内核因制造商而异。这些内核中有很多来自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对源代码进行了非常糟糕的处理,使移植几乎不可能实现。 。
PC架构是围绕商品零件构建的,因为它最初是特定产品(IBM PC)的克隆而设计的,目的是为了与之兼容,从而相互兼容。一般而言,您可以从一台兼容PC的程序或外围设备中将其放入另一台PC中,然后期望它能正常工作。该功能足够有用,以至于技术不断发展,人们仍在继续要求它。您可以将PCI Express卡放在任何现代PC中,就像那时可以将ISA卡放在任何PC克隆中一样。
智能手机没有这样的历史。它们被设计为整体产品,一个完整的系统,包含按原样“正常工作”的硬件和软件。人们不会期望人们从一部手机中取出零件,然后将它们放入另一部手机中,因此工程师在设计产品时不必考虑互操作性。
即使在Linux内核源代码树中,ARM平台的驱动程序中也存在很多碎片。由于电话通常是闭门造车的,因此不同公司的工程团队通常会做重复的工作,设计与竞争对手基本相同的硬件,然后为自己的设计编写自己的驱动程序。一旦完成并发布了产品,便可以直接着手开发下一个产品。浪费他们的时间去重构过去产品的驱动程序或将它们与竞争对手的驱动程序合并是不值得的。结果是为相似但不完全相同的设备提供了大量的一次性驱动程序。
此外,智能手机通常基于SOC,这些SOC具有与处理器集成在一起的专用硬件。对于某些情况,这不仅是加载或不加载某个驱动程序的问题。整个内核可能需要使用在一个SOC上运行的特殊配置选项来构建,这与在另一SOC上运行所需的特殊选项不兼容。
原因是因为Android的Linux内核通常不是在Android本身上编译的,而是必须从另一台计算机交叉编译的。这会导致各种问题,因为设备配置在编译时不可用,并且由于空间限制,用所有驱动程序编译通用内核是不可行的(而大多数台式机发行版只是将所有驱动程序编译成从initramfs加载的模块)。 。因此,开发人员必须找出为每个特定设备打包的驱动程序。不仅如此,每个驱动程序通常都有十几个编译时间选项来切换各种驱动程序功能,而且制造商通常不会发布其官方配置(最严重的违规者甚至不开源其驱动程序,或者不保留其上游驱动程序。驱动程序副本)。
与没有应用程序编程相比,驱动程序编程要困难得多,因为没有内核可以使您免受具有特定实时定时要求等变化无常的硬件的影响,这意味着即使具有不同的性能特征也可能导致驱动程序丢失来自硬件的一些硬实时事件;这些错误可能会由于错误或性能问题而出现。
另一个问题是二进制不兼容。二进制不兼容的原因有两个,首先是CPU类型,这已经由t0mm13b很好地解决了,但是与移植更相关的另一个问题是ABI不兼容(应用程序二进制接口)。如果制造商不开源其驱动程序,则开发人员必须使用库存ROM中的编译模块。这引起了各种ABI不兼容问题,因为驱动程序模块本身对结构布局和函数调用参数有特定的期望,并且在编译内核时,它没有在驱动程序时描述ABI的头文件。被编译,因此,开发人员必须对驱动程序进行反向工程以创建头文件,否则由于对驱动程序进行了编译,因此源树中的头文件可能已被重大修改,并且开发人员必须还原这些修改以使内核再次与驱动程序的ABI兼容。与从源代码进行编译不同,针对二进制驱动程序进行编译不会因功能参数不匹配或结构不兼容而触发编译错误,只会使设备在运行时崩溃,因此调试这些问题非常困难。在PC世界中,我们很熟悉nVidia和ATi所带来的混乱,因为它们坚持发布仅二进制驱动程序,想象所有驱动程序都陷入混乱,想象它所产生的“乐趣”。
PC硬件通常也比移动硬件更好地标准化,大多数PC不需要振动器,加速计,陀螺仪,3G无线电,接近传感器,NFC等驱动程序。即使在具有3G的设备上,它也通常使用标准化的方式连接到硬件PCMCIA或PCI-E之类的连接。
嗯...驱动程序和内核并不完全相同。
驱动程序是控制单元天线,wifi,蓝牙等的驱动程序。它们是专有驱动程序,因为制造商必须创建一种方法(驱动程序)来与其硬件进行通讯。
内核是OS /应用程序和实际驱动程序(或cpu或内存或任何其他硬件)之间的中间层。它是使您的OS /应用与这些硬件组件进行交互的基础。
您看到的所有数百万个内核之间确实并没有太大区别。通常,程序员/调制器将采用现有内核并对其进行“调整”,以尝试从中获得不同的性能。基本上可以说,它们只是在(大部分)调整内核的“配置”。在Android世界中,这些修改器主要关注:CPU时钟超频或超频(对于节省电池寿命或尝试运行大多数进程密集型应用程序(例如视频游戏模拟器或视频播放)很重要),或者它们正在关注以下情况:电压调整(通过在原始设置参数之外运行CPU来节省电池寿命,因人而异,因为没有两个CPU的100%完全相同)。