Linux内核树的搭建及简单的驱动调试

来源:互联网 发布:情感分析算法 python 编辑:程序博客网 时间:2024/06/16 03:43

原由:一个基本的Linux设备驱动开发环境,由宿主机和目标机组成,宿主机就是用来做驱动开发工作的主机,目标机就是用来运行和测试设备驱动的主机,在宿主机上需要有开发工具(gccgdbmake等)和linux源码(版本要对应目标机上的linux内核),而目标机上只要运行linux即可。

搭建交叉编译环境前提:

1. 一台已经安装好linux系统的主机或者是已经安装好虚拟机的主机

2. 网络是否连接完好

3. 确认该linux系统的内核;通过uname a可以查看到所安装的linux内核版本

关键词说明:

主机:安装有linux系统的机器

客户端:使用SecureCRT等终端通过SSH/telent连接的操作界面

交叉编译环境搭建:

主机及客户端操作的步骤是相同的;现在使用的是SSH2连接

1. 连接至主机

 

2. 查看版本号 

cmduname a

3. 从内核网站下载相应版本的内核源码

cmdwget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.7.tar.gz /usr/src

下载完成后,在/usr/src下,文件名为:linux-source-2.6.22.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码:

超级用户模式解压文件于

cmdtar zxvf linux-2.6.32.7.tar.gz

//cmdtar jxvf linux-2.6.32.7.tar.bz2

解压后生成一个新的目录/usr/src/linux-2.6.32,所有的源代码都在该目录下。

4. 进入文件linux-2.6.32.7

cmdcd linux-2.6.32.7

5. 编译内核源码

cmdmake oldconfig

cmdmakemake bzImage

当然,第一个make也可以不执行,直接make bzImage。执行结束后,可以看到在当前目录下生成了一个新的文件: vmlinux, 其属性为-rwxr-xr-x

然后:

#make modules /* 编译 模块 */
#make modules_install /* 安装 模块 */
执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.32.7/。在随后的编译模块文件时,要用到这个路径下的build目录。至此,内核编译完成。可以重启一下系统。

至此 内核树就建立啦。现在就可以进行驱动开发和调试了。

写一个 最简单 最没用的驱动吧
我在 /home/shana/linux_q/ 目录下创建2个文本文件 hello.c Makefile

//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);
程序我就不解释了……

Makefile 文件

obj-m := hello.o
KERNELDIR := /lib/modules/2.6.20/build
PWD := $(shell pwd)

modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install


编写linux驱动,以一个最简单的hello world为例。

1.Hello.c的内容如下:

2.Makefile内容如下:

3.编译

hello.cMakefile所在的目录下执行make即可,编译后可在当前目录下找到一个hello.ko文件

4.加载并测试:

加载使用命令insmod/modprobe来实现,如在当前路径下执行如下命令实现加载:

cmdinsmod ./hello.komodprobe hello

注意:如果在虚拟终端加载内核的话是看看不到内核打印信息,因为内核打印信息不会输出到虚拟终端,而是输出到/proc/kmsg文件中,所以可以通过以下方式查看内核信息: 
cmdcat /proc/kmsg 会一直打印,需要CtrlC手动终止 
cmddmesg 或 dmesg | tail -N N为一数字,表示显示最后N

5.卸载

使用rmmod命令卸载驱动模块。

cmdrmmod hello