运行ldd2示例的一点体会
时间:2006-05-06 来源:lanttor.guo
注: 我使用的是redhat 9操作系统,内核版本是linux-2.4.20-8. 运行LDD2(linux设备驱动程序设计第2版)的示例.一点体会,仅供linux驱动学习者参考.
首先确定你的linux系统安装了内核源码树,在/usr/src下可以查看.
其次,安装好源码树后,在/usr/src下建立一个符号链接: ln -s /usr/src/linux-2.4.20-8 linux, 这个符号链接在驱动例子中用到.
下载驱动例子ldd2-samples-1.0.1.tar.gz后,用tar xvzf解开.
运行make命令,发现错误提示:
make[1]: Entering directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-progs'
cc -O2 -fomit-frame-pointer -Wall -I/usr/include asynctest.c -o asynctest
cc -O2 -fomit-frame-pointer -Wall -I/usr/include nbtest.c -o nbtest
cc -O2 -fomit-frame-pointer -Wall -I/usr/include setconsole.c -o setconsole
cc -O2 -fomit-frame-pointer -Wall -I/usr/include setlevel.c -o setlevel
/tmp/ccSX988D.o(.text+0x1c): In function `syslog':
: undefined reference to `errno'
/tmp/ccSX988D.o(.text+0x89): In function `main':
: undefined reference to `errno'
collect2: ld returned 1 exit status
make[1]: *** [setlevel] Error 1
make[1]: Leaving directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-progs'
查看misc-progs/setlevel.c, 在其中加入头文件#include <errno.h>.
继续运行make命令,发现错误提示:
make[1]: Entering directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-modules'
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o faulty.o faulty.c
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o sleepy.o sleepy.c
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o silly.o silly.c
In file included from silly.c:38:
/usr/src/linux/include/linux/malloc.h:4:2: #error linux/malloc.h is deprecated, use linux/slab.h instead.
make[1]: *** [silly.o] Error 1
查看/usr/src/linux/include/linux/malloc.h, 将其中的这条程序语句#error linux/malloc.h is deprecated, use linux/slab.h instead. 注释掉.
继续运行make命令,发现错误提示:
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o simple.o simple.c
simple.c: In function `simple_remap_mmap':
simple.c:134: warning: passing arg 1 of `remap_page_range_R2baf18f2' makes pointer from integer without a cast
simple.c:134: incompatible type for argument 4 of `remap_page_range_R2baf18f2'
simple.c:134: too few arguments to function `remap_page_range_R2baf18f2'
make[1]: *** [simple.o] Error 1
make[1]: Leaving directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/simple'
make: *** [subdirs] Error 1
查看simple/simple.c,将这条程序语句 if (remap_page_range(vma->vm_start, offset, vma->vm_end-vma->vm_start,
vma->vm_page_prot))
更改为
if (remap_page_range(vma,vma->vm_start, offset, vma->vm_end- vma->vm_start, vma->vm_page_prot))
原因是在linux内核2.4.21中内核函数remap_page_range()的声明发生了变化,该函数在/linux/mm/memory.c中声明,原型如下:
int remap_page_range(struct vm_area_struct *vma, unsigned long from,
unsigned long phys_addr, unsigned long size, pgprot_t prot),可以看到参数的数量多了一个vma。
继续运行make命令, 所有例子程序编译通过. 我们可以阅读其代码, 运行示例了.
首先确定你的linux系统安装了内核源码树,在/usr/src下可以查看.
其次,安装好源码树后,在/usr/src下建立一个符号链接: ln -s /usr/src/linux-2.4.20-8 linux, 这个符号链接在驱动例子中用到.
下载驱动例子ldd2-samples-1.0.1.tar.gz后,用tar xvzf解开.
运行make命令,发现错误提示:
make[1]: Entering directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-progs'
cc -O2 -fomit-frame-pointer -Wall -I/usr/include asynctest.c -o asynctest
cc -O2 -fomit-frame-pointer -Wall -I/usr/include nbtest.c -o nbtest
cc -O2 -fomit-frame-pointer -Wall -I/usr/include setconsole.c -o setconsole
cc -O2 -fomit-frame-pointer -Wall -I/usr/include setlevel.c -o setlevel
/tmp/ccSX988D.o(.text+0x1c): In function `syslog':
: undefined reference to `errno'
/tmp/ccSX988D.o(.text+0x89): In function `main':
: undefined reference to `errno'
collect2: ld returned 1 exit status
make[1]: *** [setlevel] Error 1
make[1]: Leaving directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-progs'
查看misc-progs/setlevel.c, 在其中加入头文件#include <errno.h>.
继续运行make命令,发现错误提示:
make[1]: Entering directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/misc-modules'
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o faulty.o faulty.c
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o sleepy.o sleepy.c
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o silly.o silly.c
In file included from silly.c:38:
/usr/src/linux/include/linux/malloc.h:4:2: #error linux/malloc.h is deprecated, use linux/slab.h instead.
make[1]: *** [silly.o] Error 1
查看/usr/src/linux/include/linux/malloc.h, 将其中的这条程序语句#error linux/malloc.h is deprecated, use linux/slab.h instead. 注释掉.
继续运行make命令,发现错误提示:
gcc -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux/include -D__SMP__ -DSMP -DMODVERSIONS -include /usr/src/linux/include/linux/modversions.h -O2 -I.. -c -o simple.o simple.c
simple.c: In function `simple_remap_mmap':
simple.c:134: warning: passing arg 1 of `remap_page_range_R2baf18f2' makes pointer from integer without a cast
simple.c:134: incompatible type for argument 4 of `remap_page_range_R2baf18f2'
simple.c:134: too few arguments to function `remap_page_range_R2baf18f2'
make[1]: *** [simple.o] Error 1
make[1]: Leaving directory `/home/guotaotao/ldd2/ldd2-samples-1.0.1/simple'
make: *** [subdirs] Error 1
查看simple/simple.c,将这条程序语句 if (remap_page_range(vma->vm_start, offset, vma->vm_end-vma->vm_start,
vma->vm_page_prot))
更改为
if (remap_page_range(vma,vma->vm_start, offset, vma->vm_end- vma->vm_start, vma->vm_page_prot))
原因是在linux内核2.4.21中内核函数remap_page_range()的声明发生了变化,该函数在/linux/mm/memory.c中声明,原型如下:
int remap_page_range(struct vm_area_struct *vma, unsigned long from,
unsigned long phys_addr, unsigned long size, pgprot_t prot),可以看到参数的数量多了一个vma。
继续运行make命令, 所有例子程序编译通过. 我们可以阅读其代码, 运行示例了.
相关阅读 更多 +