网站安全管理制度建设下载,网站建设公司哪家强,国际新闻快报,威联通怎么建设网站一#xff0c;内核模块的概念 经常在内核驱动代码看到类似fs_init()等驱动初始化函数#xff0c;那么这个和module_init()函数的差别在哪里#xff0c;宏定义__define_initcall(level,fn)对于内核的初始化很重要#xff0c;他指示编译器在编译的时候#xff0c;将一系列初…一内核模块的概念 经常在内核驱动代码看到类似fs_init()等驱动初始化函数那么这个和module_init()函数的差别在哪里宏定义__define_initcall(level,fn)对于内核的初始化很重要他指示编译器在编译的时候将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化段do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址来依次完成相应的初始化。于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成因此这个顺序排列常常很重要 点击打开链接 其中module_init()对应的是如下的device_initcall(fn) [cpp] view plaincopy 189 #define core_initcall(fn) __define_initcall(1,fn,1) 190 #define core_initcall_sync(fn) __define_initcall(1s,fn,1s) 191 #define postcore_initcall(fn) __define_initcall(2,fn,2) 192 #define postcore_initcall_sync(fn) __define_initcall(2s,fn,2s) 193 #define arch_initcall(fn) __define_initcall(3,fn,3) 194 #define arch_initcall_sync(fn) __define_initcall(3s,fn,3s) 195 #define subsys_initcall(fn) __define_initcall(4,fn,4) 196 #define subsys_initcall_sync(fn) __define_initcall(4s,fn,4s) 197 #define fs_initcall(fn) __define_initcall(5,fn,5) 198 #define fs_initcall_sync(fn) __define_initcall(5s,fn,5s) 199 #define rootfs_initcall(fn) __define_initcall(rootfs,fn,rootfs) 200 #define device_initcall(fn) __define_initcall(6,fn,6) 201 #define device_initcall_sync(fn) __define_initcall(6s,fn,6s) 202 #define late_initcall(fn) __define_initcall(7,fn,7) 203 #define late_initcall_sync(fn) __define_initcall(7s,fn,7s) 170 #define __define_initcall(level,fn,id) \ 171 static initcall_t __initcall_##fn##id __used \ 172 __attribute__((__section__(.initcall level .init))) fn 二内核模块和应用程序之间的差别1应用程序可以使用一些库函数而内核模块只能使用内核其它模块导出的一些函数2处理错误的方式不一样。3应用程序是从头到尾执行单个任务而模块是预先注册自己以便服务于将来某个请求。三构建内核模块构建hello.ko模块 obj-m : hello.o构建module.ko模块并由两个源文件生成file1.c和file2.c [cpp] view plaincopy obj-m : module.o module-objs : file1.o file2.o 四模块操作相关的命令insmod装载一个模块modprobe:装载一个模块同时检查模块是否引用了一些当前内核不存在的符合如果有modprobe会在当前模块搜索路径中查找定义了这些符合的其它模块并加载rmmod,卸载一个模块。五模块之间的引用将一个模块的函数或者变量导出让其它模块可以使用 [cpp] view plaincopy EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); //导出的模块只能被GPL许可证下的模块使用 六模块参数insmod hello howmany10 whomMom在hello.c的驱动程序中 [cpp] view plaincopy static char*whomworld static int howmany1; module_param(howmany,int,S_IRUGO); module_param(whom,charp,S_IRUGO)转载于:https://www.cnblogs.com/zhiliao112/p/4237209.html