本文共 1469 字,大约阅读时间需要 4 分钟。
下面纯属个人工作笔记零散记录,主要为了保存一份美好亲切的技术回忆,没打算让别人阅读。写的比较凌乱,抱歉。
博泰做的工作事情:
1:解决中断风暴的事情。
出现中断风暴原因: 1)imx6会固定把很多外设的中断绑在core 1上,里面有uart中断,usb设备中断。 2)外设在中断控制器里面对应的自己设备的中断,有不同类型,有电平中断,上升沿下降沿中断等。 当时usb的中断类型规定是在自己的设备服务程序起来后,必须对imx6的中断控制器发个回执信号,具体是写下usb相关的寄存器。 如果不发回执信号的话,imx6的中断控制器就会误认为设备端那边没有接收到该中断,然后下来会不停的狂发中断到该该设备端的。 这样就会有中断风暴出现。所以有了上面两点现实情况后,我的那个问题就是在某种特殊的场景下发送的,我记得会把usb代码里面的有个worker,把该worker推迟5秒再发送到任务队列里面。
然后就是这种推迟几秒的操作,导致了usb中断服务程序里面并没有发送回执信号到中断控制器(没有发送中断回执信号,是我们改代码改出的问题)。然后下来出现usb的中断风暴了。然后串口控制台突然失灵了,下来就是cpu就重启了。
当时定位bug原因就是把uart设备中断绑定到core 2上,然后出现此bug时,串口控制台就没有失灵了,我就可以利用串口控制台进行调试,通过cat /proc/interrupt,
发现产生usb的设备中断数目在狂增,所以定位到usb中断有问题,所以看了usb中断服务程序相关代码,发现是没有发送中断回执信号导致的问题。2:解决车载机无法显示倒车图像的问题。
就是当时的32位cpu机,虚拟地址空间内核态3G - 4G区域,往4G去的区域有块DMA专用的虚拟内存区域。 然后负责倒车功能的程序需要用dma分配出大块的连续虚拟内存空间后,才能顺利显示倒车图像。 恰巧当时就是这种分配内存出错,导致无法显示倒车图像。 分配内存为什么出错,是因为当时的内核态,为dma分配虚拟内存这块代码写的有问题,所以我调整了下内存分配代码, 然后下来分配虚拟内存成功了,然后下来就顺利显示倒车图像了。3:解决车载机camera图形显示卡住不动的bug(待添加)
因为内核hrtimer的一些缺陷,而做的修复方案。
4:其他内核崩溃问题
当时出现的内核崩溃问题,还会用objdump工具,解析vmlinux,结合last kmesg中的崩溃pc地址,会看到崩溃时对应的代码在内核的哪一行。 然后当时发现崩溃原因是代码指针相关问题。
小米做的事情:
1:内核态内存越界问题
在测试碎片整理内核态代码时,发现测试一段时间后,系统就会崩溃重启。但是根据崩溃的log,无法定位到具体是哪个地方的问题。
所以问了项目组另外一个人crash工具的使用方式,然后用crash工具解析生成的崩溃core文件,结合内核last kmesg里面的崩溃log,发现自己写的内核代码附近有一块内存区域被踩。 然后下来看了下运行kernel当时被编译时,对应生成的system.map文件,在该文件中找这块被踩内存的附近区域,看看附近区域的内存分配读写有无异常行为。 然后突然发现附近区域有个大的数组,是我实现内核碎片整理功能时,定义会频繁读写使用的。 该数组我分析了下,确实会存在数组越界的情形,然后如果越界后,就会去踩他附近的内存区域。2:fuse文件系统架构及相关passthrough优化缺陷解决(待描述)
该fuse架构缺陷问题会导致手机系统死锁重启。
转载地址:http://rkrvb.baihongyu.com/