入职Linux驱动工程师后,我才知道的真相…

news2024/11/24 12:52:00

大家好,我是ST。

做Linux驱动工程师也有一段时间了,今天分享一下我曾经入职才知道的一些事情,算是一个菜鸟的经历吧!

设备树

起初学习Linux驱动,是从最简单的一个.c文件开始。

在.c中实现module_initmodule_exit这两个函数,然后在module_init的函数里加个printk,输出个hello world。

把.c编译成.ko,然后insmod加载驱动,看到有打印,就算成功了。

到了后来,我接触到设备树,加载dtb.ko驱动,看到有打印,又成功了。心想,设备树应该就是这样吧。

直到有一天,工作中遇到一个uboot没打印问题,主管问我:你设备树编进uboot了吗?

我懵了:把...把Linux的设备树编进uboot里?这能用?

主管:不是啊,uboot自己的设备树啊。

曾经我一度以为设备树是Linux的东西,别的程序没有,另外当时对uboot了解很浅,只简单用过几个命令。

直到那天,我才明白,所有的程序都可以有自己的设备树,不仅仅是uboot和linux,只要它实现了设备树这一套机制就可以。包括Linux的那一套Kconfig机制,在其他的一些开源项目中也在广泛应用。

工具链

编译一个程序在开发板上跑,通常我们都是用厂商提供交叉编译工具链。但我们自己换一个工具链,可能编译出的程序在开发板上就跑不了。

由于工作需要,有段时间我需要自己弄一个工具链,曾经就遇到了各种错误:xxx command not foundGLIBC 2.34 VESION not found等等。

另外,我们平时用的像arm-linux-gcc这种工具链名称都是简写,除了架构和运行平台,看不出其他的区别。

其实,不同的工具链除了架构和运行平台上的区别,主要还有C库、gcc版本的区别。

交叉工具链在制作的时候,可以选择具体的C标准库,glibcuclibc或者musl等等,如果这个工具链的C标准库是glibc的,那么用这个工具链编译出来的程序,就不能在uclibc或者musl这些非glibc库的文件系统下运行,否则就会报command not found错误,明明有这个可执行文件,却说找不到,让你百思不得其解。

交叉工具链所使用的gcc版本影响也很大,因为不同的gcc版本所对应的C库版本不一样。例如,用gcc10的工具链做的glibc文件系统,里面C库版本只支持到2.30,这时用一个gcc12的工具链编译一个程序在该文件系统上运行,就会提示glibc版本找不到的错误。

文件系统

就像上面说的,工具链和文件系统的关系是很大的。

虽然是做驱动开发,但文件系统的一些东西也是要知道的。

曾经刚入职的时候,要把一个.ko驱动在系统启动完成前就加载,这时才知道原来可以把命令放到/etc/init.d/rcS

作为驱动工程师,可以不用把文件系统了解的太深,但起码要知道inittabrcSpasswdshadow这几个文件的作用,还有就是前面说的C库。

rcS是文件系统启动时要执行的一些命令,inittabpasswdshadow主要是修改系统登录时的用户名和密码,包括设置免密登录等等。

通常把文件系统提供给客户前,都会把用户名改为root,密码改为自己公司的名字,这时就会用到这几个文件。

驱动怎么编进内核

一开始,我知道Linux内核源码中每个目录下都有一个Makefile,我以为改个Makefile就行了。

但一运行,驱动没生效。后来才知道,原来还要修改Kconfig

把驱动编进内核,其实正确的做法应该是通过menconfig菜单能够配置这个驱动是否编译,即修改Kconfig

MakefileKconfig都修改了,驱动还是没生效?

这时就要看.o文件是否编译出来了,如果编译出来了。进一步看这个驱动的初始化级别,看是module_initarch_initcall还是其他的级别。

然后加打印,把内核initcall的等级打印出来,看内核是否已经跑了该等级的初始化。如果已经跑到了,再把该等级的initcall执行函数的地址打印出来,然后反汇编vmlinux,看是否已经执行了新加驱动的probe函数。

基本上,通过以上过程的分析,就能够定位到为题所在。

手动修改defconfig配置引发的问题

编译内核时,通常都会用厂商提供的一个默认配置文件,例如make xxx_defconfig

