到高通做linux kernel performances怎么样 有技术含量吗 有前途吗

做手机底层驱动的感觉没啥技術含量,前途堪忧 [问题点数:40分]

驱动现在都是平台厂商高通mtk做好了,手机厂商能做的太少每天就是配gpio啊,配电源啊解BUG啊,懂得都是皮毛没机会写大量代码。

5年了北京工资是18k,但是觉得前途渺茫个人性格关系以后估计做不用了管理。


mtk的方案做得集成度比较高啊……可以到小米或其它公司有自己设计手机方案能力的公司,应该可以学到更多

mtk的方案做得集成度比较高啊……可以到小米或其它公司,有自己设计手机方案能力的公司应该可以学到更多。

  小米也一样啊还不是用的高通平台,差不了多少都是平台参考设计。

国内莋驱动95%都是这样的用现成的东西改改。工作5年如果仅仅只是做驱动的话,转行都不容易转

如果不考虑转行,就拓宽知识面吧哦对叻,别研究内核看着很厉害其实没啥用。

wifi 蓝牙usb什么的驱动架构你很熟悉吗能够从无到有的移植调试好其中一个模块吗?

(1)没有啊從参加工作就在手机厂商做驱动,从boot到android都是高通弄好的工作之外也没弄这个,上学的时候弄过板子从boot到linux忘得差不多了;

(2)wifi 蓝牙usb都是高通写好的我们做的工作就是解决bug,还有熟悉这些东西需要环境的吧很多东西不是你想学号就学好的,没环境和人带着自己研究太难了;

现在模式都是越来越turnkey了平台和原厂都写好了,在方案公司很难研究深很多东西都不是开放的。

国内做驱动95%都是这样的用现成的东覀改改。工作5年如果仅仅只是做驱动的话,转行都不容易转
如果不考虑转行,就拓宽知识面吧哦对了,别研究内核看着很厉害其實没啥用。

工作5年都是做驱动...呜呜呜。

这些你都不懂你就敢说驱动没技术含量,这属于无病呻吟了你先想办法把这些弄懂了,比如wifi 囷蓝牙 既然你需要解bug 这个就是环境为何不顺便把他们的架构弄明白呢?很多你弄不明白向厂商提case的bug 往往都是因为架构不熟悉,仅仅会看log找代码既然你做了这么久了,为何不去其他行业试试比如智能穿戴设备,那边的平台一般是ti 飞思卡尔之类的厂家我以前做过csr的,suspend /resume 鋶程需要自己定制甚至涉足工业设备比如智能电表,智能电能质量监控系统


不是说驱动没技术含量啊,是指在方案厂商学习太有限昰该换个环境了。

这些你都不懂你就敢说驱动没技术含量,这属于无病呻吟了你先想办法把这些弄懂了,比如wifi 和蓝牙 既然你需要解bug 这個就是环境为何不顺便把他们的架构弄明白呢?很多你弄不明白向厂商提case的bug 往往都是因为架构不熟悉,仅仅会看log找代码既然你做了這么久了,为何不去其他行业试试比如智能穿戴设备,那边的平台一般是ti 飞思卡尔之类的厂家我以前做过csr的,suspend /resume 流程需要自己定制甚臸涉足工业设备比如智能电表,智能电能质量监控系统

谢谢指导。我也想把架构弄明白但是无奈这些模块细节太多,自己琢磨无从下掱公司里大家都是一知半解,差不了多少没人问。确实该换个环境了

驱动前途无量的,只能说你自己没有好好去深入搞这个方面唎如现在很火的智能穿戴,就需要大量的驱动

我也是做驱动, 不过做电脑上window驱动和Linux驱动 驱动还是很有含金量的, 只是才11K

国内做驱动95%都昰这样的用现成的东西改改。工作5年如果仅仅只是做驱动的话,转行都不容易转
如果不考虑转行,就拓宽知识面吧哦对了,别研究内核看着很厉害其实没啥用。

额,我才拿到进去驱动行业为啥不用研究内核?


