Ldd3 学习笔记2 — simple

来源:互联网 发布:unity3d 太空舱 编辑:程序博客网 时间:2024/05/16 12:41


        翻ldd3书看得云里雾里的,幸好有源码,可以找到源码,编译一下,自己动手学习ldd3到底讲了些什么知识。找到一份源码后,运行起来再说,不管是白猫还是黑猫,要抓老鼠,你得先得给我跑起来,哈哈!

上一篇给出了ldd3下载地址,下载examples.tar.gz解压有以下子目录

include  Makefile      pci    scullc  scullv      simple  ttylddbus   misc-modules  sbull  sculld  short       skull   usbLICENSE  misc-progs    scull  scullp  shortprint  snull

cd 到simple目录,有以下文件

Makefile  simple.c  simple_load  simple_unload

Makefile,simple_load,simple_unload书中的讲解比较详细,不懂的杜娘或者google,其实有些我也不懂。


1)CFLAGS错误

bory@chong:~/ldd3/test/simple$ makemake -C /lib/modules/2.6.32-37-generic/build M=/home/fang/ldd3/test/simple LDDINCDIR=/home/fang/ldd3/test/simple/../include modulesmake[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-37-generic'scripts/Makefile.build:49: *** CFLAGS was changed in "/home/fang/ldd3/test/simple/Makefile". Fix it to use EXTRA_CFLAGS。 停止。make[1]: *** [_module_/home/fang/ldd3/test/simple] 错误 2make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-37-generic'make: *** [default] 错误 2

因源码是针对linux内核2.6.10以下版本的,bory和您用的版本都高于2.6.10版本。所以在编译源码时会出现很多版本相关的错误。上面的错误的


解决方案:

将Makefile文件中的“CFLAGS”替换成“EXTRA_CFLAGS”

保存继续编译。


2)linux/config.h: 没有那个文件或目录

bory@chong:~/ldd3/test/simple$ makemake -C /lib/modules/2.6.32-37-generic/build M=/home/fang/ldd3/test/simple LDDINCDIR=/home/fang/ldd3/test/simple/../include modulesmake[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-37-generic'  CC [M]  /home/fang/ldd3/test/simple/simple.o/home/fang/ldd3/test/simple/simple.c:18:26: error: linux/config.h: 没有那个文件或目录/home/fang/ldd3/test/simple/simple.c: In function ‘simple_vma_nopage’:/home/fang/ldd3/test/simple/simple.c:115: error: ‘NOPAGE_SIGBUS’ undeclared (first use in this function)/home/fang/ldd3/test/simple/simple.c:115: error: (Each undeclared identifier is reported only once/home/fang/ldd3/test/simple/simple.c:115: error: for each function it appears in.)/home/fang/ldd3/test/simple/simple.c: At top level:/home/fang/ldd3/test/simple/simple.c:128: error: unknown field ‘nopage’ specified in initializer/home/fang/ldd3/test/simple/simple.c:128: warning: initialization from incompatible pointer typemake[2]: *** [/home/fang/ldd3/test/simple/simple.o] 错误 1make[1]: *** [_module_/home/fang/ldd3/test/simple] 错误 2make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-37-generic'make: *** [default] 错误 2

linux/config.h这个文件不存在。这是因为config.h这个文件在新版本已经被移除。


解决方案:

将simple.c的头文件config.h注销掉

//#include <linux/config.h>


3)‘NOPAGE_SIGBUS’ undeclared (first use in this function) 和 unknown field ‘nopage’ specified in initializer

继续编译

bory@chong:~/ldd3/test/simple$ makemake -C /lib/modules/2.6.32-37-generic/build M=/home/fang/ldd3/test/simple LDDINCDIR=/home/fang/ldd3/test/simple/../include modulesmake[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-37-generic'  CC [M]  /home/fang/ldd3/test/simple/simple.o/home/fang/ldd3/test/simple/simple.c: In function ‘simple_vma_nopage’:/home/fang/ldd3/test/simple/simple.c:115: error: ‘NOPAGE_SIGBUS’ undeclared (first use in this function)/home/fang/ldd3/test/simple/simple.c:115: error: (Each undeclared identifier is reported only once/home/fang/ldd3/test/simple/simple.c:115: error: for each function it appears in.)/home/fang/ldd3/test/simple/simple.c: At top level:/home/fang/ldd3/test/simple/simple.c:128: error: unknown field ‘nopage’ specified in initializer/home/fang/ldd3/test/simple/simple.c:128: warning: initialization from incompatible pointer typemake[2]: *** [/home/fang/ldd3/test/simple/simple.o] 错误 1make[1]: *** [_module_/home/fang/ldd3/test/simple] 错误 2make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-37-generic'make: *** [default] 错误 2

又是错误。看来内核版本不匹配,带来的麻烦真不少阿。未定义NOPAGE_SIGBUS和nopage。因新版本vm_operations_struct去掉了nopage成员。我们这里也去掉她。


解决方案:

编辑simple.c,找到return NOPAGE_SIGBUS; 这一行,作如下改动。(因为这个方法我们不会用到,返回NULL没关系的)

                //return NOPAGE_SIGBUS;                return NULL;
再找到.nopage = simple_vma_nopage,这一行,作如下改动

//.nopage = simple_vma_nopage,
因为新内核版本在vm_operations_struct去掉了nopage成员


4)装载驱动

保存,继续编译,这次大功告成。编译好这个简单的字符驱动后,如何装载呢?

simple_load是装载的shell脚本,simple_unload是卸载脚本。我们先改权限

bory@chong:~/ldd3/test/simple$ chmod 755 simple_load
bory@chong:~/ldd3/test/simple$ chmod 755 simple_unload

继续

bory@chong:~/ldd3/test/simple$ sudo ./simple_load

装载后,如何查看是否装载成功呢?

bory@chong:~/ldd3/test/simple$ lsmod
Module                  Size  Used by
simple                  3868  0
binfmt_misc             7960  1
ppdev                   6375  0

joydev                 11104  0

。。。


列表中有我们刚装载的字符驱动simple,说明我们的操作是成功的。如果我们在驱动程序打印log了,如何查看这些log呢?

找到文件/var/log/syslog,就可以查看到您打印的log了。


如有错误之处,请您指出,谢谢您的不吝赐教!



原创粉丝点击