但是,如果我们想这个配置文件中加一个自己的宏,例如CONFIG_XXX=y,然后在代码中判断#ifdef CONFIG_XXX,你会发现并没有生效,并且原来写的CONFIG_XXX=y也没了。

这是很多新手改defconfig都会遇到的问题,其实是没有搞懂如何正确修改defconfig文件。

defconfig中定义了CONFIG_XXX=y后,还要在Kconfig文件中添加一个config XXX的配置才会生效。

另外,如何某个配置选项存在依赖关系,但依赖的配置选项没打开,也会出现这种不生效的情况。

所以,还是建议通过menconfig菜单进行配置,除非真的弄清楚了这些关系,才能去手动修改defconfig

源码阅读/跟踪问题

虽然有一些比较有用的内核调试技巧,但真正常用的,还是加打印跟踪,其它调试技巧归根到底还是辅助性的,很多情况下还是靠加打印分析问题。

在跟踪源码,解决一些问题的时候,也要注意一些技巧。

曾经在解决一个内核自解压的问题时,加打印跟了很久,甚至跟踪到解压缩算法,但其实像这种算法性、协议性的东西,尽量少去怀疑它的错误,就是不用花太多时间去跟踪这些协议算法是怎么实现的,而是跟踪一些函数传参过程,关注是否正确使用、是否正确传参问题,因为最终解决问题可能只是一个很简单的操作。

需要学会多少个驱动才行?

初级的驱动工程师,只需要会一些简单的驱动,例如一些简单的时钟、定时器、led这些驱动。

但如果往上进阶,就需要会更多的驱动,例如USB、网卡这些复杂的,这些驱动的前提是你得懂时钟、复位、dma等这些驱动,因为会用上这些驱动的接口,所以要求会高一点。

当你能够掌握一个比较复杂的驱动,这其中自然就会涉及到其他的一些基础驱动,自然会的更多,这往往对应的是高级工程师。

所以,会多少驱动,这其实是一个进阶的过程。没有说一定要会多少个,但随着工作经验的增长,自身所掌握的驱动也会越来越多,承担的责任也越大。

工作职责问题

如前面所说,虽然叫Linux驱动工程师,但工作绝不仅仅是写Linux的驱动。

准确的说,应该叫底层开发工程师。因为除了Linux驱动,uboot、文件系统、系统移植都是要弄的。

我由于部门的特殊性,还需要做一些芯片流片前的验证,就经常需要看一些汇编代码,反汇编程序,通过仿真出来波形进行分析。流片回来后,还需要bringup。

所以,只要是底层相关的工作,多少都会涉及的,只不过可能有些企业会分得比较细,把系统层和驱动层分开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型入门(三)—— 大模型的训练方法

参考hugging face的文档介绍:https://huggingface.co/docs/transformers/perf_train_gpu_many#naive-model-parallelism-vertical-and-pipeline-parallelism,以下介绍聚焦在pytorch的实现上。 随着现在的模型越来越大,训练数据越来越多时&…

基于Ubuntu22.10系统安装部署webmin软件

Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具。有了这个工具的帮助,我们可以管理内部的系统配置,诸如设置用户账户,磁盘配额,像Apache, DNS, PHP, MySQL,文件共享的服务等。 本文描述在ubuntu22.…

VS+C#+WPF多线程视频摄像头播放器监控

程序示例精选 C#WPF多线程视频摄像头播放器监控 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C#WPF多线程视频摄像头播放器监控>>编写代码&#xff0c;代码整洁&#xff0c;规…

el-table点击单元格变成输入框,以及其自动获取焦点失效可能的原因(focus失效)

1.el-table点击单元格变成输入框 这里主要使用了el-table三个自带的方法/属性&#xff1a; <el-table:data"MesTableData"bordercell-click"clickCell":row-class-name"tableRowClassName":cell-class-name"tableCellClassName" …

解决elementUI弹出框关闭后再打开el-select下拉框无法选中的问题

文章目录 一、问题描述&#xff1a;二、问题解决 一、问题描述&#xff1a; 使用的前端UI框架为elementUI。 el-select组件在一个弹框中&#xff0c;打开该弹框&#xff0c;el-select可以正常选中&#xff0c;但是保存弹框中的表单信息关闭弹框后&#xff0c;再打开弹框&…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

【Java基础篇】方法的使用(方法的重载和递归)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&…

打造智能生活方式

