[转]CRT启动函数学习笔记

CRT运行库启动函数分析:
在进入main函数之前,系统会调用CRT运行库的启动函数,做如下工作:
全局变量已完成初始化,
堆的初始化,
I/O也完成了初始化,
Main调用
写的绝逼的好阿!!!!很有助于分析代码!!
1. *****CRTStartUp()的框架:

******CRTStartUp()
{
  /*初始化一些操作系统版本的全局变量*/
  _osver   =   GetVersion();   
    
  _winminor   =   (_osver   >>   8)   &   0x00FF   ;   
  _winmajor   =   _osver   &   0x00FF   ;   
  _winver     =   (_winmajor   <<   8)   +   _winminor;   
  _osver      =   (_osver   >>   16)   &   0x00FFFF   ;   

  /*初始化堆*/
  if   (   !_heap_init(1)   )
      ……………..

/*初始化I/O ,这样在main函数中才能直接使用printf 之类的函数,使用windows的SHE机制*/

try {
  _ioinit();  

}__except (_XcptFilter(GetExceptionCode(),   GetExceptionInformation()) ){
    _exit(  GetExceptionCode() );
}

/*取得命令行参数*/
_wcmdln   =   (wchar_t   *)__crtGetCommandLineW();    
_wenvptr   =   (wchar_t   *)__crtGetEnvironmentStringsW();  

/*初始化main函数的argv参数*/ 
_wsetargv();   
/*初始化环境变量*/
_wsetenvp();   

/*初始化一些C数据,进行C库设置*/
_cinit();

/*调用main函数*/
mainret   =   main(__argc,   __argv,   _environ);   

/*等待main函数返回,然后退出进程*/
  exit(mainret);   
}
--------------------------------------------------------------------------------------------------------------------
下面逐一分析各个阶段:
2. 初始化堆
调用的是_heap_init, 分析该函数:
int __cdecl _heap_init (   int mtflag  /*多线程标志*/  )
{
        /*调用HeapCreate 创见进程堆,*/
        if ( (_crtheap = HeapCreate( mtflag ? 0 : HEAP_NO_SERIALIZE,
                                     BYTES_PER_PAGE, 0 )) == NULL )
            return 0;

        // Pick a heap, any heap
        __active_heap = __heap_select();

        return 1;
}

初始化堆是非常紧急的事情,否则其他的很多事情都做不了,如果堆初始化失败,那么进程就直接退出了。

posted @ 2011-12-26 23:56  Jack204  阅读(971)  评论(0编辑  收藏  举报