标签:
一,内核模块的概念
经常在内核驱动代码看到类似fs_init()等驱动初始化函数,那么这个和module_init()函数的差别在哪里,宏定义__define_initcall(level,fn)对于内核的初始化很重要,他指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化段,do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常很重要
其中module_init()对应的是如下的device_initcall(fn)
二,内核模块和应用程序之间的差别
1,应用程序可以使用一些库函数,而内核模块只能使用内核其它模块导出的一些函数
2,处理错误的方式不一样。
3,应用程序是从头到尾执行单个任务,而模块是预先注册自己以便服务于将来某个请求。
三,构建内核模块
构建hello.ko模块 obj-m := hello.o
构建module.ko模块,并由两个源文件生成(file1.c和file2.c)
四,模块操作相关的命令
insmod:装载一个模块
modprobe:装载一个模块,同时检查模块是否引用了一些当前内核不存在的符合,如果有,modprobe会在当前模块搜索路径中查找定义了这些符合的其它模块并加载
rmmod,卸载一个模块。
五,模块之间的引用
将一个模块的函数或者变量导出让其它模块可以使用
六,模块参数
insmod hello howmany=10 whom="Mom"
在hello.c的驱动程序中
标签:
原文地址:http://www.cnblogs.com/zhiliao112/p/4237209.html