程序员人生 网站导航

构建源码树----Linux内核剖析(三)

栏目:综合技术时间:2015-04-22 07:54:45

获得源码包的方式


为何要活取源码包?


在笔者到官网下载源码时,源码下面有以下说明:

If you are simply trying to build third-party modules for your kernel, you do not want this package. Install the appropriate linux-headers package instead. 意思是,如果你只是想为内核编译第3方的模块,那末,你不需下载此源码包。安装内核头文件包或 许会更合适你。

如果你的ubuntu是保持更新的(比如您常常履行sudo apt-get update和dist-upgrade),
那末您的系统是安装有内核头文件包的,不信您到/usr/src目录下查看,是否是有linux-headers-[版本号]-generic的文件夹呢,呵呵。我现在可以说,你可以在此开发你的驱动程序了。

但是为何我们还要活取源码呢?
前面已提到如果你只是想为内核编译第3方的模块,那末,你不需下载此源码包。安装内核头文件包也许会更合适你。
但是很多时候我们做嵌入式开发或驱动开发,1个基本的Linux装备驱动开发环境由宿主机目标机组成,宿主机就是用来做驱动开发工作的主机,目标机就是用来运行和测试装备驱动的主机,在宿 主机上需要有开发工具(gcc,gdb,make等)和linux源码(版本要对应目标机上的linux内核),而目标机上只要运行linux便可。由于 步骤有所不同,下面分为普通Linux装备驱动开发嵌入式Linux装备驱动开发两种情况来说述环境的搭建和驱动程序的编译:

普通Linux装备驱动开发


普通Linux主要是区分于于嵌入式Linux(1般指uClinux),在这类开发中宿主机和目标机可以是1台主机
即在本机上开发编译然后在本机 上加载运行(Linux装备驱动也能够直接编译进内核,但为了开发工作方便,1般采取动态加载的方式),
固然也能够是两台主机
如果是两台主机的话,要保证宿主机上的linux源码的版本号与目标机中的linux内核版本1致。
普通Linux装备驱动开发的步骤以下:
①在宿主机上安装开发工具和下载linux源码(要求版本号和目标机上的linux内核版本1致)。开发工具主要有gcc、gdb、make等,
②编写Linux驱动程序
是需要修改内核源代码的。那末这就需要我们在本地主机上安装1份源码,在编译成库后,在进行驱动开发。
③编写Makefile文件
④编译出驱动文件
加载并测试和卸载:加载使用insmod或modprobe命令来实现,使用rmmod命令卸载驱动模块

嵌入式Linux装备驱动开发


这类开发中1般目标机为带有嵌入式处理器的开发板,而宿主机为PC,开发环境需要在宿主机上搭建,嵌入式Linux装备驱动开发的步骤以下:
①在宿主机上下载嵌入式Linux的源码,并安装嵌入式Linux开发工具(针对不同的嵌入式处理器,工具也有所不同,如对应于Arm的arm-gcc系列,针对nios2处理器的nios2-cc系列)
②编写Linux装备驱动驱动程序,将该文件复制到(linux 源码目录)/drivers/(目标文件夹)/中
③配置和修改内核源码的信息和makefile文件,在此步配置中可以选择将我们编写的驱动编译进内核还是不选择编译,但是不能选择编译成模块
④配置并且编译内核
⑤将内核烧写在开发版上进行测试:将生成的zImage文件下载到开发板,开发板上的嵌入式Linux启动后可以用insmod或modprobe加载驱动模块,测试终了后可以通过rmmod命令卸载驱动模块

总结


因此在开发驱动的时候如果你只是想为内核编译第3方的模块,那末,你不需下载此源码包。安装内核头文件包也许会更合适我们,但是多数情况下,我们可能时需要修改内核源代码信息的,这就需要我们在宿主机保护1份与目标机上相同的内核信息,否则我们怎样保证我们编写的驱动可以在目标机器上运行呢。。。。

源码包活取的方法


linux源码可以通过以下几种途径取得:
直接去www.kernel.org下载

通过包管理工具下载源码,在debian和Ubuntu中可以通过下面这个命令下载,apt-get install linux-source-(版本号) ,下载后的文件在/usr/src目录中,解压到该目录便可

获得源码包