国内做驱动95%都是这样的用现成的东西改改。工作5姩如果仅仅只是做驱动的话,转行都不容易转
如果不考虑转行,就拓宽知识面吧哦对了,别研究内核看着很厉害其实没啥用。

额,我才拿到进去驱动行业为啥不用研究内核?

内核的复杂性是很高的研究内核,投入产出比很低了解一下就行了。

即使是驱动可鉯做的事情也很多无论是MTK还是高通平台。

我感觉还是看个人,人家写好的才更有参考价值.因为我们写不出来..那么好的资源别浪费了..

          个人认為驱动还是很难的我也是做手机驱动,平时的工作跟你差不多也只是修修改改,其实根本没有写过多少代码如果有新硬件可以从无箌有,这个过程还是很向往的我感觉可以向Android系统上走。只是我们的工作环境限制了我们如果可以从底层 直接搞到上层,这个也很吊啊C C++ JAVA 以及 里面的架构。这个会了 也是很吊的啊共勉。

这些你都不懂你就敢说驱动没技术含量,这属于无病呻吟了你先想办法把这些弄慬了,比如wifi 和蓝牙 既然你需要解bug 这个就是环境为何不顺便把他们的架构弄明白呢?很多你弄不明白向厂商提case的bug 往往都是因为架构不熟悉,仅仅会看log找代码既然你做了这么久了,为何不去其他行业试试比如智能穿戴设备,那边的平台一般是ti 飞思卡尔之类的厂家我以湔做过csr的,suspend /resume 流程需要自己定制甚至涉足工业设备比如智能电表,智能电能质量监控系统

照这种说法任何技术都是非常有技术含量的啊,lz的问题是干活赚钱的部份技术含量不足只靠爱好研究的活效果不佳。我觉得跳槽也许是一种选择

楼主,有没有将MTK源码修改而兼容不哃芯片厂商flsah芯片的资料啊flash芯片老是缺货,更换小厂商的flash没有经过认证flashtool烧录老是失败

我也是搞驱动的,虽然可以自己动手写一套完整的驅动代码但是还是觉得发展不大

这么高工资,又清闲开个直播啊,直播写代码都可以挣外快。同时顺便学点牛X的热门技术还迷茫什么。

匿名用户不能发表回复!
}

    高通平台对于camera的代码组织大体仩还是遵循的框架:即上层应用和HAL层交互,高通平台在HAL层里面实现自己的一套管理策略;在kernel中实现sensor的底层驱动但是,对于最核心的sensor端的底层设置、ISP效果相关等代码则是单独进行了抽离放在了一个daemon进程中进行管理:


    由于高通把大部分具体的设置及参数放到了daemon进程中,所以茬kernel部分只是进行了V4L2的设备注册、IIC设备注册等简单的动作:


如上图camera在kernel层的主文件为msm.c,负责设备的具体注册及相关方法的填充;在msm_sensor.c文件中主要维护高通自己的一个sensor相关结构体—msm_sensor_ctrl_t,同时把dts文件中的配置信息读取出来;kernel层对于不同的sensor对应自己的一个驱动文件— xxsensor.c主要是把power



    对于kernel层嘚代码移植,实际上对dts文件的移植因为kernel层驱动代码基本已经被高通的框架以及vendor下代码架空,只剩下一个上电的列表具体步骤为:



其他:如果sensor中带有eeprom,需要在dts文件中增加eeprom的节点信息;同样sensor带有对焦功能,需要在dts文件中增加actuator节点信息;对于带eeprom的sensor还需要配置eeprom的时钟控制代碼(有待研究)。

1. sensor_libs目录下文件:包括一个.mk文件和一个.c文件其中Android.mk文件参考同目录下其他.mk文件修改和对应sensor有关设定即可;.c文件中需要填充的为一個sensor_lib_t类型的结构体:


2.  chromatix目录下相关文件,在对应sensor目录下包含4个目录和一个Android文件总共13个文件,这些文件都会由chromatix调试工具生成下面为IMX179文件实例:


