QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1412|回复: 7

内核在do_initcalls()里停住

[复制链接]
发表于 2005-4-6 10:56:11 | 显示全部楼层 |阅读模式
[code:1]
static void __init do_initcalls(void)
{
        int i=0;
        initcall_t *call;
        call = &__initcall_start;
        do {
            printk("do_initcalls i=%d\n",i);
            (*call)();
            call++;
            i++;
        } while (call < &__initcall_end);

        flush_scheduled_tasks();
}

[/code:1]
i等于33时停住了,我如何知道此时的call指向哪里?有没有办法得到函数指针指向的函数名?
 楼主| 发表于 2005-4-7 14:05:02 | 显示全部楼层
不知道这个i跟设备中断号是不是对应的
回复

使用道具 举报

发表于 2005-4-7 15:33:24 | 显示全部楼层
用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的
回复

使用道具 举报

 楼主| 发表于 2005-4-8 11:55:17 | 显示全部楼层
[quote:db1fbeae4c="WindTrace"]用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的[/quote]
老大,这是函数指针啊
回复

使用道具 举报

发表于 2005-4-9 10:42:32 | 显示全部楼层
查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~
回复

使用道具 举报

 楼主| 发表于 2005-4-11 10:52:22 | 显示全部楼层
[quote:425011b088="WindTrace"]查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~[/quote]
有那么简单就好了
call里的东西和循序是在编译时决定的
源码里只是把要加入initcall的函数用__initcall(fn)宏声明一下,编译时编译器遇到__initcall(fn)就把fn加入到initcall表力,__initcall_start只是表头.
以上说法可能不正确,希望高手指正.
回复

使用道具 举报

发表于 2005-4-11 15:01:39 | 显示全部楼层
或者这样:

在通过宏把fn插入到列表时,将函数以及函数的地址保存到log里面
在每次++call之后,用printk打印函数的地址所在,然后比较
就可以知道调用的是哪个函数了?

这样可行吗?
回复

使用道具 举报

发表于 2005-4-13 17:54:12 | 显示全部楼层
你用kgdb试一试,这个可以进行内核调试的
然后查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?


试一试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-6-29 08:25 , Processed in 0.082723 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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