linux驱动开发之内核树配置

在看<Linux Device Driver Third Edition>的时候,作者其中提到Setting Up Your Test System。他只是指出为2.6.X编写模块,首先,要求你在Linux系统上构建和配置内核树,对于2.6版本的内核来说,已有的头文件已经足够了,但是2.6的模块链接着内核源码树中的对象文件。这样模块加载器将更健壮,但是也要求这些对象文件存在。所以驱动开发的第一件事情就是构建内核源码树。

他没有提到如何构建,我从网上找了一些资料,构建了自己的内核树,写出来大家分享一下。
本人使用的是Debian 8, 如果是虚拟机的话,内存最好要大于15G,不然可能不够用。
首先查看自己的linux内核的版本,在终端中输入: uname -r(也可以使用uname -a 来查看更具体的信息)

然后进入 usr/src/下查看是否有linux-source 文件,一般是没有的,至少我的Debian 8没有
没有就去网上查找,在终端中输入: apt-cache search linux-source
可以看到结果:
linux-source-3.16 - Linux kernel source for version 3.16 with Debian patches
linux-source - Linux kernel source (meta-package)

选择同自己内核相应的linux-source版本安装。具体的安装方法为,在终端中输入:
sudo apt-get install linux-source-3.16
下载完毕后在/usr/src/下有个名为linux-source-3.16 的文件夹,在该文件夹里面有linux-source-3.16.tar.xz,解压到/usr/src/linux-source-3.16/目录下。
xzdlinuxsource3.16.tar.xz tar jxvf linux-source-3.16.tar
解压得到文件源代码文件,该源代码文件夹名称为linux-source-3.16,进入该目录,注意此时在终端中应该是这样的:
lightmouse@lightmouse:/usr/src/linux-source-3.16$
因为解压出来的源代码文件夹位于linux-source-3.16下,所以有两层。
开始配置内核,选择最快的原版的配置(默认)方式:在终端中输入:make oldconfig

然后编译模块,定位到源代码文件夹下,在终端中输入: make modules
等待将近1个小时,该编译完成。完成之后,安装模块,在终端中输入:make modules_install
至此,源码树构建完成,重启系统,
将《Linux Device Driver Third Edition》中的第一个例子运行下吧。

文中代码:helloworld.c

[cpp] view plaincopy

#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文件内容:

[cpp] view plaincopy

obj-m := helloworld.o #必须与helloworld.c文件名称相同。  
KERNELDIR := /lib/modules/linux/build  
PWD := $(shell pwd)  
modules:  
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
modules_install:  
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install   

编译,在终端中输入:make

[cpp] view plaincopy

jk1860@jk1860-machine:~/DriverLinux$ make  
make -C /lib/modules/linux/build M=/home/jk1860/DriverLinux modules  
make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.35-22-generic'  
  Building modules, stage 2.  
  MODPOST 1 modules  
make[1]:正在离开目录 `/usr/src/linux-headers-2.6.35-22-generic'  

然后加载模块 (root用户)

root@jk1860-machine:/home/shana/Driver# insmod ./helloworld.ko

按照书上的例子 会在终端显示 hello , world 但是运行后什么都没有出现 (原因不解)

root@jk1860-machine:/home/shana/Driver# insmod ./helloworld.ko

查看加载模块

root@jk1860-machine:/home/shana/Driver# lsmod
Module Size Used by
helloworld 2560 0

删除模块

root@jk1860-machine:/home/shana/Driver# rmmod helloworld

书中说明,如果不出现在终端,则会写进 syslog 文件中

root@jk1860-machine:~# cat /var/log/syslog |grep world
Jan 20 10:21:23 jk1860-machine kernel: [ 1683.984471] hello world
Jan 20 10:22:35 jk1860-machine kernel: [ 1755.752461] Goodbye, cruel world

驱动开发环境搭建完成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值