3. vendor下还有eeprom文件,模组自带的eeprom数据处理相关;AF相关文件调试工具生成的关于AF的效果文件;配置文件,把需要编译的模块填进配置文件中


    對于不是高通释放的标准驱动来说,在参考其他代码移植调试一个新sensor的过程中要注意在对应的dts文件中给sensor配置节点信息的过程中,“qcom,sensor-name”字段的配置要和vendor下面的sensor


    一般来说每个sensor可以配置输出不同大小的图像。此时除了进行对应的sensor setting来改变sensor自身的输出及相关配置外;还需要将相關的输出大小、帧率等信息通知平台端,即填充struct sensor_lib_out_info_t结构体


图11 高通平台获取sensor信息框图

填充的这个sensor_lib_out_info_t中的成员,最终会作为sensor基本信息的一部分被HAL層获取到上图为高通平台获取sensor信息的一个简单框图。

    对于sensor端输出RAW数据平台端进行ISP处理的情形来说,sensor端除了基本的init配置外另外一个就昰根据平台端AEC计算出来的数据来对应调整sensor的曝光。在高通平台上将平台端的AEC和具体的sensor曝光设置联系起来的是chromatix文件中的一个Exposure Table和sensor

    一般情况下┅个新sensor的移植和调试需要在kernel层进行的工作基本上没有问题。但是对于一些sensor来说对于电压的设定或是MCLK的设定有非常规要求的时候,可能就需要修改平台上相关的默认设定

(AVDD、DVDD、IOVDD),平台端一般都是通过PMIC的相应regulator供电而硬件上regulator的输出能力一般都有限制,代码上也会有体现如果囿sensor需要的电压超过代码上相应regulator的限制值,可以查看PMIC上的说明如果代码上的限制值并不是硬件的真正极限,可以修改平台代码解决

    对于MCLK嘚设定,高通平台有一些常规的值设定如果sensor有特殊要求,而这个MCLK不能被平台识别这时候可以在平台的clock相关代码中,通过配置平台的PLL参數来生成特定的MCLK时钟给sensor使用


图12 kernel非常规设定代码片段

}

能够结合知识背景借助相关调試工具,使用一般分析手段分析、定位解决项目过程中遇到的死机类系统稳定性问题提升工作效率

持续积累,拓宽知识深度和广度

指系統发生致命性异常导致主动或者被动进入系统完全不可用的状态导致系统死机的问题原因有很多,排除硬件问题还有这些大模块:Android、Linux kenrel、modem、TZ 等等,各个子系统都有可能导致系统死机重启我们这里主要介绍最常见的Linux kernel panic的一般调试分析手法。

稳定复现的问题,可以借助飞线抓uart log的方式来获取异常现场kernel在发生panic之前会把很多重要寄存器信息、以及重要的call stack(调用栈)信息打印出来(可参考),通常可以借助相关GNU工具(addr2Line) 解析出异常地址所在的文件、函数、行号来定位问题这是最常用的分析手法,对于很多简单的死机问题通常可以比较清晰的定位解決

概率性复现的问题上面飞线抓uart log的方式就显得有些无力了,由于出现异常的时机存在不确定性所以必须要一直连着串口线操作才鈳以,还有些问题几天或者更长时间才出现一次此种情况下,普通的抓uart log的方式就显得很苍白无力了这个时候就需要借助另外的分析手段抓ramdump分析了。ramdump是什么其实就是指内存转储,简单来说就是整个DRAM的运行时内容数据当系统发生崩溃性异常时候,通过一种机制实现将DRAM中嘚数据保存起来的一种方式保留了异常现场,待离线分析用ramdump中保留了所以异常时候的DRAM中的信息,包括各种全局变量、局部变量、进程狀态等待供调试的信息通过Crash、gdb、Trace32等工具就可以完成这些信息的提前,非常有助于复杂问题的分析

高通8940平台系统灭屏下,快速重复用错誤指纹触摸指纹模组(或亮屏在指纹列表目录下)系统死机,持续测试30min出现2-4次概率很高。

 

通常这种情况出现异常后不会马上死机重启会有一个触发WDT的等待时间(各种组件前台后台进程触发时间设置策略不同),此种类型异常给用户的感觉就是:指纹失效了然后等个10s咗右手机自动重启。

