小鹏社招面经——Linux内核稳定性工程师

1.自我介绍

2.内存泄露问题了解多少?如何定位?

像长时间老化发生卡顿、内存不足触发大量的lowmemorykiller或者oom、内存分配失败,这些都可以去怀疑内存泄露。

内核的内存泄露,主要就是slab内存泄露、ion内存泄露、私有页内存泄露。

定位的话,我一般是,先监控进程ps内存变化,确定内存泄漏存在。第二,泄漏存在,对代码进行静态扫描,解决所有扫出来的问题。第三,上内存检测工具,memchecker,valgrind都行,解决工具扫出来的问题。第四,带上自定义的分配器或mtrace之类的上压测,解决测出的问题。

3.什么是Cache一致性?

简单来说,就是读到的数据是旧数据,Cache数据还没同步过来

4.说下你做过的一些优化?

说一个内存相关的吧,riscv的linux内核,对启动地址有个2M对齐的要求,原因是为了与OpenSBI对齐。因为OpenSBI默认跳转偏移是2M,但OpenSBI并不需要这么空间,这就导致中间有1M+内存浪费,所以任务就是把这内存映射起来。

怎么做呢?跟内核代码发现,2M对齐要求,一方面是内核对启动地址做了检查,不符合直接触发BUG_ON;另一方面,它的临时页表只建到了二级页表,而二级页表是2M的,没有继续建到三级页表,所以寻址不能寻到更小地址。

因此最终就是,修改内核,给这个启动用的临时页表,建立三级页表,三级页表是4K,只需要地址4K对齐就行。

5.CMA分配的内存是哪种属性,在cpu和dma之间共享的处理怎么保证一致性?

通过dma_alloc_coherent, dma_alloc_writecombine分配到的CMA内存,都是non-cached,没有cache一致性问题。

通过ION分配到的CMA内存,可以映射成cached和non-cached。映射成cached的场合,可以使用流式DMA接口处理cache一致性。

6.对异常重启类问题,有多少了解?

异常重启,看是硬件还是软件。硬件的话,通常更多是外部电源掉电,像通常的板子都会有外部电源过流保护,触发过流保护就会导致整板掉电和重启。软件的话,内核panic是会重启系统的,这个可以配置,panic了就要具体分析原因了。

7. 简单说下什么是死锁?

你要的锁在我这,我要的锁在你这,我俩都在等彼此释放,但是释放又要拿到锁,陷入僵局死循环

8、说一下你遇到过的死锁案例?

说一个关于原子上下文的死锁吧,背景是做压测时,系统卡死,串口不可用,内核报错INFO: rcu_preempt detected stalls on CPUs/tasks。

从报错log上看,cpu0检测到cpu1 stalls了上千个jiffies,cpu1 stalls表示cpu1关闭了中断和抢占,是无法调度出去了,所以cpu1一直是在running swapper/1线程,log也是一直在报running swapper/1的信息。

根据现象,认为是死锁问题,然后打开内核的lockdep调试开关,lockdep出现了死锁log,提示在一个atomic的上下文中有去调用sleeping的接口,这是不允许的。因为原子上下文是一个关中断、关抢占的环境,所以一旦在会睡眠的接口中schedule出去了,cpu就再也无法调度了。

然后跟踪代码发现,在使用spin_lock_irqsave加锁后,继续使用了mutex_lock。spin_lock_irqsave接口是会关中断、关抢占的,不允许调度;而互锁锁会睡眠,一旦取不到锁就会schedule出去,那cpu就无法调度了,出现cpu stalls。

最终解决就是直接去掉这段互斥锁操作,因为已经有自旋锁做同步操作了。

9.有什么想问的

实际上,这些问题都是需要探讨的,光是死锁,我认为都可以聊半小时,时间有限简单聊聊。稳定性这块涉及面比较广,偏系统。

#校招##小鹏##嵌入式面经#
Linux驱动社招面经 文章被收录于专栏

记录Linux驱动社招面经,希望看到的人有所收获

全部评论
点赞 回复 分享
发布于 04-21 22:39 广东

相关推荐

点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务