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了。
如有错误之处,请您指出,谢谢您的不吝赐教!
- Ldd3 学习笔记2 — simple
- Ldd3 学习笔记2 — simple 2.6.10以上内核版本编译错误解决方法!!!
- Ldd3 学习笔记1 — 环境搭建
- Ldd3 学习笔记3 —file_operations
- LDD3学习笔记(一)
- LDD3笔记(2)
- ldd3学习笔记:调试技术
- <Debugging Techniques> LDD3 学习笔记
- simple tree 学习笔记2
- LDD3学习笔记——模块的编译
- LDD3学习笔记(2):建立和运行模块
- LDD3学习笔记(4):字符驱动2
- LDD3源码学习笔记之scull_pipe转
- LDD3学习笔记《三》第四章
- LDD3学习笔记(7):调试技术
- LDD3学习笔记(11):内存分配
- LDD3学习笔记(13):中断处理
- LDD3学习笔记(15):PCI驱动
- UltraISO v9.5.3.2900
- 有趣的jquery.data
- 一种简便定义javascript命名空间的方法
- 卸载linux时,删除grub的方法
- Android Sensor传感器系统架构初探
- Ldd3 学习笔记2 — simple
- WINDOW的中断认识
- 分析Android 根文件系统启动过程(init守护进程分析)
- html标签大全
- Android如何生成设备节点
- 让读书成为一种习惯
- 在select sqlite数据中的datetime字段的时候出现 该字符串未被识别为有效的 DateTime
- Android设备节点的动态管理
- mysql 5.5 源码分析 1