日期:2014-05-16 浏览次数:20745 次
我使用的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 modulessudo 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