[转]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;
}
初始化堆是非常紧急的事情,否则其他的很多事情都做不了,如果堆初始化失败,那么进程就直接退出了。