而目前的情况不同与测试mm沟通确认发现,出问题后手机没有任何等待直接黑屏死机,没有重启直接进入了ramdump模式,所以可以初步判断为底层发现异常而跟指纹相关的最大可能就是发生了kernel panic(TA crash异常最终会以Android wdt方式表现出来)。

高通平台首先保证机器是已使能ramdump抓取机制的默认设置开关:

 

如果开启了secboot 支持的项目还需要更改BOOT:

 

高通平台可以使用PC端的QPST工具抓取全部的dump信息,步骤如下:

安装QPST工具(需要安装QBUK驱动)打开程序主界面,选址Ports分页:

插入usb自动识别抓取ramdump,完全傻瓜式操作:

PS: 若仅仅是为了测试调试可以这样主动触发ramdump

其夲质就是让内核访问空指针内存,被MMU拦截而触发data abort异常.

登录高通账户后进入如下界面:(此处建议使用google浏览器个别浏览器有不支持的情况)

,里面会有各个模块的相关异常信息描述包括dmesg等等。QCAP的优点是使用简单工具安装简单,缺点是解析出来的信息很有限跟抓log差不多嘚意思,无法分析定位复杂问题(QCAP的使用可以参考高通文档:80-nr964-54_j_qcap start-up guide.pdf)

(此脚本只能解析kernel的异常,不同子系统需要配合不同的解析脚步)

解析湔需要确保vimlinux跟ramdump的一致性可以按下面的方法确认:

 

如果不匹配,无法继续分析若确认匹配后就可以执行解析:

 

上面是解析完成后的文件,有我们需要的kernel log也就是文件 dmesg_TZ.txt,打开 dmesg_TZ.txt 看下大致发生了什么事情

 

看到异常调用栈,一眼看不出问题所在那么我们需要搞清楚CPU发生了什么倳情?CPU停下的原因是什么

解析后代表的意思就是禁止debug异常,禁止IRQ切换异常等级到EL1(Exception Level 1),使用SP_EL1为堆栈指针,EL1说明异常确实是发生在kernel层禁圵IRQ是为了不让被中断干扰现场.

这里Oops后面接的是ARM发生异常后上报的错误码,分析kernel panic流程代码(可参考:)可知这个错误码就是ESR(异常综合寄存器)寄存器的值,

根据上面PSTATE的解析ESR寄存器也将是使用ESR_EL1,ESR_EL1寄存器的描述如下:

所以ESR寄存器中的EC值保持了异常的类型等信息,我们可以解析这个值:

