当前位置:  技术问答>linux和unix

问斑竹个简单的问题。

    来源: 互联网  发布时间:2016-09-01

    本文导语:  我把一些驱动模块静态加载到内核,都是通过module_init,我如何知道他们的加载顺序, module_init的加载优先级是6,这些驱动在如何确定顺序。 | 本帖最后由 wenxy1 于 2009-12-30 15:45:41 编辑 linux kernel version: 2.6.32. /in...

我把一些驱动模块静态加载到内核,都是通过module_init,我如何知道他们的加载顺序,
module_init的加载优先级是6,这些驱动在如何确定顺序。

|
本帖最后由 wenxy1 于 2009-12-30 15:45:41 编辑


linux kernel version: 2.6.32.
/include/linux/init.h
/*
 * A "pure" initcall has no dependencies on anything else, and purely
 * initializes variables that couldn't be statically initialized.
 *
 * This only exists for built-in code, not for modules.
 */
#define pure_initcall(fn) __define_initcall("0",fn,0)

#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)

#define __initcall(fn) device_initcall(fn)



|
参见include/linux/init.h和vmlinux.lds
1)
所有标识为__init的函数在链接的时候都放在.init.text这个区段内,
在这个区段中,函数的摆放顺序是和链接的顺序有关的,是不确定的。
2)
所有的__init函数在区段.initcall.init中还保存了一份函数指针,
在初始化时内核会通过这些函数指针调用这些__init函数指针,
并在整个初始化完成后,释放整个init区段(包括.init.text,.initcall.init等),
注意,这些函数在内核初始化过程中的调用顺序只和这里的函数指针的顺序有关,
和1)中所述的这些函数本身在.init.text区段中的顺序无关。
在2.4内核中,这些函数指针的顺序也是和链接的顺序有关的,是不确定的。
在2.6内核中,initcall.init区段又分成7个子区段,分别是
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
当需要把函数fn放到.initcall1.init区段时,只要声明
core_initcall(fn);
即可。
其他的各个区段的定义方法分别是:
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中的函数指针,等等。
而在每个子区段中的函数指针的顺序是和链接顺序相关的,是不确定的。
在内核中,不同的init函数被放在不同的子区段中,因此也就决定了它们的调用顺序。
这样也就解决了一些init函数之间必须保证一定的调用顺序的问题。

    
 
 

您可能感兴趣的文章:

  • 强烈要求本版斑竹向CSDN总斑竹申请分版。并把分版的意见放在版顶。并且整理出常见问题的F&Q。
  • sharetop,新斑竹,回答我一个问题!很简单的!欢迎大家进来提问,让我们的新帮主解答,如果能回答10个,我就全力支持!发表对新斑竹的看法,发表者有分!
  • Lawrence444 先给你100分,哈哈,斑竹不要删呀!他给我解决了加密问题.
  • 问题123456!!斑竹请进!!
  • 斑竹新上任,请教一个程序结构问题,捧场......
  • 一个纯技术问题困扰我很久,望热心的高手和斑竹解答!!
  • 几个十分简单的问题,望斑竹和各位前辈指点迷津。
  • 关于编码转换的问题,我觉得java大斑竹(尤其是笑着悲伤)应该做一个faq,大家进来支持一下。
  • [新会员必读]------问题解决之道(转自linuxsir,建议斑竹置顶!)
  • robber斑竹,帮我解决一下这个问题好吗?
  • LINUX-SOCK编程基础问题?望斑竹解答1
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 斑竹请进!!!斑竹请进!!!
  • 斑竹千万别删除这个帖子,不是散分,是答应了给分,很多斑竹又不让发帖子给!
  • ??为什么这个栏目没有斑竹??、、、、、、
  • 为什么我登陆后会显示下面的信息,站长或斑竹来看看啊(!!!!!!!!!!!!!!!!!!)
  • 请问斑竹,是不是,专家分越高提问时能给的点数就越多
  • 这里的斑竹很幽默
  • 我想问一下斑竹,为什么我的信誉分降低了???
  • 嵌入式开发网 ≡ 所有板块招募斑竹中...... ≡
  • 招聘大型论坛斑竹,送高分
  • http://52jsp.126.com征斑竹啊,如果你出色的话,可以获得免费的jsp空间
  • 发个培训广告,请斑竹别删~
  • 申请 当小斑竹
  • 斑竹散分,希望大家继续支持jsp版
  • 致斑竹﹐以及更高權限的人﹗
  • 给斑竹hexiaofeng
  • 斑竹请进!!急急急
  • 我觉得JAVA的帖子回复率很低,大家给斑竹提点意见怎么样?
  • 斑竹,我要见你
  • 斑竹 你好 我看见你了
  • 放分已贺鲨鱼做斑竹,吐口口水先~~呸~~~


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3