欢迎 chinavb 加入本站!
 免费注册  用户登陆  汇款方式  汇款确认  产品报价  联系我们  帮助中心
加入收藏
设为首页
会员体系
申请VIP
网站首页 光盘超市 软件下载 技术文章 专题 用户中心 VIP会员 技术论坛 网站留言 娱乐中心 卓越资源
今天是:2009年01月08日 星期四  您现在位于: 首页 → 技术文章 → Linux内核中对模块...
   Linux内核中对模块的处理
作者:kylezk.cublog.cn  出处:kylezk.cublog.cn  更新时间: 2007年02月27日 

在Linux中有大量的module存在,因为module能减少内核大小,能达到相同的效果。看了下内核中对module的 处理,主要是模块的创建和对module结构的初始化。
主要涉及到module_symbol,module_ref,module这三个数据结构,都在include/linux/module.h中定义。
struct module_symbol
{
     unsigned long value;
     const char *name;
};
这个结构用来描述符号的名字和值
struct module_ref
{
     struct module *dep;
     struct module *ref;
     struct module_ref *next;
};
这个结构用来描述模块之间的依赖关系,dep表示本模块所依赖的模块,可能是其他模块也可能是内核,内核也是个模块,将内核也定义一个module,
static struct module kernel_module = {
     size_of_struct: sizeof(struct module),
     name: "",
     uc:   {ATOMIC_INIT(1)},
     flags:MOD_RUNNING,
     syms: __start__ksymtab,
     ex_table_start: __start__ex_table,
     ex_table_end:   __end__ex_table,
     kallsyms_start: __start_kallsyms,
     kallsyms_end:   __stop__kallsyms,
};
ref表示其他模块对本模块的引用,然后通过next来构成一个链表。
struct module_persisit;//empty
struct module
{     
     unsigned long size_of_struct; /* sizeof(module) */
     struct module *next;//用来构成链
     const char *name;//模块名称
     unsigned long size;//模块大小
     union {
          atomic_t usecount;
          long pad;
     } uc;//使用次数
     unsigned long flags; /* AUTOCLEAN et al */
     unsigned nsyms;//符号个数
     unsigned ndeps;//依赖模块树木

     struct module_symbol *syms;//符号表链
     struct module_ref *deps;//依赖模块链
     struct module_ref *refs;//被引用模块链
     int (*init)(void);//初始化
     void (*cleanup)(void);//清除
     const struct exception_table_entry *ex_table_start;//异常处理
     const struct exception_table_entry *ex_table_end;
/* Members past this point are extensions to the basic
module support and are optional. Use mod_opt_member()
to examine them. */
     const struct module_persisit *persist_start;//扩展
     const struct module_persisit *persist_end;
     int (*can_unload)(void);
};
每个已安装模块在内核中都有一个module数据结构(通过create_module()创建)
创建module的流程为调用sys_create_module()来创建一个struct module,然后就是用sys_init_module()来对module结构进行初始化,从用户空间复制相关成分来填充module结构。
module这个结构大小是一定的,但是其映象空间大小就因模块的不同而不同了。persist_start,persist_end是为了处理用户空间模块大小和内核模块大小不符造成的麻烦,所以在检查时第一要不小于persist_start前面的部分
mod_usr_size>(unsigned long)&((struct module *)0L)->persist_start
第二要小于persist_end+64bytes,mod_usr_size<sizeof(module)+16*(void*)
对于扩展部分的检验用mod_member_present宏来处理,原型为
#define mod_member_present(mod,member) \
((unsigned long)&((struct module *)0L)->member+1) <= (mod)->size_of_struct,
进行完权限以及以上的校验后就可以从用户空间将module结构的相关成分复制过来了,然后就是将module_ref链到相应的模块,最后还要启动执行模块的init_module()函数。
而对模块的卸载则是通过sys_delete_module()来实现的,在该函数中只要将module_ref从相应的链中删除,并且将module结构所占用的空间释放即可。
 
  
 
 
 
 (本文已被浏览 2032 次)
 发布人:sdccf
 → 推荐给我的好友
上篇文章:Linux限制apache的每隔IP访问的并发数
下篇文章:Linux中开发工具的配置
 相关文章:
VMware下编译Linux内核(2.4.32)全过程 VMWare Workstation 6.0调试Linux Kernel
使用 Linux 系统调用的内核命令 Linux操作系统内核启动参数详细解析
Linux系统单一内核模块编译过程解析 Linux 2.6.19.x 内核编译配置选项简介(二)
Linux 2.6.19.x 内核编译配置选项简介(一) 解读和分析Linux核心源码的两种方法
按需对Linux系统内核进行定制和修改 编译支持NTFS的Linux系统模块
Linux系统内核抢占补丁的原理说明 Linux系统内核接收以太帧的处理程序
升级和编译你的Linux核心(精简版) 对Linux内核版本稳定性测试简单介绍
利用异常表处理Linux内核态缺页异常 Linux内核编译菜单中相关选项的意义
Linux系统应用程序和内核模块的区别 Linux操作系统的内核编译详细步骤
调整内核网络参数提高Linux系统安全 Linux系统2.6内核改进的内存管理剖析

相关搜索
查看百度中关于Linux内核中对模块的处理的更多内容
查看google中关于Linux内核中对模块的处理的更多内容
   文章分类
操作系统 |
SCO_UNIX  Sun_Solaris  IBM_AIX  HP_UX  Linux  BSD  Tru64_UNIX 
通用UNIX知识  Windows  Minix 
程序设计 |
Shell编程  C/C++  汇编  PHP  JAVA  Perl  Python 
ASP/HTML  XML  中间件 
数据库 |
Oracle  Informix  Sybase  Fox  DB2  SQL  MySQL 
PostgreSQL 
网络应用 |
网络应用 
计算机硬件 |
计算机主机  打印机  路由器  交换机  终端  磁带机  MO 
刻录机  终端服务器  调制解调器 
   文章评论
  → 评论内容 (点击查看)   共0条评论,每页显示5条评论   浏览所有评论
(没有相关评论)
  → 发表我的评论
您的姓名: 您的Email:
评论内容:
250字内
发表评论:      发表评论须知 →
  • 尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法;
  • 本站有权保留或删除您发表的任何评论内容;
  • 关于我们 ┋  网站留言 ┋  网站地图 ┋  友情链接 ┋  与我在线 ┋  汇款确认 ┋  管理 ┋  TOP
    Unix爱好者家园  http://www.unix-cd.com/
    联系我们:sdccf@163.com
    腾讯QQ: 7644599
    备案序号:鲁ICP备05000455号
    Copyright (c) 2001-2008 Unix-cd.com. All Rights Reserved.