Linux设备驱动程序ed 3代码编译错误和Linux头文件

时间:2011-12-07 01:03:36

标签: c linux

在我开始使用本书之前,我正试图从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

1 个答案:

答案 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'
$