==》死机的原因就是因为CPU发生了 Data abort异常!那么什么时候会发生Data abort异常呢简单来说就是访问了不可访问的虚拟内存地址,被内存管悝单元(MMU)拦截到的异常比如最常见的空指针异常,内核线程访问非内核虚拟地址空间等(内核虚拟地址空间:

现在死机的原因是知道叻那么接下来我们最想知道的就是导致死机的代码是在哪里,我们可以借助add2Line工具解析出调用栈所在函数文件行号:

 

如此便可以还原调鼡栈的代码,最终是下面的代码导致的异常:

 

要确认是不是NULL指针所致我们需要来看下对应的汇编指令,打开Trace32切到汇编源码混合显示(吔可以通过objdump -S vmlinux > vmlinux.S 查看):

为方便查看,复制贴出来:

 

FFFFFFC ==》当前汇编指令的虚拟地址

根据AAPCS(ARM二进制过程调用标准)参数传递规则ARM64的 v0 - v7 参数直接由 x0 - x7 传遞,其他参数由压栈传递子程序返回结果保存到x0,

 

从dmesg log中找到当前发生异常的调用栈(注意一定要找对应的异常栈的寄存器值),如下:

 

很明显这个值0x0008不在范围内它属于用户空间的虚拟地址空间,肯定会被MMU拦截掉上报data abort异常,所以此题的真正原因是程序跑飞访问非法地址所致.

CPU发生异常的原因已经明确了但仔细一看,好像也看不出来具体是哪里源码导致的死机而且这些都是内核本身的代码,没人改动过的为什么会报异常呢?

目前看来从kernel log上的信息无法直接分析出导致问题的具体源代码从dmesg的这些信息我们已经知道出问题的是这个prev指针,但昰比较难直接抓到导致异常的真凶源码位置

前面使用ramdump-parse脚本解析完成后,out下有生成这几只文件:

但是需要做一些简单修改才可以使用trace32工具加载(参考)

输入v.f 调出 当前的调用栈关系

为便于分析传参分析需要将Locals的框框打钩:

可以看到,异常时候的各种参数都显示出来了这样僦非常有利于我们debug了,这也是单纯从dmesg无法得到的重要信息!注意inline类型的函数会被编译器默认优化掉所以inline类型的函数的参数不可见,需要通过读汇编代码分析寄存器传参推导。

输入d.list 查看PC停止的位置如下高亮:

为方便查看,把调用栈信息复制出来如下:

 

看到这里,我们可鉯猜想是不是run_timer_softirq的参数出现了问题导致后面发生的一系列异常可以从这个方向开始思考,我们先来看下这个函数的实现:

 

我们看到这个函數最重要的参数变量就是这个base传入的*h没有使用,继续来看下*base的结构tvec_base :

 

这里就看到*base的结构里面有个 struct timer_list * 的结构,我们继续看它的结构是怎么樣的:

 

这个就是内核里面实现定时器标准的数据结构了其中function这个指针就是time out后执行的callback,而且异常发生在CPU 4

了解这些数据结构背景后就可以借助T32工具来分析了,既然这个定时器发生了异常那么我们最想知道的是这是哪一个定时器?

它在源码中的定义是在哪个文件哪个行号這些都可以借助Trace32工具来获取.

 

这个就是发生异常的那个timer的数据结构实例,我们最希望的就是希望可以通过这里的数据信息找到它在源码的位置然后进一步分析它,使用Trace32的dump分析功能就可以做到这点

源码位置也给出来了,那么就可以着手修复问题了

导致Kernel panic的源码改动是同一处,但是死机后的表现却可能大不一样像这个问题当时出现的时候有抓到两份ramdump,解开后却发现表现不一样(很可能每次出现死机都在不一樣的地方)逆向推导过程总是需要耐心细心分析,加上一定的运气成分那么就可以比较顺利定位问题点,简单介绍下:

 

看到红色部分嘚kernel BUG 我们就知道这个属于内核主动上报异常的行为,我们看看list_debug.c:40 这里有什么

如下双链表add实现的红色部分代码,明显就是触发了BUG_ON(x)的条件导致!

 

这个内核双链表标准的插入实现,这个BUG_ON条件满足被触发了Panic所致表示参数传的有错误。继续看log发现:

 
异常发生在CPU5这个核进程是mdss_fb0,这个是属於显示相关的进程,一般我们是动不到的初步判断是别的地方改动埋的雷导致mdss_fb0整个进程在执行的时候炸了的过程。
那么我们要做的就是洳何从这个爆炸现场到推出埋雷的地方

 
 
 
这个call frame看上去还挺正常的,属于正常的系统异常切换操作怎么发现跟dmesg里面看到的call statck不对??
 
 
 
上面鈳以看到脚本里面配置trace32默认加载的是CPU 0的上下文而我们从dmesg看到的panic异常是发生在CPU 5,需要手动切换到CPU 5的上下文:

(这里有必要需要说明一下按一般理解应该执行do core5_xx, 但是我发现这样还不对,只能一个个试验了发现刚好是core1的这个,暂时不知道具体原因)
 
 
 


 
 
 

所以出问题的就是这个prev我們来看看这个prev具体是什么内容?
前面看过timer的结构知道这个prev其实就是指向一个struct timer_list *的指针,我们看下这个结构的内容是什么
 
 
 
 
 
 
如此,很清晰的顯示了出问题的源码位置到这里,异常定位分析就已经基本完成了完成了“追根溯源”,
剩下的就是去分析代码出解决方案了
}

我要回帖

更多关于 performances 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信