01. 前言

有多少Linux驱动工程师是通过《Linux设备驱动程序》这本书入门的呢?今天翻到了抽屉里的这本书,想想也是挺感慨的。

Linux设备驱动程序封面

所以重新翻开这本书,通过文章来记录并实践其中的知识要点,加强自己对于Linux驱动的理解。

1. 一些概念

  • 机制:需要提供什么功能
  • 策略:如何使用这些功能
    在编写驱动程序时,应该针对机制编程,而不要强加策略,策略的添加留给上层的应用去添加,这样做的目的是使得驱动程序会更加灵活。

设备分类:

  • 字符设备:能够像字节流(文件)一样被访问的设备,主要实现 openclosereadwrite 等系统调用。文件节点位于 /dev 目录下。
  • 块设备:一次性只能访问一个或者多个完整块,每个块包含512甚至更多的字节。文件节点也位于 /dev 目录下。
  • 网络接口:一个能够和其他主机交换数据的设备,不存在对应的节点,有一套专门的传输函数。

2. 环境搭建

要开发驱动自然需要有Linux系统。我这边选用的是最新的Ubuntu 2020,也可以使用CentOS、DeepIn等操作系统,根据自己的习惯选择就好。

去官网下载ISO镜像文件,安装一个虚拟机或者直接用U盘安装到电脑上都可以,这些应该不需要过多介绍了。还有一些操作过程中的权限问题,也不再具体说明了。

在写驱动代码前我们还需要准备好内核树,什么是内核树呢?

可以理解为内核源码。针对当前的操作系统编写驱动程序,需要与源码中的目标链接,这样编译出来的驱动模块才能够在当前的操作系统中正常运行。

如何准备内核树呢?

其实安装完Ubuntu系统后,其提供了 linux-header,路径为 /usr/src/,如下图所示。

ubuntu系统中的linux-header目录

通过 uname -a 命令查看当前的系统信息,可以看到内核版本号为 5.4.0-40-generic。

uname命令结果

因此,我们基于
/usr/src/linux-headers-5.4.0-40-generic 目录编译模块即可。编译命令如下:

格式:make -C linux-header目录 M=源码目录 modules
示例:make -C /usr/src/linux-headers-5.4.0-40-generic M=/home/que/quehehe modules

前提条件是在源码同目录下的有Makefile文件,内容为:

obj-m += helloworld.o

其中的 helloworld.o 根据编译源文件进行更改。

之前踩的坑

之前根据上面的 uname 命令获取到内核信息后,运行 sudo apt-cache search linux-source 查询可以安装的源码,如下图所示,并安装了其中的5.4.0源码。

查看可以安装的内核源码

基于这个源码进行漫长的编译后,得到的模块不能加载,原因是模块的 vermagic 版本与内核的版本不一致,模块的 vermagic 版本为5.4.44,而不是5.4.0,我也不清楚这是什么原因,所以不采用下载源码并在源码中编译。

3. 源码编译

从上面可知,可以不用自己编译源码了,但上面踩了坑,但还是记录一下上面编译源码过程。

编译源码主要有以下几步:

  • 切换到源码根目录下
  • 运行 make menuconfig 命令,成功后按esc直接退出,得到.config文件
  • 执行make命令,等待编译完成

我在初始编译的过程中出现了以下几个问题,基本都是库缺失,缺什么库下载什么库就好了。

问题1 缺失libncurses-dev

问题1:Unable to find the ncurses package.

解决方法:sudo apt install libncurses-dev

问题2 缺失flex

问题2:flex: not found

解决方法:sudo apt install flex

问题3 缺失bison

问题3:bison: not found

解决方法:sudo apt install bison

问题4 缺失openssl库

问题4:fatal error: openssl/opensslv.h: 没有那个文件或目录

解决方法:sudo apt install libssl-dev

上述的解决方法在Ubuntu 2020中解决了对应问题,如果是其他系统,可能对应库的名字不一样。

解决以上问题后,耐心等待,即可正常编译完成。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容