Android是否不是在所有设备上都使用的通用内核?例如,CentOS将安装在Dell,HP和其他各种硬件上。当然有不同的模块,但仍然是CentOS。
CyanogenMod总是“损坏”的原因是什么?我经常在论坛上听到他们正在移植此驱动程序或该驱动程序。如果他们使用相同的内核,那么驱动程序就不能使用它吗?我还看到了用于不同设备的一百万种不同类型的内核。

#1 楼

内核因制造商而异。这些内核中有很多来自CAF上的纯内核内核,这些制造商所做的就是获取这些内核,根据所使用的主板/芯片组对其进行修改,以实现其自身,同时实现自己的驱动程序。 >
环顾四周,有各种触摸屏,各种WiFi芯片组,更不用说加速度计,传感器,电池,指南针,声音,图形了。

取一个内核源代码例如HTC无法在Samsung上使用,反之亦然。

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

绝对不能与拥有PCI,PCI-Express,SATA,VGA,SVGA, USB,以太网是完全不同的棒球游戏。与CentOS和Android的Linux内核的主要区别在于-所有驱动程序都以模块或内置方式编译,因此任何Linux发行版都将“立即可​​用”。同样,在桌面Linux发行版中-您只有一个体系结构-x86,因此,假设已编译了沼泽标准驱动程序,则Dell PC上的一个Linux内核就可以在Lenovo上使用。不要忘记,在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或更高版本的兼容性,而是为了使社区能够对其进行修改,例如添加超频功能。

因此,幕后涉及到骇客行为,并且很多驱动程序试图使其正常工作,而且也不容易调试。洽谈。

幸运的是,现在内核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造成了非常糟糕的混乱使得移植几乎不可能的来源。

评论


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

–user974896
2012年8月10日23:43

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

–t0mm13b
2012年8月10日23:46

#2 楼

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

智能手机没有这样的历史。它们被设计为整体产品,一个完整的系统,包括按原样“正常工作”的硬件和软件。人们不会期望人们将一部手机拆下来放进另一部手机中,因此工程师在设计产品时不必考虑互操作性。 ,ARM平台的驱动程序中存在很多碎片。由于电话通常是闭门造车的,因此不同公司的工程团队通常会做重复的工作,设计与竞争对手基本相同的硬件,然后为自己的设计编写自己的驱动程序。一旦完成并发布了产品,他们便会直接着手开发下一个产品。浪费他们的时间去重构过去产品的驱动程序或将它们与竞争对手的驱动程序合并是不值得的。结果是为相似但不完全相同的设备提供了大量的一次性驱动程序。

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

#3 楼

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

驱动程序编程比应用程序编程困难得多,因为没有内核可以保护您免受具有特定实时定时要求等变化无常的硬件的侵害,这意味着甚至有不同的要求性能特征可能会导致驱动程序错过硬件中的某些硬实时事件;这些错误可能会由于错误或性能问题而浮出水面。

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

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

#4 楼

好吧……驱动程序和内核并不完全相同。

内核是OS /应用程序与实际驱动程序(或cpu或内存或任何其他硬件)之间的中间层。正是这样,您的OS / app才能与这些硬件组件交互。通常,程序员/修改者将采用现有内核并对其进行“调整”,以尝试从中获得不同的性能。可以说,它们基本上只是在调整内核的“配置”。在Android世界中,这些修改器主要关注:CPU时钟超频或超频(对于节省电池寿命或尝试运行大多数进程密集型应用程序(例如视频游戏模拟器或视频播放)很重要),或者它们的目标是-电压调整(通过在原始设置参数之外运行CPU来节省电池寿命...因人而异,因为没有两个CPU的100%完全相同)。

评论


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

–user974896
2012年8月10日在20:40

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

–瑞安·康拉德(Ryan Conrad)
2012年8月10日在20:42



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

–user974896
2012年8月10日在21:04



#5 楼

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

#6 楼

CentOS安装在不同的硬件上,但是,所有PC的差异都小于手机,
Ubuntu内核,Debian内核和Elementary内核都是不同的内核源。

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