LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1858|回复: 16

关于do_initcalls中调用的链表问题

[复制链接]
发表于 2004-12-2 10:39:35 | 显示全部楼层 |阅读模式
static void __init do_initcalls(void)
{
        initcall_t *call;

        call = &__initcall_start;
        do {
                (*call)();
                call++;
        } while (call < &__initcall_end);

        /* Make sure there is no pending stuff from the initcall sequence */
        flush_scheduled_tasks();
}
这里使用的链表的内容都是使用__initcall或者module_init声明的,怎么知道这个链表的顺序呢
还有在编译的时候 是根据什么来插入这个链表的呢??
发表于 2004-12-2 13:46:22 | 显示全部楼层
1.不是链表,是存在几个特殊section中函数指针数组
2.按在section定义的先后顺序排列
 楼主| 发表于 2004-12-2 13:53:50 | 显示全部楼层
可能是我理解错了
如果是section的话 是在哪里定义的啊(具体的文件)
发表于 2004-12-2 14:08:35 | 显示全部楼层
你刚才已经提到了initcall,和module_init宏。

这两个定义在include/linux/module.h中
 楼主| 发表于 2004-12-2 16:58:47 | 显示全部楼层
我知道这2个宏的位置
我是想知道“存在几个特殊section中函数指针数组”在什么位置

也就是在编译的时候 所有的模块都调用上面的2个宏 它是安装什么顺序编译的
据说在Makefile中定义的 可是还没有看明白
 楼主| 发表于 2004-12-2 17:03:12 | 显示全部楼层
driver/mtd/nand/diskonchip.c中有
module_init(init_nanddoc);
driver/net/ether00.c中有
module_init(ether00_mod_init);
这2个模块都要初始化
它是按照什么顺序初始化的呢
在编译的时候 入口保存在 那个函数指针数组中 这个数组在什么位置 怎么能看到呢?
发表于 2004-12-3 09:04:58 | 显示全部楼层
需要一个显式的数组吗?
你试着在一个section里全部定义函数指针,那么这个section名称是不是可以用成一个数组呢?
其实那两个宏就可以说明一切问题。
Sorry,我偷懒没有在回帖里面详细说明。
 楼主| 发表于 2004-12-3 10:25:51 | 显示全部楼层
phyma 太谢谢你的回复了
是我没有说明白我需要什么东西

我想要一个显示的东西 显示出所有的模块初始化顺序
系统启动后 我在/var/log/messages中能看到一些顺序
这个有办法吗
再次感谢
发表于 2004-12-3 11:27:26 | 显示全部楼层
现在的kernel已经按功能把initcall划入了几个不同的section,但是好像section之内的顺序完全取决于gcc看到定义的顺序。很麻烦。

只想到一个最笨的办法:在你感兴趣的initcall中嵌入printk。

不知道有没有高手知道简单点的办法?
 楼主| 发表于 2004-12-3 13:56:26 | 显示全部楼层
是啊
好像是根据在Makefile中定义的顺序进行的
我现在的调试就是加 printk语句
不过太麻烦了
每次都要编译 重启
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表