Chrome源代码分析之初始化(七)
来源:互联网 发布:航运业现状 知乎 编辑:程序博客网 时间:2024/05/16 15:50
下面看看初始化的代码
整个程序的入口位于文件:
src\chrome\app\chrome_exe_main_win.cc
这里只有一个入口函数wWinMain,标准的win32入口,这个函数很简单,调用CommandLine::Init(0, NULL);初始化命令行的对象,然后启动沙盒服务。
最后创建MainDllLoader对象,MainDllLoader对象只有一个主要作用,动态加载chrome.dll,调用的是Launch函数,并把主模块句柄和沙盒类的指针作为参数传递进去,而浏览器的主要功能都放在了chrome.dll中。
在Launch函数里面,很标准的动态加载dll方法,通过GetProcAddress获取chrome.dll的ChromeMain函数的地址,然后调用这个函数。这样程序流程来到了chrome.dll模块中,ChromeMain函数位于
src\chrome\app\chrome_dll_main.cc
ChromeMain函数主体就比较复杂了,做了一些初始化的工作,然后最重要的是通过调用
std::string process_type =
parsed_command_line.GetSwitchValueASCII(switches::kProcessType);
确定当前进程的类型,如果是“nacl-loader”则启动NaClMain,如果为空则启动BrowserMain,如果是randerer则启动randerer进程,或者Pugin进程等等。
一般情况下自然是启动BrowserMain,进入BrowserMain函数,会进行大量的初始化工作,把chrome的多进程的框架基本搭建起来。
BrowserMain函数位于src\chrome\browser\browser_main.cc中。
大概说说其中的几个关键处理过程:
一,调用MainMessageLoopStart函数创建主线程,并启动主线程的消息循环。
二, 定义BrowserProcessImpl对象并初始化,BrowserProcessImpl对象是一个很重要的组件,它有几个重要功能,创建各种线程,包括IO线程,数据库线程,文件线程,缓存线程,子进程启动线程。另外,创建各种resource_host和rander_host。
三,创建IO线程等几个必须的线程。
四,创建图形界面主窗口并初始化,这里调用的是 if (browser_init.Start(parsed_command_line, FilePath(), profile, &result_code)),创建完毕之后,按照win32的经典模式,启动一个主进程的消息循环,让主进程开始接收并处理系统或者用户信息,这里调用的RunUIMessageLoop(browser_process.get());整个主窗口以及所有相关操作封装在了Browser类里面,关于这个类,以后单独作详细分析。
其他任务还包括初始化toolkit,语言,添加tab项,初始化网络设置,初始化sdch压缩管理对象等等。
由于多进程是chrome的一个重要特征,并且多进程又涉及到进程间通信,这也是chrome的重要组成部分,因此我们先详细分析一下chrome的多进程模型。
- Chrome源代码分析之初始化(七)
- Chrome源代码分析之Renderer进程初始化(十五)
- Chrome源代码分析之Renderer进程初始化续(十六)
- Chrome源代码分析之Renderer进程初始化(十五)
- Chrome源代码分析之socket(一)
- Chrome源代码分析之socket(二)
- Chrome源代码分析之socket(五)
- Chrome源代码分析之socket(六)
- Chrome源代码分析之IPC(九)
- Nginx源代码分析之初始化(二)
- Nginx源代码分析之初始化(三)
- Chrome源代码分析之进程和线程模型(三)
- Chrome源代码分析之进程和线程模型(四)
- Chrome源代码分析之进程模型(八)
- Chrome源代码分析之IPC续(十)
- Chrome源代码分析之线程模型(十一)
- Chrome源代码分析之线程模型续(十二)
- Chrome源代码分析之线程模型续1(十三)
- AI middleware
- Android 之开机启动一个服务
- 前辈给的:.ACM常用算法及练习
- Volume 0.Getting Started 489 - Hangman Judge
- Unable to find 'struts.multipart.saveDir' property setting
- Chrome源代码分析之初始化(七)
- 容易出问题的Struts2在web.xml路径拦截配置
- codeblock
- 最基本的servlet配置
- span 的宽度css设置
- Linux 下安装jdk和ant
- linux的clientmqueue问题和No space left on device
- How to Activate the Drop Down Menu in MOSS 2010 Sites
- Spring定时器的使用-多实例下定时重建索引