2个互联网工具与你分享 分享一&#xff1a; 随记单词是一款功能强大的单词记忆和管理应用程序。它为用户提供了便捷的学习工具和智能化的记忆方式&#xff0c;帮助用户轻松有效地记忆和掌握单词。 随记单词的特点之一是个性化记忆计划。用户可以根据自己的学习进度和需求&am…

如何使用MATLAB处理涡度通量数据

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&#x…

苹果头显Vision Pro深度解读3 苹果头显visonOS开发指南

1 程序员visonOS开发指南 作为iOS开发者&#xff0c;切换到visionOS开发非常简单啊&#xff0c;过去的一些技术基本上都用得上。目前根据苹果WWDC官方的文档&#xff0c;视频&#xff0c;我们可以知道: 开发语言&#xff0c;使用的是swift object-c c c等&#xff0c;swif…

简化日志数据管理:利用 Elastic 灵活路由的力量

作者&#xff1a;Felix Barnsteiner&#xff0c;Nicolas Ruflin 在 Elasticsearch 8.8 中&#xff0c;我们在技术预览中引入了重新路由处理器&#xff08;reroute processor&#xff09;&#xff0c;它可以根据灵活的路由规则将文档&#xff08;例如日志&#xff09;发送到不同…

Jmeter吞吐量控制器使用小结

吞吐量控制器(Throughput Controller)场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现.。 添加吞吐量控制器 如果你想学习jmeter性能测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网…

第十六届全国大学生信息安全竞赛CISCN---Cypto

1.Sign_in_passwd 打开环境&#xff0c;下载附件&#xff0c;用记事本打开flag的文件 发现里面是像base密码但又不像base密码的一串&#xff0c;第二行的%&#xff0c;就很像url密码啊&#xff0c;之前做题没接触过啊&#xff0c;还是做题做少了 没有啥解题思路&#xff0c;看…

基于Jeecg-boot的flowable流程支持拒绝同意流程操作

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 因为看很多朋友需要…

利用Transformer BEV解决自动驾驶Corner Case的技术原理

摘要&#xff1a; 本文总结了Transformer和BEV技术在自动驾驶中的原理和应用&#xff0c;特别是如何解决Corner Case问题。 自动驾驶系统在实际应用中需要面对各种复杂的场景&#xff0c;尤其是Corner Case&#xff08;极端情况&#xff09;对自动驾驶的感知和决策能力提出了更…

访问者模式(十八)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了命令模式(十七), 如果没有看过, 请观看上一章 一. 访问者模式 引用 菜鸟教程里面访问者模式介绍: https://www.runoob.com/design-pattern/visitor-pattern.html 在访问者模式&#xff08;Visitor Pattern&#xff09…

大模型入门(六)—— RLHF微调大模型

一、RLHF微调三阶段 参考&#xff1a;https://huggingface.co/blog/rlhf 1&#xff09;使用监督数据微调语言模型&#xff0c;和fine-tuning一致。 2&#xff09;训练奖励模型     奖励模型是输入一个文本序列&#xff0c;模型给出符合人类偏好的奖励数值&#xff0c;这个奖…

大数据技术——用户与组管理

一、实验目的 1.了解linux用户和组 2.熟练掌握liunx用户和组的基本操作 3.进一步了解linux系统 二、实验内容 1.用户账号的添加、删除与修改。 2.用户口令的管理 3.用户组的管理 三、实验原理或流程 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使…

阿里面试了7轮...就这么狠的吗?

引言 今年的大环境非常差&#xff0c;互联网企业裁员的现象比往年更严重了&#xff0c;可今年刚好是我的第一个“五年计划”截止的时间点&#xff0c;说什么也不能够耽搁了&#xff0c;所以早早准备的跳槽也在疫情好转之后开始进行了。但是&#xff0c;不得不说&#xff0c;这…

ApacheStreamPark2.1.0部署及执行flink-cdc任务同步mysql表的数据到es的实践

文章目录 [toc] 1.ApacheStreamPark是什么&#xff1f;2.介绍2.1 特性2.2 架构2.3 Zeppelin和StreamPark的对比 3.相关连接4.部署4.1 二进制包编译构建4.2 镜像构建4.3 初始化sql4.4 部署4.4.1 Docker-compose.yaml部署脚本4.4.2 配置文件准备4.4.3 flink启动配置4.4.4 streamp…