进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 操作系统 -> Linux -> 文章内容  
Linux内核驱动程序初始化顺序的调整

今天在做一个驱动的时候要用到另一个驱动(I2C)提供的API,在内核初始化时碰到了一个依赖问题。 www.goodsgy.com

www.goodsgy.com

  我的驱动在I2C初始化之前就运行起来了,而这时I2C提供的API还处于不可用状态。查了很多资料,网上有人说所有使用module_init这个宏的驱动程序的起动顺序都是不确定的(我没有查到权威的资料)。

  所有的__init函数在区段.initcall.init中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些__init函数指针,并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等)。 www.goodsgy.com

  注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,和1)中所述的这些函数本身在.init.text区段中的顺序无关。在2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。在2.6内核中,initcall.init区段又分成7个子区段,分别是 www.goodsgy.com

www.goodsgy.com

.initcall1.init  .initcall2.init  .initcall3.init  .initcall4.init  .initcall5.init  .initcall6.init  .initcall7.init

  当需要把函数fn放到.initcall1.init区段时,只要声明 www.goodsgy.com

www.goodsgy.com

core_initcall(fn);

  即可。 www.goodsgy.com

  其他的各个区段的定义方法分别是: www.goodsgy.com

www.goodsgy.com

core_initcall(fn) --->.initcall1.init  postcore_initcall(fn) --->.initcall2.init  arch_initcall(fn) --->.initcall3.init  subsys_initcall(fn) --->.initcall4.init  fs_initcall(fn) --->.initcall5.init  device_initcall(fn) --->.initcall6.init  late_initcall(fn) --->.initcall7.init

  而与2.4兼容的initcall(fn)则等价于device_initcall(fn)。各个子区段之间的顺序是确定的,即先调用. initcall1.init中的函数指针,再调用.initcall2.init中的函数指针,等等。而在每个子区段中的函数指针的顺序是和链接顺序相关的,是不确定的。 www.goodsgy.com

  在内核中,不同的init函数被放在不同的子区段中,因此也就决定了它们的调用顺序。这样也就解决了一些init函数之间必须保证一定的调用顺序的问题。按照include/linux/init.h文件所写的,我在驱动里偿试了这样两种方式: www.goodsgy.com

www.goodsgy.com

__define_initcall("7", fn); late_initcall(fn);

  都可以把我的驱动调整到最后调用。实际上上面两个是一回事: www.goodsgy.com

www.goodsgy.com

#define late_initcall(fn) __define_initcall("7", fn)

在百度中搜索:Linux内核驱动程序初始化顺序的调整
在Google中搜索:Linux内核驱动程序初始化顺序的调整
在Yahoo中搜索:Linux内核驱动程序初始化顺序的调整

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 十大注意事项 让Linux启动更快速
· Linux软件安装指南
· [组图] 快速体验Linux的3种方式
· Linux下Tomcat自启动的设置技巧
· 装有双系统用户 如何卸载Linux
· [组图] 在Linux操作系统上创建ADSL拨号上网..
· 高效使用Linux的七个习惯
· [组图] 怎样让PPLive更加流畅的播放
· 为了Dreamweaver Adobe停止研发GoLive
· Novell:Linux消费市场开发仍需3-5年时间..
 
· 十大注意事项 让Linux启动更快速
· Linux软件安装指南
· [组图] 快速体验Linux的3种方式
· Linux下Tomcat自启动的设置技巧
· 装有双系统用户 如何卸载Linux
· [组图] 在Linux操作系统上创建ADSL拨号上网..
· 高效使用Linux的七个习惯
· 基础知识:什么是Fedora Linux
· Linux操作系统下的umask函数详解
· Ubuntu Linux 8.04操作系统4月24日发布

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)