日期:2014-05-16  浏览次数:20723 次

第一个linux驱动代码遇到的问题的解决办法

我使用的linux是 ubuntu 12.04

首先查看自己的内核版本:

e$ uname -r
3.5.0-40-generic

安装内核树

首先查看源上的资源:

e$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-3.2.0 - Linux kernel source for version 3.2.0 with Ubuntu patches
发现只有3.2.0版本的,而我的内核版本是3.5.0的(这里埋伏了一个问题)

由于找不到3.5.0的内核树就先安装这个试试:

sudo apt-get install linux-source-3.2.0 
在/usr/src下会有:
linux-source-3.2.0.tar.bz2
解压这个包出现:
arch           firmware  lib              README          ubuntu
block          fs        MAINTAINERS      REPORTING-BUGS  usr
COPYING        include   Makefile         samples         virt
CREDITS        init      mm               scripts         vmlinux
crypto         ipc       modules.builtin  security        vmlinux.o
Documentation  Kbuild    modules.order    sound
drivers        Kconfig   Module.symvers   System.map
dropped.txt    kernel    net              tools
切换到当前目录下输入:
sudo make./config
出现的[n/m/y/?]的地方全部按enter,以默认方式安装;
完了后输入:
sudo vim ./config
修改
CONFIG_RTS5139=m 为 CONFIG_RTS5139=n  (这是一个不成熟的选项,会给后面带来麻烦,所以就不开启了)
配置好编译环境后输入:
sudo make
这个过程比较久
完了后输入:
sudo make modules
sudo make modules_install
===============================================================================================================

代码是照着书上的:

//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

这样的Makefile 文件执行make后会出现如下错误:

insmod: error inserting './hello.ko': -1 Invalid module format (是由于与内核版本不一致造成的,安装3.2.0是不行的)

应将Makefile文件改为这样(也不是很好(不需要保留的没删除),只是能通过)

        obj-m :=hello.o
        KVER ?= $(shell uname -r)
        KERNELDIR := /lib/modules/$(KVER)/build
        PWD := $(shell pwd)
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

注意:modules:和modules_install所在行前面没有空格,其他行前面必须是tab键,否则会报错。

输入:

make

终端输出:

make -C /lib/modules/3.5.0-40-generic