LINUX驱动开发环境搭建

  • 一、 前言
  • 二、系统环境
    • Ubuntu
    • VMWare{非必选}
  • 三、开发环境搭建
    • 1.用于简单学习(Header)
    • 2.用于复杂驱动开发(源码树)
      • a. 基本包
      • b. 内核源码获取及编译
  • 四、驱动开发简单示例【HelloWorld】
    • 1. Linux C文件
    • 2. Makefile文件
    • 3. 驱动编译、加载及卸载
  • 五、参考链接
  • 六、写在最后的话【应该没有彩蛋】
    • 彩蛋?

一、 前言

本文以流水账为记述方式,叙述了从零开始在Ubuntu系统环境下建立LINUX驱动开发环境的过程,并提供了简单的例子。目的是为了给新手或者其它需要建立LINUX驱动开发环境的技术人员或DIY爱好者提供一个简单明了的建立过程。

为减少误解,现提供本文的记述时间:【二〇二〇年初冬】。

二、系统环境

Ubuntu

下表为最近的三个版本Ubuntu的简介及下载链接,博主建议选取最新的LTS版本,这样在系统维护服务上会有保障。

系统版本 系统名称 发布时间 终止维护时间 官方推荐系统配置
16.04.7(LTS) Xenial Xerus
18.04.5(LTS) Bionic Beaver
20.04.1(LTS) Focal Fossa April 2025 CPU:2 GHz(双核);内存:4 GB;硬盘:25 GB

:上表中标明“—”的代表:“官网未标明,请自行搜索信息”

VMWare{非必选}

官方免费版下载地址或自行搜索免费版,关键字:VMware Workstation Player,或从这里下载。

Ubuntu虚拟机硬件配置

  1. 配置要求:根据使用需求,最低配置要求如下:
开发环境 最低配置
简单学习开发环境 单核≥2GHz、内存≥2GB、硬盘空间≥20GB
复杂驱动开发环境 单核≥2GHz、内存≥3GB、硬盘空间≥60GB
  1. 其它要求:如有其它要求可自行尝试设置或自行搜索相关信息。

三、开发环境搭建

1.用于简单学习(Header)

如果仅需要简单的开发或者学习使用(如完成本文中HelloWorld驱动开发),则只需要安装以下基本工具:

sudo apt-get update
sudo apt-get install build-essential #获取基本开发工具,

2.用于复杂驱动开发(源码树)

可参见此链接做更详细的解答,下面仅列举主要步骤:

a. 基本包

深入开发Linux驱动,应选用以下代码构建环境(未标明尝试或非必须的就是一定要安装的)

sudo apt-get update
sudo apt-get install kernel-package #测试中会出现缺这缺那的情况,如以下包会丢失,如编译源码出现错误,可尝试执行
sudo apt-get install flex bison
#和/或
sudo apt-get install libssl-dev
#和/或
sudo apt-get install libelf-dev #libelf-devel or elfutils-libelf-devel
#如仍未解决,可自行搜索或尝试解决方案#编译生成menuconfig配置内核界面所需文件(非必须)
sudo apt-get install libncurses5-dev#开发版本管理及自动化包
sudo apt-get install automake#此处可能会有版本号
sudo apt-get install autoconf cvs subversion

b. 内核源码获取及编译

获取方式有两种:

  1. 从官网获取,获取后将解压后的linux-source-<version>文件夹放入/usr/src中。
  2. 使用apt指令获取:
sudo apt-cache search linux-source
sudo apt-get install linux-source-<version>
#<version>为当前linux内核版本号,如当前为5.4.0,即将所有的<version>替换为5.4.0
#安装成功后会放在/usr/src中,文件名称 tar jxvf linux-source-<version>.tar.bz2
cd /usr/src/
sudo tar jxvf linux-source-<version>.tar.bz2

之后再编译源码

