Linux device drives chapter 2
1. 如果你想编译驱动程序,那么你的系统必须存在构造好的内核源码树,否则驱动编译的时候头文件和链接文件找不到。
2. linux驱动程序的运行不依赖于c库,不能调用c库中的函数,但是一般c库中的函数在内核都有实现。照这个模式是可以使用c库函数,但使用的不是c库的。
3. 对于驱动模块的加载insmod rmmod只有超级用户 root才有权限,对于ubuntu的话,sudo insmod *.ko 、sudo rmmod *.ko对驱动模块进行加载和卸载。
4. 应用程序和驱动程序的区别是:①应用程序从头到尾仅仅执行单个任务,驱动程序注册了自己,为了以后的某个请求②应用程序退出的时候,可以不管资源的释放或者其他 的清除工作,但模块的退出函数却必须仔细撤销初始化函数所做的一切,否则,在系统重新启动之前某些东西就会残留在系统中。
5. 在unix系统中内核运行在最高级别(超级用户态)应用程序处在最低的级别(用户态)。超级用户态可以进行所有操作。
6. 内核是一个很大的独立的程序,满足insmod 的操作需要:驱动要和内核要有相同版本的编译器、模块工具和其他的必要工具
7. KERNELRELEASE的研究
#如果已经定义了KERNELRELEASE,则说明是从内核整体编译的Make中调用。在我的2.6.31内核的 #Makefile中L350行有关于KERNELRELEASE定义: #KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) #因此可以使用其内建语句 ifneq ($(KERNELRELEASE), ) obj-m := hello.o #否则,是直接从命令行调用, #这时需要调用内核构造系统 #对$(shell uname -r)会得到Linux系统版本相关信息: #root@wjg-desktop:~# uname -r #2.6.31-14-generic else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: #对下面一句Makefile的解释:-C $(KERNELDIR)表示读取Makefile之前进入KERNELDIR目录,M=$(PWD) #作为参数传给Makefile,内核中的解释是: #make M=dir modules Make all modules in specified dir $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif
8. modprobe和insmod的区别:modprobe、insmod都能加载驱动,但是 加载的驱动是需要其他的驱动先加载之后才能加载,使用modprobe,insmod只能加载参数中的 一个驱动,modprobe是加载参数中的驱动和相关的驱动,modprobe查找相关驱动,是当前模块搜索路径的。
9. lsmod原理是通过读取/proc/modules虚拟文件来获得所有驱动的信息
10. 公共内核符号表中包含了所有的全局内核项(即函数和变量)的地址,如果驱动中有未定义的符号,就会到公共内核符号表中查找
11. 函数导出的一般都被其他驱动模块使用,导出的方法是EXPORT_SYMBOL(name)
12. static int __init initialize()
{}中的__init 表示是模块的初始化函数,调用完毕之后,这个函数就不会在使用,这个时候直接把这个函数从内存中释放掉,减少不必要的内存。__exit也是同样的道理。
对于驱动的初始化函数和退出函数,一定要处理好错误处理。
睡觉 睡觉。最大的爱好睡觉、读书