按照本教程编写我的第一个驱动程序。
Makefile是:
# Makefile – makefile of our first driver
# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
KERNEL_SOURCE := /usr/src/linux 3.8
PWD := $(shell pwd)
default:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
clean:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif
驱动程序代码为:
* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
static int __init ofd_init(void) /* Constructor */
{
printk(KERN_INFO "Namaskar: ofd registered");
return 0;
}
static void __exit ofd_exit(void) /* Destructor */
{
printk(KERN_INFO "Alvida: ofd unregistered");
}
module_init(ofd_init);
module_exit(ofd_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");
在制作过程中没有错误。但是当我使用时,insmod ofd.ko
我无法加载它。在dmesg
上面说:
不同意符号module_layout的版本
uname -r
返回“ 3.8.0-38-generic”,内核源代码也为3.8。modprobe -f ofd.ko
也失败了
也:
#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.4 LTS
Release: 12.04
Codename: precise
怎么了?
一些明显的评论。首先,内核源代码是否与Ubuntu内核完全相同?您应该使用与您的内核完全对应的Ubuntu内核源代码。由于发行版会修补其内核,因此上游可能无法正常工作。其次,afaik可以针对内核头进行编译,不需要内核源代码。标头也应以二进制包的形式提供。您可能还想看看Debian Kernel Handbook,它在Debian上有关于内核等的指导性内容,这也适用于Ubuntu。
—
Faheem Mitha 2014年