您的位置:首页 > 运维架构 > Linux

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

2013-09-13 21:53 483 查看
我使用的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/build M=/Clanguage modules

make[1]: 正在进入目录 `/usr/src/linux-headers-3.5.0-40-generic'  

  CC [M]  /Clanguage/hello.o

  Building modules, stage 2.

  MODPOST 1 modules

  CC      /Clanguage/hello.mod.o

  LD [M]  /Clanguage/hello.ko

make[1]:正在离开目录 `/usr/src/linux-headers-3.5.0-40-generic'

从终端输出可以看出ubuntu 12.04  应该是安装了内核树的。所以分隔线前面的都不要安装了。

加载模块:

insmod ./hello.ko

cat /var/log/syslog

可以在尾部看到 hello world

查看模块输入:lsmod

会看到:

hello                  12449  0

移除模块:

sudo rmmod hello

可以在/var/log/syslog看到sudoGoodbye,cruel world
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 驱动 内核