+ -
当前位置:首页 → 问答吧 → 关于do_initcalls中调用的链表问题

关于do_initcalls中调用的链表问题

时间:2004-12-02

来源:互联网

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声明的,怎么知道这个链表的顺序呢
还有在编译的时候 是根据什么来插入这个链表的呢??

作者: z21921   发布时间: 2004-12-02

1.不是链表,是存在几个特殊section中函数指针数组
2.按在section定义的先后顺序排列

作者: phyma   发布时间: 2004-12-02

可能是我理解错了
如果是section的话 是在哪里定义的啊(具体的文件)

作者: z21921   发布时间: 2004-12-02

你刚才已经提到了initcall,和module_init宏。

这两个定义在include/linux/module.h中

作者: phyma   发布时间: 2004-12-02

我知道这2个宏的位置
我是想知道“存在几个特殊section中函数指针数组”在什么位置

也就是在编译的时候 所有的模块都调用上面的2个宏 它是安装什么顺序编译的
据说在Makefile中定义的 可是还没有看明白

作者: z21921   发布时间: 2004-12-02

driver/mtd/nand/diskonchip.c中有
module_init(init_nanddoc);
driver/net/ether00.c中有
module_init(ether00_mod_init);
这2个模块都要初始化
它是按照什么顺序初始化的呢
在编译的时候 入口保存在 那个函数指针数组中 这个数组在什么位置 怎么能看到呢?

作者: z21921   发布时间: 2004-12-02

需要一个显式的数组吗?
你试着在一个section里全部定义函数指针,那么这个section名称是不是可以用成一个数组呢?
其实那两个宏就可以说明一切问题。
Sorry,我偷懒没有在回帖里面详细说明。

作者: phyma   发布时间: 2004-12-03

phyma 太谢谢你的回复了
是我没有说明白我需要什么东西

我想要一个显示的东西 显示出所有的模块初始化顺序
系统启动后 我在/var/log/messages中能看到一些顺序
这个有办法吗
再次感谢

作者: z21921   发布时间: 2004-12-03

现在的kernel已经按功能把initcall划入了几个不同的section,但是好像section之内的顺序完全取决于gcc看到定义的顺序。很麻烦。

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

不知道有没有高手知道简单点的办法?

作者: phyma   发布时间: 2004-12-03

是啊
好像是根据在Makefile中定义的顺序进行的
我现在的调试就是加 printk语句
不过太麻烦了
每次都要编译 重启

作者: z21921   发布时间: 2004-12-03

我手边没有2.4的kernel source,无法测试
你用这段代码试试:
print_symbol(": %s()", (unsigned long) *call);
其中call为函数指针

作者: phyma   发布时间: 2004-12-14

谢谢phyma版主
恭喜phyma当选版主^_^

作者: z21921   发布时间: 2004-12-14

引用:
最初由 z21921 发表
谢谢phyma版主
恭喜phyma当选版主^_^
呵呵,谢谢支持
人气很差啊,大家都不喜欢研究内核?

作者: phyma   发布时间: 2004-12-14

不过版主提供的这个print_symbol是个什么函数啊
可以在内核中执行吗??
我的理解是 我可以把这段代码加到 initcall中
可是在内核中的打印语句好像只有printk吧(也许还有其它的,我不知道)

我把这段加入进去 ,编译不通过

作者: z21921   发布时间: 2004-12-14

是可以的,这个宏定义在include/linux/kallsyms.h(2.6)中,不知道2.4的状况,我正下载一个2.4的source来看看

作者: phyma   发布时间: 2004-12-14

Sorry,2.4好像没有这个

作者: phyma   发布时间: 2004-12-14

呵呵
内核版本的差别太大了

作者: z21921   发布时间: 2004-12-14