爱悠闲 > Linux device drives chapter 2(构造和运行模块)

Linux device drives chapter 2(构造和运行模块)

分类: Linux kernel  |  标签: linux,makefile,shell,编译器,工具,ubuntu  |  作者: youkuxiaobin 相关  |  发布日期 : 2013-10-29  |  热度 : 65°
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也是同样的道理。

对于驱动的初始化函数和退出函数,一定要处理好错误处理。


睡觉 睡觉。最大的爱好睡觉、读书