mozilla 发表于 2005-4-6 10:56:11

内核在do_initcalls()里停住


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();
}


i等于33时停住了,我如何知道此时的call指向哪里?有没有办法得到函数指针指向的函数名?

mozilla 发表于 2005-4-7 14:05:02

不知道这个i跟设备中断号是不是对应的

WindTrace 发表于 2005-4-7 15:33:24

用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的

mozilla 发表于 2005-4-8 11:55:17

用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的
老大,这是函数指针啊

WindTrace 发表于 2005-4-9 10:42:32

查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~

mozilla 发表于 2005-4-11 10:52:22

查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~
有那么简单就好了
call里的东西和循序是在编译时决定的
源码里只是把要加入initcall的函数用__initcall(fn)宏声明一下,编译时编译器遇到__initcall(fn)就把fn加入到initcall表力,__initcall_start只是表头.
以上说法可能不正确,希望高手指正.

WindTrace 发表于 2005-4-11 15:01:39

或者这样:

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

这样可行吗?

longda 发表于 2005-4-13 17:54:12

你用kgdb试一试,这个可以进行内核调试的
然后查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?


试一试
页: [1]
查看完整版本: 内核在do_initcalls()里停住