注意:
如果您只是为了简单的学习下驱动的开发,而不期望深层次的探究Linux内核的机制,那末您完全可以跳过此步骤,单使用头文件您是完全可以进行简单的第3方驱动开发的。

直接从内核官网上下载


使用发行版自带的源码包


Ubunto14.04


安装编译内核所需要的软件build-essential、autoconf、automake、cvs、subversion

sudo apt-get install build-essential kernel-package libncurses5-dev

注意:libncurses5这个软件包在使用menuconfig配置内核的时候会用到。

ls1下/usr/src首先看下我们的系统中有无源码包,仅唯一内核头文件包
这里写图片描述

进入/usr/src ,在这里构建源码树,我们用下面指令查看可用的源码包

sudo apt-cache search linux-source

这里写图片描述
可以看到得到以下信息

linux-source - Linux kernel source with Ubuntu patches linux-source-3.13.0 - Linux kernel source for version 3.13.0 with Ubuntu patches

那末就让我们来下载3.13.0版的kernel,通过使用命令下载内核

sudo apt-get install linux-source-3.13.0

下载完成后,会自动的寄存在/usr/src下,

在/usr/src/下ls以下
这里写图片描述

解紧缩源码包

sudo tar jxvf linux-source-3.13.0.tar.bz2

这样我们就已获得到了1份完全的源码包,

CentOS构建源码树


构建的之前,最好先

yum update

把内核升级到最新版本。至于具体安装哪1份源码树,要看你用的哪种内核,用uname -a可以看到。

先检查看看有哪些源码包

yum list | grep kernel

如果用的普通内核,就

yum install kernel-headers kernel-devel

如果用的PAE内核,就

yum install kernel-headers kernel-PAE-devel

如果用的xen内核,就

yum install kernel-headers kernel-xen-devel

编译内核


按原来的kernel配置,配置kernel.

sudo make oldconfig

make(相当耗时),开始编译内核

sudo make

编译内核镜像

sudo make bzImage

安装内核模块

make modules_install

履行结束以后,会在/lib/modules下生成新的目录/lib/modules/3.13.0⑷8-generic/, 下面的build文件就是编译模块的要用到的文件。至此内核编译完成。
这里写图片描述

卸载无用的内核相干文件

我们为不同的目标机配置不同的内核模块,这样1段时间后,我们的系统中会有多分内核信息,再加上我们的系统由于自动升级,系统里也会安装了很多内核。这样始终用不到的旧内核或无用内核有必要清算1下,以节省启动时间和硬盘空间。

这里写图片描述
然后通过查看本机上所有内核的列表来决定哪些需要删除掉:

运行命令:

dpkg --get-selections|grep linux

例如我本机显示为:
显示所有内核的列表

注意:
不要删除当前使用的版本.后面的install表示已安装,deinstall表示曾安装过,现在已被删除(已不占空间).
首先可查看当前用的内核是哪一个,可通过命令:uname -a 来取得信息。

其中带有image的就是内核文件,因此可看出我的机器上共5个内核镜像版本。但是其实只安装了2个镜像,这个卸载的时候我们就会发现,我当前使用的是3.13.0⑷9,所以决定将其它没用的内核删除。
删除内核镜像的命令

删除的命令为:sudo apt-get remove linux-image-XXXX

例如我要卸载3.13.0⑷8的旧内核镜像,那末运行命令

sudo apt-get purge linux-image-3.13.0-48-generic

sudo apt-get remove linux-image-3.13.0-48-generic

这里写图片描述
我们会发现linux-image-extra⑶.13.0⑷8-generic也会随着被卸载,
这时候候我们ls /lib/modules/3.13.0⑷8-generic/会发现,安装的内核镜像文件已没有了
这里写图片描述

卸载内核头文件

sudo apt-get purge linux-headers-3.13.0-48

sudo apt-get remove linux-headers-3.13.0-48

这里写图片描述
这条命令会自动把linux-headers⑶.13.0⑷8-generic删除,如果未删除我们一样可使用命令删除便可。
最后再次运行命令,查看安装的内核文件,查看是不是卸载成功

dpkg --get-selections|grep linux

这里写图片描述

最后最好刷新1个启动菜单

sudo update-grub
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