晶晨半导体社招面经——Linux驱动工程师

2 02 2 年,我在Amlogic Linux驱动面试时一头雾水。
无论哪种方式,它都只是两个轮子围成一圈。
从技术角度来看,内存管理是重点。
问了Linux驱动内存分配函数如kmalloc和dma_alloc_coherent。
他们应该知道一切。
记得我讲完之后,面试官又问了,如果DMA内存里有Cache怎么办?我说需要清除缓存或者使用MESI协议,而且还需要结合硬件架构。
无论哪种方式,这都非常令人困惑。

有DMA和Cache机制。
dma_alloc_coherent 分配未缓存的内存,因此请记住这一点。
Cache一致性,硬件层面包括Cacheline、MESI协议等。
软件层面,flash_cache_range或者自动硬件同步。
后来我意识到他们问这些问题是为了看看你是否理解基本原理。

问了很多关于BSP适配和驱动开发的问题。
您应该熟悉硬件初始化、设备树修改和驱动移植。
他们向我询问了 Amlogic 芯片的 ARM Cortex 系列内核。
当时我就糊涂了,只能胡言乱语。
不管怎样,最终还是没有得分。

问题解决和职业规划。
我对这部分是有一定准备的。
他们向我询问死锁和性能瓶颈等复杂问题,我告诉他们需要使用 dmesg 日志和 perf 工具来发现,然后更改锁定顺序并优化中断处理。
就职业方向而言,我认为芯片制造商专注于基础驱动优化,终端制造商专注于功能实现。
无论如何,先把事情弄清楚。

第二次面试时,进行了系统层面的技术深入和验证。
UART/SPI子系统,Uboot启动过程,我还没有完全准备好。
我什至对双系统和异构通信以及ARMh3.LITTLE架构一无所知。
通信机制、核间中断、共享内存、异构结构连接 - 这些术语对我来说似乎很混乱。

技术深度和项目实施经验,这方面我有点薄弱。
一个异构框架,Remoteproc/RPMSG原理,虽然我没有真正用过,但是也可以讲一下。
如果问题再次出现,他们可能会再次问同样的问题,我将不得不准备更多的技术细节。

一般建议:您需要准备一篇分为八部分的论文。
Linux 驱动程序模型、内存管理和中断处理等基础知识都是建立肌肉记忆所必需的。
提炼项目经验,准备2 -3 个体现技术深度的案例,注重个人贡献和技术选型依据。
对于反馈调查策略,您可以询问团队的技术堆栈、项目挑战、职业道路,并积极主动。
在谈论辞职原因时,不要说前公司的坏话,只谈论个人发展,否则完全符合Amlogic的芯片制造业务路线。

不管怎样,最后我离开了采访室,感觉很极端。
也许我准备得不够充分,也许我太紧张了。
不过,生活还得继续,明天还要上班。

嵌入式linux 学习 科目

嵌入式Linux学习包括以下五个主要组成部分:
1 .应用层:文件读写;软件编写如学习网络和C++作为接口。

2 底层开发:处理硬件; ARM架构;系统更换;了解内核和驱动程序开发。

3 基本功:C语言; Linux 基础知识;开发环境;这些都是基本技能。

4 高级规范:使用GDB编写和调试规范代码。

5 特殊选项:根据您将来想要执行的操作选择安全增强功能或特定条件。

看看你自己,我首先喜欢这个。

请教嵌入式linux应用层开发工程师要具备什么

哈,这确实是一本针对嵌入式Linux工程师的综合学习指南。
我们来谈谈这个话题。

首先,C语言基础是必须的。
我之前在2 02 3 年参与的一个项目中,由于指针操作错误导致整个系统崩溃。
这是一个深刻的教训。
因此,有必要对基本数据类型、指针和结构体有扎实的基础。

然后是Linux系统。
记得2 01 9 年刚接触Linux的时候,对于命令行操作确实很迷茫,但现在想来,确实也不过如此。
目录结构、基本命令、VI编辑器以及Linux下的GCC、GDB等工具都是嵌入式开发中不可缺少的。

对于系统编程、进程和网络管理、进程间通信,这些都是困难的事情。
记得有一次,为了解决一个多线程同步问题,我花了一周的时间调试代码,终于解决了。

网络编程也很重要。
在我 2 02 1 年初参与的一个项目中,我需要实现一个基于 TCP 的通信协议。
那时,我对TCP/IP协议和socket编程有了更深入的了解。

我认为数据结构和算法是整个嵌入式开发的核心。
2 02 0年我开发嵌入式系统时,由于算法设计不当,导致系统响应速度非常慢。

对于C++和Qt来说,这在图形界面编程中非常有用。
在我 2 01 8 年参与的上一个项目中,我使用 Qt 开发了一个用户界面。
在那段时间里,我对面向对象编程有了更深入的了解。

Cortex-A8 平台开发,这个也是必要的。
我2 02 2 年参与的项目需要基于Cortex-A8 处理器进行开发。
那时我对ARM架构有了更深入的了解。

最后,驱动程序开发部分,说实话,相当具有挑战性。
在我 2 02 3 年初参与的一个项目中,我需要开发硬件设备的驱动程序。
在那段时间里,我对Linux内核机制和驱动开发有了更深入的了解。

总之,理论知识是基础,但项目实践也同样重要。
在学习的过程中,多进行实践练习,这样才能真正提高自己的开发能力。
无论如何,这取决于你。
嵌入式开发并不容易,但是很有趣。
我还在想这个问题,你呢?