内核在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指向哪里?有没有办法得到函数指针指向的函数名? 不知道这个i跟设备中断号是不是对应的 用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的 用source insight就就可以查找函数所在阿
这个是win下的查看源代码的软件,很流行的
老大,这是函数指针啊 查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~ 查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
跟踪源码~~
有那么简单就好了
call里的东西和循序是在编译时决定的
源码里只是把要加入initcall的函数用__initcall(fn)宏声明一下,编译时编译器遇到__initcall(fn)就把fn加入到initcall表力,__initcall_start只是表头.
以上说法可能不正确,希望高手指正. 或者这样:
在通过宏把fn插入到列表时,将函数以及函数的地址保存到log里面
在每次++call之后,用printk打印函数的地址所在,然后比较
就可以知道调用的是哪个函数了?
这样可行吗? 你用kgdb试一试,这个可以进行内核调试的
然后查找__initcall_start这个标志嘛
看它具体指向哪里,再顺着推算到第33个位置不就行了?
试一试
页:
[1]