【转帖】【技术贴】【上代码】国内手机厂商的系统技术能力PK(第二篇xiaomi)
【技术贴】【上代码】国内手机厂商的系统技术能力大比拼,看看谁最 NB ,谁最拉跨!!(第二篇,xiaomi)
来源酷安@纯白Final
2022-02-12 华为Mate 40 Pro
——
https://www.coolapk.com/feed/33482542?shareKey=ZmJmYmU1NzA5NDdlNjIxMGExMjU~&shareUid=19136938&shareFrom=com.coolapk.market_12.0.3
——
先来一个代码全家福~
@921x258.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_3726c55e_5263_6969_889@921x258.png.m.jpg"/>
全家福
再说一下后续更新的问题,首先分析代码还是比较肝的,进度肯定不会那么快,周末会尽力肝出下一篇;再就是我虽然常年用酷安,但确是个2级号,每天发动态都有限制,尴尬啊;
以上就是告诉大家,不要着急,每家厂商我都会“照顾”到的。。。。。
==================================================================提前声明一下,我本人主要是做x86服务器OS场景业务的,对arm手机场景并不是很熟悉,但除了arch相关的以外,内核其他领域是基本相通的!
而且Linux内核是非常复杂的,这里我仅能依靠自己的知识积累来进行尽量细致的分析,但肯定会存在错误或者遗漏的地方,如果你觉得我错,那就是你对!==================================================================
先看下一个典型的安卓系统的Linux内核是由哪些元素构成的
@822x99.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_97ab146c_5263_7016_28@822x99.png.m.jpg"/>
我们拿到的代码是集合了所有修改的发布版本,包含了上游kernel,安卓/arm相关的特性,特定芯片厂家的修改(高通/海思/联发科),还有一些外设的驱动程序(指纹,马达等),再加上手机厂商自己的特性和修改;
这里主要关注最后一块手机厂家自身对内核的修改,毕竟前面几个都是社区或者供应商提供的,体现的是厂家的整合能力,而不是厂家的内核技术能力。
大概的分析思路1.关注手机厂家自身对内核的修改,主要是新增的功能特性,bugfix虽然也很重要,但大部分代码都没有完整的git记录,分析起来太花时间了,就不管了;2.关注新增功能的完成度,主要从代码量,及简单的代码走读来看;时间有限,不可能非常深入的代码分析,只能给个大概的印象分;
按照2个场景来分析1.对于没有git记录的,基于个人对内核的理解,重点观察厂商对内核核心领域的修改,如cpu/任务调度,功耗管理,内存管理,网络协议,文件系统等;2.对于有基线git记录的,主要根据git记录分析,并结合1里面的核心领域修改进行补充;
最后的评分综合是以下几个维度:1.自研特性的数量2.自研特性的复杂度/代码量3.自研特性的完成度,对核心领域的改动程度;
======================================================================我专门找了miui13发布会上吹出来的跟内核强相关的特性,看看到底有没有这么NB?
@720x386.jpeg.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/07/695378_b5dd3f8c_1838_6089_726@720x386.jpeg.m.jpg"/>
针对三大系统核心场景:处理器调度、内存管理、 I / O ,推出了对应的优化技术焦点计算、原子内存、液态存储。·焦点计算:根据场景优先计算当前用户感知最明显的进程,抑制后台不重要的应用;·原子内存:拆分应用内存,优先结束不重要任务,精细化压缩内存占用;.液态存储:高灵敏监测碎片化程度,大幅提升碎片整理效率。========================================
人狠话不多,开搞!先看xiaomi代码的基本信息:
@1001x324.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_161e37eb_5263_702_857@1001x324.png.m.jpg"/>
这是xiaomi 12/12 pro系列的内核代码,基于安卓12,代码基线是高通的LA.VENDOR.1.0.r1-09100-r1.0.r1_000011.0,内核config用的是zeus_GKI.config,zeus是小米12pro的开发代号:宙斯,内核版本基线:5.10.43
xiaomi 一个commit合入了所有的代码,git 统计修改了1120个文件,新增63w行代码;
先把这个一次性的修改合入,做下分类:芯片厂商的代码:techpack 高通芯片的解决方案代码camera-kernel 相机,isp相关的display-drivers 显示相关的
外设驱动代码:goodix_health 汇顶的健康设备驱动fingerprint/goodix_fod 汇顶的指纹驱动aw86927_haptic 艾为电子的触觉反馈驱动aw8697_haptic 艾为电子的触觉反馈驱动stmvl53l5 ST的ToF驱动touchscreen/fts_spi ST的触摸屏驱动leds-aw22xxx 艾为电子的LED驱动wl2866d 豪威的相机模组供电驱动
xiaomi自研特性:migtmi_schedmilletturbo_schedmi-ioturbomi-memorymi-powermi_gamekeycnss2的一处修改 wifi 3天线,这个我有点不太懂,但代码量不大qti_battery_charger 这个大改接近4000行代码,快充相关的extend_reclaimmi_thermal_interface 热管理,温控相关的,800多行代码touchscreen/xiaomi 小米自己的触摸驱动,1500行左右的代码,有点东西了
看到这些代码命名,是不是气氛一下子就起来了,这不就是发布会上的各种GT,各种turbo么??忍不住要吐槽下,代码里用营销名词,略显有点low !!!
另外一般内核里开发的特性都是基于KConfig管理的,根据设备的目标config就能基本确认它的功能特性集合。
M12对应的config位于arch/arm64/configs/vendor/zeus_GKI.config,打开这个config也看到xiaomi相关的自研特性配置,基本上是跟git分析吻合的。
@1036x396.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_2f90faa2_5263_7025_203@1036x396.png.m.jpg"/>
xiaomi的特性config关键字是”MI“哈。。。。=========================================================================
芯片及外设厂家的代码就先不管了,重点分析下这些自研特性:
快充的代码,基本都是跟硬件强相关的,再加上我也不懂这块,也没啥好看的;touchscreen/xiaomi触控驱动的代码,搞个了xiaomi-touch的平台驱动,对应的misc设备,外加相关的sysfs接口;通过sysfs向用户态呈现了非常丰富的触控统计信息,msic设备fops的处理也很完备;整个驱动代码规范性很不错,算是写的比较漂亮的了!!
除了快充和触控,大部分自研特性在 drivers/mihw 和 drivers/misc目录下
@929x302.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_02a0ad08_5263_703_764@929x302.png.m.jpg"/>
统计下整体代码量3000行左右;不算非常大,尤其是mihw相关的4个特性,才500行吗?
@995x459.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_7149ee2b_5263_7039_473@995x459.png.m.jpg"/>
看完mihw下面几个目录的代码后,我心都凉了!!!这里面都是空实现啊,只有个模块加载/卸载的入口函数,功能函数全是空的,怪不得只有500行代码!
migt的实现呢?空的
@702x486.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_b3d6ffe8_5263_7045_931@702x486.png.m.jpg"/>
mi_sched的实现呢?空的
@808x533.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_9957e580_5263_7053_288@808x533.png.m.jpg"/>
其他的millet/turbo_sched都是类似的空实现!xiaomi这是想干啥?
========================================================再看下misc下面的特性,先看下mi-memory这个:
这是个信息增强获取的特性,从内核里读ufs的4个统计信息以及dram ddr_device_type类型,通过sysfs暴露给上层;这个特性看起来是有些信息,用户态没法直接获取,需要从内核态拿到,给其他服务做性能监控或者一些场景的特殊优化,没啥特殊的东西,代码比较简单,就不截图了。
再看下mi-ioturbo这个特性:总共200多行代码,核心逻辑如下
@986x418.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_5eac7b1c_6033_8053_452@986x418.png.m.jpg"/>
也比较简单,搞了个定时任务,循环计算scsi盘上的前后2次下发的io数量差,如果超过了预设的值(1000个),就向用户态发个uevent通知下;
上层应该有个服务在监听这个uevent事件,触发的话就认为这时候磁盘IO有突增,是比较繁忙的,估计需要做下IO抑制之类的操作;这个特性怎么说呢,也不是说它没有用,而是有点太简单了点吧,这样就敢叫ioturbo吗?
而且 iorequest_cnt 这个值用户态通过/sys/class/scsi_device//device/iorequest_cnt 直接读到啊,直接在用户态就可以计算了,干嘛非要在内核态做,还要弄个uevent通知下,不嫌麻烦吗?搞不懂???
最后再看一个内存回收的优化特性extend_reclaim吧:依然的“简洁明了”,总共100多行代码,核心思想是提供了一个sysfs接口,使得应用可以主动的调用内存回收的核心接口,去回收指定数量的内存页,目的应该是为了更主动进行内存回收。
@1015x160.png.m.jpg" style="border-radius:4px" src="http://image.coolapk.com/feed/2022/0212/00/695378_adf57bde_5266_7569_801@1015x160.png.m.jpg"/>
但这个代码写的我要吐槽下,你这直接在整个系统上进行回收,不怕影响到其他业务进程吗?还是说都在半夜/锁屏时候操作,所以就无所谓了?指定下memcg缩小下范围,是不是更好点??另外nr_to_reclaim这个指定回收内存页数量的变量,是直接从用户态读下来的,只判断了最小值边界,没有判断合理的最大值边界,如果是个极大值,有可能会产生DoS的风险,属于安全风险,需要修复;
搞到这里,我都不想看其他代码了,有点浪费精神,就这样吧。。。========================================================总结一下:
xiaomi12在基线内核代码之上总共新增了63w行代码,主要有以下几大块:高通techpack加起来50w行左右,包括了相机,isp,显示之类的能力,里面应该也有xiaomi的修改,但代码太多了,没法一一去确认,我相信应该不会是非常重大的修改,欢迎打脸。xiaomi自研特性的代码,估算下来1w行左右吧,其中快充和触摸驱动代码量比较大,比较完善以外,其他的都是酱油;还有一些bugfix的代码,量不大,就不单独算了。其他外设的驱动代码,如指纹,触摸屏等,估算下来有10w行左右的代码。
根据目前我看到的代码,也许所谓的“焦点计算”,“原子内存”,“液态存储”特性是真的存在,也非常牛逼,但肯定没有在这个开源的内核代码里!这样搞开源有点那啥啊!!综合自研特性数量,特性复杂度/代码量、特性完成度,以及对内核核心领域的修改程度,xiaomi,给个1分吧,最多1.5分;主要是真的没有啥代码啊,大部分是空实现啊。。。。
==================================================================此时此刻,2022-2-11 23点,我看到的xiaomi 12内核源码里存在一些非比寻常的东西,我需要多说两句;
代码里存在一些非常简单的功能实现,是可以理解的,毕竟只要能解决问题,事先的简单还是复杂关系并不大;但是存在很多空模块的实现,就让人非常不解了!!
对这些空实现,我猜测有2个可能:1.实际是有相应的代码,但没有开源出来。原因可能是怕友商抄袭?或者是代码有法务问题/写的太烂,暂时没法开源?2.实际就是没有相应的代码,所以无法开源出来。不过根据快充以及触屏驱动的代码看,这个我估计是不太可能的。
无论是因为什么原因,xiaomi在开源出来的内核源码里用了这些“空实现”替代了真实的代码,都是属于不道德,不诚信的,甚至是违反GPL协议的!对xiaomi的声誉都是有损害的!
xiaomi最近也是烦恼缠身,前两天才有充电芯片是否真正自研的舆论风波,我是完全没想到,在我搞分析的过程中会发现空实现这样的问题,如果有xiaomi的同学看到本帖,建议让内部尽快处理下吧。
评论区开荒,我辈义不容辞
来抢第一个沙发!