Firefox OS启动过程分析-b2g进程启动
来源:互联网 发布:uncomtrade数据库 编辑:程序博客网 时间:2024/06/05 08:11
b2g启动时,运行”/system/b2g/b2g”,入口在”gecko/b2g/app/B2GLoader.cpp”中,如下:
intmain(int argc, const char* argv[]){ /** * Reserve file descriptors before loading static data. */ FdArray reservedFds; ReserveFileDescriptors(reservedFds); /* * Before fork(), libxul and static data of Gecko are loaded for * sharing. */ bool ok = LoadStaticData(argc, argv); if (!ok) { return 255; } return RunProcesses(argc, argv, reservedFds);
代码执行流程如下所示:
main() (b2g/app/B2GLoader.cpp)||-ReserveFileDescriptors||-LoadStaticData||-RunProcesses | |-fork | |-XRE_ProcLoaderServiceRun (child(nuwa) process) | |-b2g_main (parent(b2g) process) (b2g/app/nsBrowserApp.cpp) | |-android::ProcessState::self()->startThreadPool(); | |-(void)setsid(); | |-do_main | |-mozilla::StartBootAnimation(); | |-XRE_main | |-XREMain::XRE_main | |-new ScopedAppData(aAppData); | |-XREMain::XRE_mainInit | |-XREMain::XRE_mainStartup | |-mScopedXPCOM = MakeUnique<ScopedXPCOMStartup>(); | |-mScopedXPCOM->Initialize(); (toolkit/xre/nsAppRunner.cpp) | | | |-NS_InitXPCOM2 (xpcom/build/XPCOMInit.cpp) | | | |-sMessageLoop = new MessageLoopForUI(MessageLoop::TYPE_MOZILLA_UI); | | | |-ioThread = MakeUnique<BrowserProcessSubThread>(BrowserProcessSubThread::IO); | |-ioThread->StartWithOptions | | | |-nsThreadManager::get()->Init(); | | | |-nsTimerImpl::Startup(); | | | |-nsComponentManagerImpl::gComponentManager = new nsComponentManagerImpl(); | | | |-nsCycleCollector_init | | | |-nsCycleCollector_startup | | | |-JS_Init | | | |-nsComponentManagerImpl::gComponentManager->Init();(xpcom/components/nsComponentManager.cpp) | | | | | |-nsComponentManagerImpl::InitializeStaticModules() | | | | | |-RegisterModule(...) | | | | | |-greOmnijar = mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE); | | | | | |-cl->location.Init(greOmnijar, "chrome.manifest"); | | | | | |-nsComponentManagerImpl::RereadChromeManifests | | | | | |-nsComponentManagerImpl::RegisterManifest | | | | | |-DoRegisterManifest | | | | | |-ParseManifest | | | | | |-... | | | | | |-nsComponentManagerImpl::ManifestContract | | | |-XPTInterfaceInfoManager::GetSingleton(); | | | |-nsDirectoryService::gService->RegisterCategoryProviders(); | | | |-SharedThreadPool::InitStatics(); | | | |-AbstractThread::InitStatics(); | | | |-mozilla::scache::StartupCache::GetSingleton(); | | | |-mozilla::AvailableMemoryTracker::Activate(); | | | |-NS_CreateServicesFromCategory(...) | | | |-mozilla::HangMonitor::Startup(); | | | |-mozilla::BackgroundHangMonitor::Startup(); | | | |-sMainHangMonitor = new mozilla::BackgroundHangMonitor | |-XREMain::XRE_mainRun() | |-mozilla::ipc::ProcLoaderClientGeckoInit(); | |-mScopedXPCOM->SetWindowCreator(mNativeApp); | |-startupNotifier->Observe(nullptr, APPSTARTUP_TOPIC, nullptr); | |-mDirProvider.DoStartup(); | |-cmdLine->Init(...) | |-obsService->NotifyObservers(cmdLine, "command-line-startup", nullptr); | |-appStartup->CreateHiddenWindow(); | |-obsService->NotifyObservers(nullptr, "final-ui-startup", nullptr); | |-cmdLine->Run(); (toolkit/components/commandlines/nsCommandLine.cpp) | | | |- nsCommandLine::EnumerateValidators | | | |-nsCommandLine::EnumerateHandlers | | | |-EnumRun | | | |-nsICommandLineHandler->Handle (first page will be loaded in here) | |-mNativeApp->Enable(); | |-appStartup->Run(); (toolkit/components/startup/nsAppStartup.cpp) | |-mAppShell->Run(); (widget/gonk/nsAppShell.cpp->widget/nsBaseAppShell.cpp) | |-MessageLoop::current()->Run(); // run forever~~~~~
b2g进程启动中,会做以下几件事:
1. 在加载库文件之前保留5个文件描述符(从STDERR_FILENO+1开始)
FdArray reservedFds; ReserveFileDescriptors(reservedFds);
2.加载进程间能共享的各种数据(主要加载libxul等各种共享库,从Omnijar文件中加载各种模块的xpt信息),这样可以节约些内存。
bool ok = LoadStaticData(argc, argv);
3.开始fork进程。父亲就是b2g进程,儿子就是nuwa进程(后续再讲)。其中b2g进程具有系统root权限,负责处理系统的io,显示,操作底层硬件等。
在b2g进程中运行后,需要初始化xpcom,即调用:
rv = NS_InitXPCOM2(&mServiceManager,gDirServiceProvider->GetAppDir(), gDirServiceProvider);
最后,b2g进程会进入一个message loop中,等待处理各种请求:
appStartup->Run();
Firefox OS中进程可以分为三类:b2g进程,nuwa进程,以及content进程。其中content进程都是由nuwa进程生成的(当然在nuwa进程未ready,但又需要fork进程的时候,有可能会由b2g进程直接生成)。
nuwa进程是如何创建新进程?b2g是如何加载第一个程序(system)的?后续文章中进行讲解。
0 0
- Firefox OS启动过程分析-b2g进程启动(序)
- Firefox OS启动过程分析-b2g进程启动
- Firefox OS启动过程分析-nuwa进程启动
- Firefox OS启动过程分析-nuwa创建新进程
- Firefox OS启动过程分析-序
- Firefox OS启动过程分析-system应用启动
- Firefox OS启动过程分析-Shell入口
- android启动过程分析--启动init进程
- android启动过程分析--启动init进程
- android启动过程分析--启动init进程
- Hadoop进程启动过程分析
- Z/OS 启动过程
- Busybox init进程启动过程分析
- Busybox init进程启动过程分析
- Busybox init进程启动过程分析
- Busybox init进程启动过程分析
- Zygote进程启动过程的源代码分析
- System Server进程启动过程源码分析
- 动效设计整理
- View(一)
- [LeetCode] Container with most water
- 一些基础算法(1)
- C#中yield return用法分析
- Firefox OS启动过程分析-b2g进程启动
- 创建桌面快捷方式
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- IOS常用代码
- System.ServiceModel.AddressAlreadyInUseException: HTTP 无法注册 URL http://+:80
- leetcode:Largest Number
- (一)学习jms——基本实例
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- Webrtc知识分享——前言