免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4347 | 回复: 6
打印 上一主题 下一主题

[函数] ”call_constructors“ 什么作用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-27 16:48 |只看该作者 |倒序浏览
本帖最后由 chiuni 于 2011-09-27 17:02 编辑

向各位请教,

我在LK(bootloader)的 /kernel/main.c 文件中发现初始化的时候,会调用 call_constructors(void)函数,如下。

extern void *__ctor_list;
extern void *__ctor_end;

void kmain(void)
{
        // get us into some sort of thread context
        thread_init_early();

        // early arch stuff
        arch_early_init();

        // do any super early platform initialization
        platform_early_init();

        // do any super early target initialization
        target_early_init();

        dprintf(INFO, "welcome to lk\n\n");
       
        // deal with any static constructors
        dprintf(SPEW, "calling constructors\n");
        call_constructors();

static void call_constructors(void)
{
        void **ctor;   
        ctor = &__ctor_list;
        while(ctor != &__ctor_end) {
                void (*func)(void);

                func = (void (*)())*ctor;

                func();
                ctor++;
        }
}


能否帮忙解释下,这个函数有什么作用? 为什么要在这里调用?
谢谢了先。

论坛徽章:
0
2 [报告]
发表于 2011-09-27 17:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-09-27 21:31 |只看该作者
本帖最后由 x5miao 于 2011-09-27 21:33 编辑

就是字面意思——调用构造器,构造器是定义在__ctor_list和__ctor_end之间的函数指针。至于__ctor_list和__ctor_end之间有哪些函数你可以看编译之后输出的map文件,或者链接脚本里面可能也有定义

论坛徽章:
0
4 [报告]
发表于 2011-09-28 14:14 |只看该作者
回复 3# x5miao

谢谢你的回答。
我奇怪的是:为什么这里要我们自己在代码调用这个函数,在其他代码里,也需要这样吗?一直认为是由GCC自动做这些事的。

论坛徽章:
0
5 [报告]
发表于 2011-09-28 21:26 |只看该作者
回复 4# chiuni


   你把他和C++中的构造函数搞混了?
  bootloader的构造器一般完成的是初始化设备对象的操作,由于不同的系统在bootloader阶段需要初始化的设备不同,所以需要用户自己调用这些初始化函数。不过我看的是uboot的代码,不知道和你这个bootloader是不是有区别

论坛徽章:
0
6 [报告]
发表于 2011-09-29 10:54 |只看该作者
回复 5# x5miao

谢谢。
我感觉这个函数放在这里还是针对代码中C++部分。
我用的bootloader是 LITTLE KERNEL。

论坛徽章:
0
7 [报告]
发表于 2011-09-29 12:31 |只看该作者
本帖最后由 x5miao 于 2011-09-29 12:33 编辑

回复 6# chiuni


    这个和C++没什么关系,而且很少有bootloader用c++写的。这更多的是设备初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP