Ldd3 学习笔记2 — simple 2.6.10以上内核版本编译错误解决方法!!!

http://blog.csdn.net/fangchongbory/article/details/7908127

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

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

  1. include  Makefile      pci    scullc  scullv      simple  tty  
  2. lddbus   misc-modules  sbull  sculld  short       skull   usb  
  3. LICENSE  misc-progs    scull  scullp  shortprint  snull  

cd 到simple目录,有以下文件
  1. Makefile  simple.c  simple_load  simple_unload  

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


1)CFLAGS错误

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

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


解决方案:

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

保存继续编译。


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

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

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


解决方案:

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

  1. //#include <linux/config.h>  


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

继续编译

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

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


解决方案:

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

  1. //return NOPAGE_SIGBUS;  
  2. return NULL;  
再找到.nopage = simple_vma_nopage,这一行,作如下改动
  1. //.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了。


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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值