在我开始使用本书之前,我正试图从Linux设备驱动程序,第3版(ldd3)中获取示例,以便我可以使用一组可以使用的工作示例....我是得到以下错误(在Debian挤压和Crunchbang Linux中看到错误):
inp.c:33:20: error: [u]asm/io.h:[/u] No such file or directory
当我查看makefile时,我发现了这个(我认为是问题):
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
INCLUDEDIR = $(KERNELDIR)/include
/ lib / modules / uname -r
/ build的内容是/usr/src/linux-headers-2.6.39-bpo.2-486 /
$ uname -r
2.6.39-bpo.2-486
$ ls /lib/modules/`uname -r`/build
arch include Makefile Module.symvers scripts
$ ls /lib/modules/`uname -r`/build/include
config generated linux
正在查找的目录没有所需的文件。我找到了/usr/src/linux-headers-2.6.39-bpo.2-common/下所需的文件和缺少的asm / io.h文件@ /usr/src/linux-headers-2.6.39-bpo。 2-常见/包括/ ASM-通用/
$ ls /usr/src/linux-headers-2.6.39-bpo.2-common/
arch include Kbuild Makefile scripts
$ ls /usr/src/linux-headers-2.6.39-bpo.2-common/include/
acpi crypto Kbuild linux media net rdma scsi staging trace xen
asm-generic drm keys math-emu mtd pcmcia rxrpc sound target video
我是否必须安装任何软件包才能获取该目录中的文件...我已经安装了linux-headers - uname -r
软件包(在Debian和Crunchbang中)...在gnewsense中我找到了/ lib / modules / $(shell uname -r)/ build ...中的文件...但它是一个较旧的内核...所以不确定linux下的目录结构是否改变...或者它是特定于发行版的...请让我知道如何进行编译......我对Makefile不是很好,所以如何更改makefile以便在其他目录中查找头文件....
谢谢, ASP5
答案 0 :(得分:1)
首先,LDD3已经很老了,如果头文件可能已移动,我也不会感到惊讶。 Javier Martinez Canillas has updated the LDD3 sources for more modern kernels
在进一步研究这个问题时,我发现asm
符号链接已经被打破了一段时间。 (io.h
由于某种原因似乎已存储在asm-generic/
中。)如果您感到好奇,I filed a bug report at Ubuntu表示已损坏的符号链接。
无论值得什么,我都可以构建一个引用<asm/io.h>
或 <asm-generic/io.h>
的模块(尽管Hasturkun提醒我,你不应该使用asm-generic
直接地):
$ cat > Makefile
obj-m = foo.o
$ cat > foo.c
#include <linux/module.h>
#include <linux/sched.h>
#include <asm/io.h>
int init_module() { return 0; }
void cleanup_module() { }
$ make -C /lib/modules/`uname -r`/build M=$PWD
make: Entering directory `/usr/src/linux-headers-2.6.38-12-generic'
LD /home/sarnold/tmp/module/built-in.o
CC [M] /home/sarnold/tmp/module/foo.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/sarnold/tmp/module/foo.mod.o
LD [M] /home/sarnold/tmp/module/foo.ko
make: Leaving directory `/usr/src/linux-headers-2.6.38-12-generic'
$ cat > foo.c
#include <linux/module.h>
#include <linux/sched.h>
#include <asm-generic/io.h>
int init_module() { return 0; }
void cleanup_module() { }
$ make -C /lib/modules/`uname -r`/build M=$PWD
make: Entering directory `/usr/src/linux-headers-2.6.38-12-generic'
CC [M] /home/sarnold/tmp/module/foo.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/sarnold/tmp/module/foo.mod.o
LD [M] /home/sarnold/tmp/module/foo.ko
make: Leaving directory `/usr/src/linux-headers-2.6.38-12-generic'
$