cd /usr/src/linux-source-<version>
#以下三选一
sudo make config #逐一选择kernel的配置形式
#或
sudo make oldconfig #按原有kernel配置配置kernel
#或
sudo make menuconfig #使用可视化环境配置kernel#编译内核的过程
sudo make #编译内核,时间较长,可能会长达1小时及以上,如5.4.0用时约3-5个小时
#此时已完成了镜像编译和所有modules编译,如果不确定可以使用以下指令再编译
sudo make modules #编译内核驱动modules
sudo make bzImage #编译内核镜像#加载modules的过程
sudo make modules_install #安装内核模块
#检查安装
cd /lib/modules
#如果安装正常这里面会出现以版本号为文件名的文件夹,就证明安装成功了,如5.4.xx或5.4.xx-xx-generic

至此内核编译完成。

四、驱动开发简单示例【HelloWorld】

使用命令在桌面新建一个hello的文件夹,并新建hello.cMakefile文件

mkdir ~/Desktop/hello
cd ~/Desktop/hello
touch hello.c Makefile

1. Linux C文件

~/Desktop/hello文件夹下,使用gedit hello.c打开文件后,键入以下代码:

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void)
{printk(KERN_ALERT "Hello, world\n"); //注意此处没有逗号分隔return 0;
}static void hello_exit(void)
{printk(KERN_ALERT "Goodbye, cruel world\n");//注意此处没有逗号分隔
}module_init(hello_init);
module_exit(hello_exit);

2. Makefile文件

~/Desktop/hello文件夹下,使用gedit Makefile打开文件后,键入以下代码:

ifneq ($(KERNELRELEASE),) #注意此行开头顶格, ifneq和括号之间有一个空格obj-m:=hello.o #注意此行开头为一个空格
else #注意此行开头顶格KERNELDIR:=/lib/modules/$(shell uname -r)/build #注意此行开头为一个空格PWD:=$(shell pwd) #注意此行开头为一个空格
default: #注意此行开头顶格$(MAKE) -C $(kerneldir) M=$(PWD) modules #注意此行开头为Tab,Tab不能用空格替代!
endif #注意此行开头顶格

3. 驱动编译、加载及卸载

~/Desktop/hello文件夹下,使用以下代码编译驱动:

sudo make # in ~/Desktop/hello

使用以下代码加载驱动:

sudo insmod hello.ko # 加载hello.ko驱动

使用以下代码卸载驱动:

sudo rmmod hello #卸载hello驱动

使用以下代码查看驱动返回值:

dmesg |tail -5 #查看日志最后5行代码

总的测试过程如下:

#汇总过程为
sudo insmod hello.ko
sudo rmmod hello
dmesg |tail -5
#如无其他事件发生,在接连加载、卸载驱动hello.ko后,
#会在最后两行获取到返回值
#加载返回值:[<cpu_time>] hello: hello, world
#卸载返回值:[<cpu_time>] hello: Goodbye, cruel world

五、参考链接

感谢以下文章,不过单一的一篇文章并不能很好的兼容现有的安装,总会出现缺这缺那的情况,所以参考了许多的文章,主要链接写在下面:

  1. Linux源码树结构;
  2. 修改密码教程及获取root权限;
  3. vmware扩容教程1、vmware扩容教程2;

其中有有用的链接也列举如下。

  1. 相关链接1,BUG解决相关链接。
  2. 特别好的链接

其中还有一些解决bug的链接因为没有存储,所以这里也就没有给出,如果遇到相关的问题可以自行搜索~~~

六、写在最后的话【应该没有彩蛋】

确实建立这个环境挺折腾人的,比如说,学习第一个例程Helloworld的时候就直接N填编译失败而不知错在哪里,那种感觉真的是很崩溃,虽然这应该是一种技术摸索的常态,虽然经常碰见但仍会引起不适。

为了方便查阅,也是为了分享给米娜桑一点经验吧,少走弯路,避免进入上手即放手、入门即放弃的怪圈,要知道有时候技术自嗨起来[捂脸]还是很开心的~欢迎大家入技术之大坑。

彩蛋?

暂无

