一、Linux源码树结构
二、获取源码包的形式1、为什么要活取源码包?
在笔者到官网下载源码时,源码下边有如下说明:
Ifyouaresimplytryingtobuildthird-partymodulesforyourkernel,youdonotwantthispackage.Installtheappropriatelinux-headerspackageinstead.意思是,假如你只是想为内核编译第三方的模块,这么,你不需下载此源码包。安装内核头文件包或
许会更适宜你。
假如你的ubuntu是保持更新的(例如您常常执行sudoapt-getupdate和dist-upgrade),
这么您的系统是安装有内核头文件包的,不信您到/usr/src目录下查看,是不是有linux-headers-[版本号]-generic的文件夹呢,呵呵。我如今可以说,你可以在此开发你的驱动程序了。
然而为何我们还要活取源码呢?
后面早已提及假如你只是想为内核编译第三方的模块,这么,你不需下载此源码包。安装内核头文件包其实会更适宜你。
而且好多时侯我们做嵌入式开发或则驱动开发,一个基本的Linux设备驱动开发环境由宿主机和目标机组成,宿主机就是拿来做驱动开发工作的主机,目标机就是拿来运行和测试设备驱动的主机,在宿主机上须要有开发工具(gcc,gdb,make等)和linux源码(版本要对应目标机上的linux内核),而目标机上只要运行linux即可。因为步骤有所不同,下边分为普通Linux设备驱动开发和嵌入式Linux设备驱动开发两种情况来述说环境的搭建和驱动程序的编译:
【文章福利】小编推荐自己的整理一些个人认为比较好的学习书籍、录播视频,有须要的可以自己加陌陌(VX):laowu1008688(免费发放,备注:v888第一时间通过)。
小编整理好【Linux内核源码剖析】学习路线图,推荐给你们参考(主要是帮助在职嵌入开发者、驱动应用开发者、服务器前端开发者等,想把握系统底层原理的在职工程师),具体如下:
一:【进程管理模块源码剖析】
二:【内存管理模块源码剖析】
三:【设备驱动模块基础剖析】
四:【文件系统模块源码剖析】
五:【网络合同栈模块源码剖析】
六:【中断管理模块源码剖析】
2、普通Linux设备驱动开发
普通Linux主要是区别于于嵌入式Linux(通常指uClinux),在这些开发中宿主机和目标机可以是一台主机,
即在本机上开发编译之后在本机上加载运行(Linux设备驱动也可以直接编译进内核,但为了开发工作便捷,通常采用动态加载的方法),
其实也可以是两台主机,
若果是两台主机的话,要保证宿主机上的linux源码的版本号与目标机中的linux内核版本一致。
普通Linux设备驱动开发的步骤如下:
①在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本一致)。开发工具主要有gcc、gdb、make等,
②编写Linux驱动程序
是须要更改内核源代码的。这么这就须要我们在本地主机上安装一份源码,在编译成库后,在进行驱动开发。
③编写Makefile文件
④编译出驱动文件
⑤加载并测试以及卸载:加载使用insmod或modprobe命令来实现,使用rmmod命令卸载驱动模块
3、嵌入式Linux设备驱动开发
这些开发中通常目标机为带有嵌入式处理器的开发板,而宿主机为PC,开发环境须要在宿主机上搭建,嵌入式Linux设备驱动开发的步骤如下:
①在宿主机上下载嵌入式Linux的源码,并安装嵌入式Linux开发工具(针对于不同的嵌入式处理器,工具也有所不同linux 驱动 开发,如对应于Arm的arm-gcc系列,针对nios2处理器的nios2-cc系列)
②编写Linux设备驱动驱动程序,将该文件复制到(linux源码目录)/drivers/(目标文件夹)/中
③配置以及更改内核源码的信息以及makefile文件,在此步配置中可以选择将我们编撰的驱动编译进内核还是不选择编译,而且不能选择编译成模块
④配置而且编译内核
⑤将内核烧录在开发版上进行测试:将生成的zImage文件下载到开发板,开发板上的嵌入式Linux启动后可以用insmod或modprobe加载驱动模块,测试完毕后可以通过rmmod命令卸载驱动模块
三、总结
因而在开发驱动的时侯假如你只是想为内核编译第三方的模块,这么,你不需下载此源码包。安装内核头文件包其实会更适宜我们,而且多数情况下,我们可能时须要更改内核源代码信息的,这就须要我们在宿主机维护一份与目标机上相同的内核信息,否则我们如何保证我们编撰的驱动可以在目标机器上运行呢。
源码包活取的方式
linux源码可以通过以下几种途径获得:
①直接去下载
/pub/linux/kernel/
②通过包管理工具下载源码,在debian和Ubuntu中可以通过下边这个命令下载,apt-getinstalllinux-source-(版本号),下载后的文件在/usr/src目录中,解压到该目录即可
获取源码包
注意:
倘若您只是为了简单的学习下驱动的开发,而不期望深层次的探究Linux内核的机制,这么您完全可以跳过此步骤,单使用头文件您是完全可以进行简单的第三方驱动开发的。
直接从内核官网上下载
使用发行版自带的源码包
Ubunto14.04
安装编译内核所须要的软件build-essential、autoconf、automake、cvs、subversion
sudoapt-getinstallbuild-essentialkernel-packagelibncurses5-dev
注意:libncurses5这个软件包在使用menuconfig配置内核的时侯会用到。
ls一下/usr/src首先看下我们的系统中有没有源码包,仅仅有内核头文件包
步入/usr/src,在这儿建立源码树,我们用下边指令查看可用的源码包
sudo apt-cache search linux-source
可以看见得到如下信息
linux-source-LinuxkernelsourcewithUbuntupatches
linux-source-3.13.0-Linuxkernelsourceforversion3.13.0withUbuntupatches2
这么就让我们来下载3.13.0版的kernel,通过使用命令下载内核
sudoapt-getinstalllinux-source-3.13.01
下载完成后,会手动的储存在/usr/src下,在/usr/src/下ls以下
解压缩源码包
sudotarjxvflinux-source-3.13.0.tar.bz2
这样我们就早已获取到了一份完整的源码包,
四、CentOS建立源码树1、获取内核头文件
打造的之前,最好先
yumupdate
把内核升级到最新版本。至于具体安装哪一份源码树嵌入式linux 培训,要看你用的哪一种内核,用uname-a可以看见。
先检测瞧瞧有什么源码包
yumlist|grepkernel1
假如用的普通内核,就
yuminstallkernel-headerskernel-devel
假如用的PAE内核,就
yuminstallkernel-headerskernel-PAE-devel
假如用的xen内核,就
yuminstallkernel-headerskernel-xen-devel
2、centos安装内核源代码
然而里面的方法只会为我们安装内核的头文件目录以及库信息,假如我们期望获取到源码须要下边的操作
参照
INeedtoBuildaCustomKernel
INeedtheKernelSource
下边我们的方法是使用建立本地组内搭建内部yum源的形式安装linux内核的源码包
1.安装rpmbuild
rpmbuild是拿来制做rpm包的工具
yuminstallrpm-buildredhat-rpm-configunifdef
3、下载源码包
wget/5.11/os/SRPMS/kernel-2.6.18-398.el5.src.rpm
4、安装内核源码
rpm -ivh kernel-2.6.18-274.el5.src.rpm
这样我们的源码就早已下载好了,在/usr/src/redhat目录下有我们须要的所有东西。
并且到如今我们只是安装了环境目录,以及源码的压缩包,而且并没有安装
我们可以看见我们早已有了源码的压缩包,而且并没有解压缩,因而我们下边执行的操作虽然就是用工具对其进行解压缩。
5、安装源码包
cd/usr/src/redhat/SPECS
rpmbuild-bp--target=`uname-m`kernel.spec2>prep-err.log|teeprep-out.log2
以上步骤完成之后,查看prep-err.log错误日志,
若果没有错误,则成功解出的内核源码位置在/usr/src/redhat/BUILD目录下
6、编译内核
按原先的kernel配置,配置kernel.
sudomakeoldconfig
make(相当历时),开始编译内核
sudomake
编译内核镜像
sudomakebzImage
安装内核模块
makemodules_install
执行结束以后,会在/lib/modules下生成新的目录/lib/modules/3.13.0-48-generic/,下边的build文件就是编译模块的要用到的文件。至此内核编译完成。
卸载无用的内核相关文件
我们为不同的目标机配置不同的内核模块,这样一段时间后,我们的系统中会有多份内核信息,再加上我们的系统因为手动升级,系统里也会安装了好多内核。这样仍然用不到的旧内核或则无用内核有必要清除一下,以节约启动时间和硬碟空间。
之后通过查看本机上所有内核的列表来决定什么须要删掉掉:
运行命令:
dpkg--get-selections|greplinux
比如我本机显示为:
注意:
不要删掉当前使用的版本.旁边的install表示已安装,deinstall表示以前安装过,如今已被删掉(已不占空间).
首先可查看当前用的内核是那个,可通过命令:uname-a来获得信息。
其中带有image的就是内核文件,因而可看出我的机器上共五个内核镜像版本。并且似乎只安装了2个镜像,这个卸载的时侯我们都会发觉,我当前使用的是3.13.0-49,所以决定将其它没用的内核删掉。
删掉内核镜像的命令
删掉的命令为:sudoapt-getremovelinux-image-XXXX
比如我要卸载3.13.0-48的旧内核镜像linux 驱动 开发,这么运行命令
sudoapt-getpurgelinux-image-3.13.0-48-generic
或则
sudoapt-getremovelinux-image-3.13.0-48-generic
我们会发觉linux-image-extra-3.13.0-48-generic也会跟随被卸载,
这时侯我们ls/lib/modules/3.13.0-48-generic/会发觉,安装的内核镜像文件早已没有了
卸载内核头文件
sudo apt-get purge linux-headers-3.13.0-48
或则
sudo apt-get remove linux-headers-3.13.0-48
这条命令会手动把linux-headers-3.13.0-48-generic删掉,倘若未删掉我们同样可以使用命令删掉即可。
最后再度运行命令,查看安装的内核文件,查看是否卸载成功
dpkg --get-selections|grep linux
最后最好刷新一个启动菜单
sudo update-grub