最全最详细:ubuntu16.04下内核编译以及设备驱动程序的编写(针对新手而写)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:https://www.cnblogs.com/acm-icpcer/p/8029656.html
最近学院里的nfc老师要我们做个设备驱动,之前从没接手过这个东西,加上老师给的材料错误也是一大堆,搞了差不多一个星期才搞出来。特此写一个博客,以免后来人和我一样跳坑。
总体考虑
要去写设备驱动程序,说白了就三大步骤:下载内核源码构建内核源码树(也就是下载你的目的内核源码包并解压就行了)、编译内核(这样才能让操作系统感知自己写的驱动程序)、写代码(编写内核程序并编译测试)。这三步哪一步都很艰难。
我是在自己笔记本上用虚拟机VMware装的ubuntu操作系统,相比于装双系统有一大缺点和一大优点,优点是将编译好的新内核装入操作系统时不用担心系统崩溃,缺点是装虚拟机的时候没考虑周全,搞得虚拟机的硬盘太小了,估计容量不够用。
那么综合考虑之后,对于我来说是四大步骤:1、给虚拟机扩容;2、下载内核源码构建内核源码树;3、编译内核;4、写代码。
下面来一一介绍:
1、虚拟机扩容
(1)虚拟机逻辑扩盘。仅仅在这一步扩盘是完全不够的!还要在虚拟机内部设置挂载,不然的话虚拟机无法感知到你扩展的硬盘。这相当于你给一台实际的台式电脑加了一块新硬盘后,还要在操作系统内进行设置。我在这里是扩成80GB。
(2)在终端使用命令
sudo apt-get install Gparted
下载Gparted部件。
(3)打开Gparted:
(4)打开Gparted应用,你可以看到已分配分区状况和新增未分配的分区 :
(5)然后依次删除/dev/sda5和/dev/sda2,删除后,就会剩下/dev/sda1(14GB)和未分配的(15GB),不然的话你怎么都无法将unallocated部分挂载。
(6)接下来重新调整/dev/sda1的大小,我这里调整为75529MiB(73.76GB),然后剩下6.24GB作为linux_swap,重新将未分配的6.24GB格式化,先new出一个extended的分区,然后再在这个extended的分区里new一个逻辑分区,并且file system选择为linux-swap,最后选择绿色的钩钩,完成保存。最后执行完后,如下图所示:
(7)这样我就把虚拟机的硬盘扩成了80GB,编译内核源码绝对是绰绰有余的了。
(注:本小节参考了博客:http://blog.csdn.net/Timsley/article/details/50742755)
2、构建内核源码树
(1)我的虚拟机的操作系统是ubuntu16.04。我是在这里下载的源码包:https://www.kernel.org/pub/linux/kernel/v4.x/,我下载的源码包是linux-4.10.14.tar.xz
附:大家千万不要在非www.kernel.org开头的网站上随意下载内核源码!
(2)下载完之后解压即可:
3、编译内核
(1)安装基本的工具软件。
逐次在终端执行以下四条命令:
sudo apt-get install libncurses5-dev libssl-dev sudo apt-get install build-essential openssl sudo apt-get install zlibc minizip sudo apt-get install libidn11-dev libidn11
(2)在终端进入你的解压的内核源码的目录,比如我内核源码解压后在home/expr/expr4/linux-4.10.14,那么进入终端后就是:
(3)依次执行以下三条命令:
sudo make mrproper sudo make clean sudo make menuconfig
其中mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在menuconfig中出现选择的图形化界面后,直接按右方向键选择到exit退出,退出提示中选择保存,实现内核的默认配置。
(4)执行命令:
sudo make –j8
因为我的笔记本cpu是i7四核八线程,所以我直接用8个线程并行编译,这样编译速度就是普通的make命令的8倍。最近双一流建设学校发了财换了一大批新电脑,所以在我学校的高性能计算实验室编译内核,因为处理器是新买的intel core i7 6700k,8线程编译的话20分钟就搞定了,普通笔记本应该要1~2小时。
下面放一波编译的时候截的图:
正在编译内核
编译的时候监测笔记本状态,怕内存泄漏
(5)依次执行命令:
sudo make modules_install //安装内核模块 sudo make install //安装内核
下面放一波编译的时候截的图:
正在执行sudo make modules_install
正在执行sudo make modules_install
正在执行sudo make install
新内核成功嵌入操作系统
(6)重新启动系统,如果是虚拟机的话记得重启进入BIOS界面之前一定要点击鼠标进入虚拟机的界面实现键盘捕获。在重启开机界面按住shift键不放手,选择高级选项,进入内核选择加载界面,选择自己编译的内核的正常模式:
进入内核选择模式,选择自己编译的内核:
(7)至此,工作完成了50%。随着操作系统的启动,我新编译的内核也正式诞生了!
(注:本小节参考了博客:http://blog.csdn.net/Xiaobai__Lee/article/details/72048829)
4、写自己的设备驱动程序
(1)写在前面:
在编程的时候,不要轻易复制任何网站的代码,99.99%都是跑不通的。Makefile文件尤其不要随便在网上下载,因为这个东西对格式要求非常高,新手随便在网上下的Makefile文件也是99.99%都是跑不通。要跑通,有两个关键:1、认真分析每一条源代码;2、有问题,多去搜一下看看。
(2)我在ubuntu下编写的代码如下:
(3)要在内核态下编译我们写好的设备驱动程序源码,必须使用Makefile文件。
Makefile文件内容截图,每个关键字都出现彩色的时候说明基本上没写错
(4)在终端下进入设备驱动程序源码所在的文件夹,例如,我的源码放在home/expr/expr4/expr4/code/,那么就是这样:
(5)输入make命令,之后在文件夹下直接生成.ko文件:
(6)继续在终端下输入命令:sudo insmod globalmem.ko将刚刚生成的globalmem.ko文件加载进入内核。
(7)用命令lsmod查看是否加载成功,如果成功就是这样:
可以看到第一个module就是我刚刚生成的globalmem。
(8)到这里工作完成了85%。可以先不急着去写测试程序,可以先用原语测试一下驱动,因为我的这个驱动是处理字符的驱动程序,所以我是这样测试的:
也就是进入root模式后用原语将字符串“tz”送入驱动,驱动就会输出“tz”。
(9)现在就可以踏踏实实地去写测试程序了:
(10)编译这个C程序,并运行:
测试程序运行正常,表明设备驱动运行正常。
至此,我的教程就结束了。有疑问的朋友可以直接在评论区留言,非常希望和各位朋友一起讨论!
TZ@华中农业大学信息学院高性能计算实验室
2017/12/12夜
最全最详细:ubuntu16.04下内核编译以及设备驱动程序的编写(针对新手而写)的更多相关文章
- 最全最详细:ubuntu16.04下linux内核编译以及设备驱动程序的编写(针对新手而写)
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译
笔者最近在学习周志明老师编写的<深入理解Java虚拟机>一书,书中第一章的实战部分就是"自己编译JDK",不过书中提到的是OpenJDK 7的编译.由于现在Java开发 ...
- Caffe学习系列(一)Ubuntu16.04下搭建编译Caffe环境,并运行MNIST示例(仅CPU)
前言: 正文: 1.安装必要依赖包: sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev l ...
- ubuntu16.04让内核编译一次过的方法
问题: 进入内核后,发现make menuconfig 出错,而且在在网上找到的一些安装包,安装结束后,发现make menuconfig后的图形界面虽然出来了,但是图形界面里的内容没有出来! 解决方 ...
- Ubuntu16.04下caffe CPU版的详细安装步骤
一.caffe简介 Caffe,是一个兼具表达性.速度和思维模块化的深度学习框架. 由伯克利人工智能研究小组和伯克利视觉和学习中心开发. 虽然其内核是用C++编写的,但Caffe有Python和Mat ...
- Ubuntu16.04下部署 nginx+uwsgi+django1.9.7(虚拟环境pyenv+virtualenv)
由于用的新版本系统,和旧的稍有差别,在网上搜了很多相关资料,搞了三天终于搞好在Ubuntu16.04下的部署,接下来就详细写写步骤以及其中遇到的问题.前提是安装有虚拟环境pyenv+virtualen ...
- ubuntu16.04降级内核版本至3.13.0-85
1.前言 采用ubuntu16.04在编译实验课程的实例代码simplefs 时,发现编译时报如下错误: 因此需要将ubuntu16.04的内核版本降级为 3.13.0-85-generic 2.修改 ...
- Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件)
Ubuntu16.04下编译OpenCV2.4.13静态库(.a文件) https://blog.csdn.net/woainishifu/article/details/79712110 我们在做项 ...
- Ubuntu16.04下搜狗输入法、Sublime Text 3的安装
Ubuntu16.04下搜狗输入法.Sublime Text 3的安装 一.搜狗输入法 1. 安装中文语言 默认在Ubuntu16.04下是没有中文的,需要安装中文,在System Settings- ...
随机推荐
- 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路
前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...
- Docker 如何支持多种日志方案?- 每天5分钟玩转 Docker 容器技术(88)
将容器日志发送到 STDOUT 和 STDERR 是 Docker 的默认日志行为.实际上,Docker 提供了多种日志机制帮助用户从运行的容器中提取日志信息.这些机制被称作 logging driv ...
- 微信小程序之给项目设置id后提示不在合法域名列别中
hotapp 有免费的https proxy ,可以免费代理请求任何http或者https服务,只要设置好合法域名为https://wxapi.hotapp.cn, 就可以请求网址如请求小程序联盟的例 ...
- TiDB 作为 MySQL Slave 实现实时数据同步
由于 TiDB 本身兼容绝大多数的 MySQL 语法,所以对于绝大多数业务来说,最安全的切换数据库方式就是将 TiDB 作为现有数据库的从库接在主 MySQL 库的后方,这样对业务方实现完全没有侵入性 ...
- java 操作hbase1.2
说明: .第一部分为代码 .第二部分为工程pom文件 [java] view plain copy import org.apache.hadoop.conf.Configuration; impor ...
- Hdu 1698(线段树 区间修改 区间查询)
In the game of DotA, Pudge's meat hook is actually the most horrible thing for most of the heroes. T ...
- HDU1754 I hate it(线段树 单点修改)
好久没打线段树,来一道练练手,但说句实话,I really hate it!!!! 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管 ...
- Node.js Web 模块
什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL,与客 ...
- css之定位(position)
1.什么是定位: css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设置一些不规则 ...
- HTML资源定位器-URL
URL 也被称为网址. URL 可以由单词组成,比如 "www.baidu.com",或者是因特网协议(IP)地址:192.168.1.253. URL - Uniform Res ...