[LINUX]LINUX驱动开发最简环境搭建(适用于新手)相关推荐

  1. linux设备驱动开发之环境搭建(基于exynos4412)

    第一章 linux设备驱动开发之环境搭建(基于exynos4412) 目录 第一章 linux设备驱动开发之环境搭建(基于exynos4412) 1.搭建开发板运行环境 1.1.交叉开发模式 安装交叉 ...

  2. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  3. Linux设备驱动开发基础

    1.驱动概述和开发环境搭建 1.1驱动设备的作用 对设备驱动最通俗的解释就是"驱动硬件设备行动".驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的 ...

  4. 正点原子linux驱动教程,正点原子 手把手教你学Linux之驱动开发篇

    简 介 该课程是正点原子手把手教你学Linux系列课程,该课程配套开发板为正点原子alpha/mini Linux开发板. 手把手教你学Linux之驱动开发篇: 第1讲 Linux驱动开发与裸机开发区 ...

  5. Linux字符驱动开发学习总结

    linux驱动编写(虚拟字符设备编写) 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关方面的内容,并且用一个实例来说明在linux上面设备是如何编写的. ...

  6. linux设备驱动开发专业论坛www.linuxdriver.cn诚征斑竹

    www.linuxdriver.cn诚征斑竹,一起繁荣Linux设备驱动开发专业论坛的人气,共同致力于提高中国工程师的Linux设备驱动开发水平,普及Linux设备驱动开发知识.[url]www.li ...

  7. 《Linux设备驱动开发详解》学习笔记一

    Linux设备驱动开发详解学习笔记<一> 书名:<Linux设备驱动开发详解>第二版 主机环境:Linux version 2.6.25-14.fc9.i686@Fedora ...

  8. linux 设备驱动 ppt,linux设备驱动开发详解讲座ppt

    PPT内容 这是linux设备驱动开发详解讲座ppt下载,主要介绍了设备驱动简介:建立和运行模块:字符驱动:调试技术:并发和竞争:分配内存:硬件通讯:中断处理:块设备驱动,欢迎点击下载. 嵌入式Lin ...

  9. 《Linux设备驱动开发详解(第2版)》隆重出版

    Linux设备驱动开发详解(第2版)(前一版狂销3万册,畅销书最新升级) [新品] 点击看大图     基本信息 * 作者: 宋宝华       * 出版社:人民邮电出版社     * ISBN:97 ...

最新文章

  1. docker portainer_Docker入门详解(十一) 图形Portainer
  2. oracle高级查询用法
  3. Linux Shell脚本入门--wc命令
  4. opencv converTO()函数 转换图像的数据类型不改变通道数,注意与cvtColor()改变颜色空间/彩色空间/色彩空间函数区分
  5. python加颜色_python如何给指定的词语加上颜色,并写入Excel文档?
  6. Python-100 练习题 02
  7. CSS魔法堂:hasLayout原来是这样!
  8. java实现二叉树遍历
  9. 卡巴斯基一年版 送序列号
  10. 知识图谱在教育行业的应用
  11. PyG搭建GCN实现节点分类(GCNConv参数详解)
  12. 编译小程序,开发者工具打开报错Cannot read property ‘createTextNode‘ of undefined或iphone机型无法预览
  13. AipOcr百度文字识别API Key和Secret Key申请及应用例子说明
  14. 男生晚上做什么兼职好?有什么好兼职推荐吗?
  15. 14-[LVI-SAM]visual_odometry_callbackAndprocess
  16. Android+Java Web+MySQL实现登录注册
  17. 0x80073712(0x80073712解决方法)
  18. 插值多项式的龙格现象的介绍与模拟
  19. 使用系统打印服务器配置,打印服务器配置教程.pdf
  20. java 客户端上传_java实现上传文件到服务器和客户端

热门文章

  1. 【深度学习】-Imdb数据集情感分析之模型对比(2)- LSTM
  2. 出现报错:UnpicklingError: invalid load key, ‘-‘.
  3. 【无人车路径规划】Frenet下的无人车路径规划(Python代码实现)
  4. docker部署SolrCloud集群
  5. percona-toolkit工具使用介绍
  6. 压缩Html HtmlCompressor
  7. 游侠原创:轻松加强电子邮件传输安全性
  8. 为什么微信的文件助手不是点对点传输?
  9. ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)
  10. 《滚石》评出最伟大100首英文歌