LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

linux内核 驱动 做Linux驱动工程师必须知道的一些事儿

2023年7月5日 189点热度

你们好。

做Linux驱动工程师也有一段时间了,明天分享一下我以前入职才晓得的一些事情,算是一个新手的经历吧。

设备树

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

在.c中实现module_init和module_exit这两个函数,之后在module_init的函数里加个printk,输出个helloworld。

把.c编译成.ko,之后insmod加载驱动,见到有复印,即使成功了。

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

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

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

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

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

linux内核驱动开发前景_linux内核驱动模型详解_linux内核 驱动

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

工具链

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

因为工作须要linux内核 驱动,有段时间我须要自己弄一个工具链,以前就碰到了各类错误:xxxcommandnotfound、GLIBC2.34VESIONnotfound等等。

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

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

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

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

文件系统

linux内核 驱动_linux内核驱动开发前景_linux内核驱动模型详解

如同前面说的,工具链和文件系统的关系是很大的。

其实是做驱动开发,并且文件系统的一些东西也是要晓得的。

当初刚入职的时侯,要把一个.ko驱动在系统启动完成前就加载,这时才晓得原先可以把命令放在/etc/init.d/rcS里

作为驱动工程师,可以不用把文件系统了解的太深,但至少要晓得inittab、rcS、passwd和shadow这几个文件的作用,还有就是上面说的C库。

rcS是文件系统启动时要执行的一些命令,inittab、passwd和shadow主要是更改系统登陆时的用户名和密码,包括设置免密登陆等等。

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

驱动如何编进内核

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

但一运行,驱动没生效。后来才晓得,原先还要更改Kconfig。

linux内核驱动开发前景_linux内核驱动模型详解_linux内核 驱动

把驱动编进内核,虽然正确的做法应当是通过menconfig菜单才能配置这个驱动是否编译,即更改Kconfig。

Makefile和Kconfig都更改了,驱动还是没生效?

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

之后加复印,把内核initcall的等级复印下来,看内核是否早已跑了该等级的初始化。假如早已挪到了,再把该等级的initcall执行函数的地址复印下来,之后反汇编vmlinux,看是否早已执行了新加驱动的probe函数。

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

自动更改defconfig配置引起的问题

编译内核时,一般还会用厂商提供的一个默认配置文件,比如makexxx_defconfig。

但若果我们想这个配置文件中加一个自己的宏,比如CONFIG_XXX=y,之后在代码中判定#ifdefCONFIG_XXX,你会发觉并没有生效,但是原先写的CONFIG_XXX=y也没了。

这是好多菜鸟改defconfig就会碰到的问题,虽然是没有看懂怎样正确更改defconfig文件。

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

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

所以还是建议通过menconfig菜单进行配置,除非真的弄清楚了这种关系能够去自动更改defconfig。

源码阅读/跟踪问题

尽管有一些比较有用的内核调试方法linux内核 驱动,但真正常用的,还是加复印跟踪,其它调试方法归根究竟还是辅助性的,好多情况下还是靠加复印剖析问题。

在跟踪源码,解决一些问题的时侯,也要注意一些方法。

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

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

中级的驱动工程师,只须要会一些简单的驱动,比如一些简单的时钟、定时器、led这种驱动。

但若果往上进阶,就须要会更多的驱动,比如USB、网卡这种复杂的,这种驱动的前提是你得懂时钟、复位、dma等这种驱动,由于会用上这种驱动的插口,所以要求会初一点。

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

所以,会多少驱动,这显然是一个进阶的过程。没有说一定要会多少个,但随着工作经验的下降,自身所把握的驱动也会越来越多,承当的责任也越大。

工作职责问题

如上面所说,其实叫Linux驱动工程师,但工作绝不仅仅是写Linux的驱动。

确切的说,应当叫底层开发工程师。由于不仅Linux驱动,uboot、文件系统、系统移植都是要弄的。

我因为部门的特殊性,还须要做一些芯片流片前的验证,就常常须要看一些汇编代码,反汇编程序,通过仿真下来波形进行剖析。流片回去后,还须要bringup。

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

假如想厘清楚Linux内核驱动中的奥秘

欢迎你们学习下边

linux内核驱动开发前景_linux内核 驱动_linux内核驱动模型详解

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: glibc linux系统 uboot
最后更新:2023年7月5日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结 Linux之父李纳斯托瓦兹开发的Linux只是一个内核 Linux系统中的apt和apt-get的区别及解决办法! Linux系统发行版的一种方法,除此以外 MacM1上安装Docker和CentOS,您需要遵循的步骤 linux光驱启动怎么设置 常见的几种设置方法,你知道几个? 关于ESXi主机磁盘空间回收的具体操作步骤及步骤 Linux设置显示中文和设置字体设置中文一个都不能少 如何在Linux系统中使用命令查看Linux发行版版本信息
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
物理内存大许多倍的内存管理子系统是怎么来的?(图) (Unix)Unix时间戳转换公式及Unix操作成时间公式 Linux的软件安装方式进行汇总和安装的方式汇总 Linux下强大的shell,模式下配置 0x1查看用户在命令行中输入:​输出的第一列表示 如何利用linux来开发属于自己的嵌入式Linux操作系统 linux系统位数最简单的命令--linux 文件类型扩展名及打开方式文档文件文件 如何在Linux上安装最新版本的安装教程本教程 Linux计算机上使用ip命令来找到目标IP地址的方法 如何在Linux上安装虚拟机的结果大多都是怎么安装的 《Linux命令全集》之Linux命令解释和例子 无窗口的Python可执行程序(图)命令(组图) Linux系统chmod命令使用数字修改文件权限的方式有哪些? 1.3socket编程客户端-服务端基本流程图片App Shell用C语言编写的程序-Shell教程脚本 如何在Linux系统上下载和安装Steam呢?如何操作 如何把Linux操作系统放在大型服务器上运行Linux系统 普联技术有限公司程序的安装包使用方法通过-LINK RedHatEnterpriseLinux系统默认使用的文件系统是“ext4”
标签聚合
linux服务器 文件目录 内核 应用 虚拟机 命令 操作 linux系统 软件 文件
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 70篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.