fuchsia學習_啓動過程

KernelZircon的啓動:首先運行boot-shim.ld的ENTRY(_start);//boot-shim.S的FUNCTION(_start);//start.S彙編代碼,之後到lk_main();
~~//內調zircon/kernel/top/main.cc的lk_main();
~~//創建"bootstrap2"線程,從init.cc的lk_init_level(),參數"global_prng_thread_safe";//內調global_prng.cc的BecomeThreadSafe();
~~//線程"bootstrap2"創建成功後執行bootstrap2()函數;
~~//創建userboot(內核線程),main.cc的lk_main();//內調init.h的lk_primary_cpu_init_level(),參數LK_INIT_LEVEL_LAST;//內調init.cc的lk_init_level(),遍歷找到"userboot";
~~//內調userboot.cc的userboot_init();//創建,啓動;
~~//運行userboot(由內核創建;創建bootsvc進程),內調userboot/start.cc的bootstrap();//內調userboot/option.cc的parse_options();之後調用userboot/loader-service.cc的LoaderService::Serve();
~~//轉到HandleRequest();//轉到LoadObject();//轉到TryLoadObject();//內調userboot/bootfs.cc的bootfs_open(),傳入參數"bin/bootsvc";
~~//內調userboot/start.cc的bootstrap(),創建進程"bin/bootsvc",創建線程;//轉到load_child_process();//內調userboot/userboot-elf.cc的elf_load_bootfs();
~~//運行bootsvc進程(由userboot進程創建;創建devmgr進程),bootsvc/main.cc的main();
~~//創建devmgr進程(由bootsvc創建),bootsvc/main.cc的main();//內調LaunchNextProcess(),傳入參數"bin/component_manager";
~~//運行devmgr進程,zircon/system/core/devmgr/fshost/main.cc的main();//內調fs-manager.cc的FsManager::WatchExit();
~~//創建driver_manager進程(由bootsvc創建)//...//devmgr-launcher/launcher.cc的Launch();//新建進程,傳入"/boot/bin/driver_manager";
~~//運行driver_manager進程,driver_manager/main.cc的main();//內調driver_manager/system_instance.cc的start_console_shell();創建進程;
~~//線程運行,driver_manager/system_instance.cc的console_starter();//轉到SystemInstance::ConsoleStarter();
~~//內調driver_manager/fdio.cc的DevmgrLauncher::LaunchWithLoader(),傳入參數"/boot/bin/svchost","/boot/bin/netsvc","/boot/bin/sh","/boot/bin/miscsvc";
~~//"service-starter"運行(由driver_manager/main.cc的main()創建),運行driver_manager/system_instance.cc的SystemInstance::service_starter();//內調SystemInstance::ServiceStarter();
~~//driver的初始化(由driver_manager進程發起),driver_manager/main.cc的main();//內調system_instance.cc的PrepareProxy();//內調coordinator.cc的Coordinator::NewDevhost();
~~//轉到dc_launch_devhost(),傳入參數"driver_host:sys","driver_host:root","driver_host:misc","driver_host:pci",參數由coordinator.cc的InitCoreDevices()初始化;
~~//"driver_host:sys"進程運行,driver_host/devhost.cc的CreateDevice();//內調,傳入參數"/boot/driver/platform-bus.so";//轉到dh_find_driver(),dlopen_vmo(),dlsym();
~~//內調devhost.h的CreateOp();//內調create(),執行驅動so庫的create();
~~//驅動so庫執行,platform/platform-bus.cc的platform_bus_create();//內調PlatformBus::Init();//內調PlatformBus::GetBoardInfo();
====
處理服務進程的crsah:啓動時svchost/svchost.cc的main();//內調svchost/crashsvc.cc的start_crashsvc();//內調thrd_create_with_name(),傳入crash_svc函數地址;
~~//當出現服務crash時,svchost/crashsvc.cc的crash_svc();//內調channel.h的wait_one(),read();
添加服務:garnet/examples/fidl/echo_server_cpp/echo_server_app.cc的構造函數;//內調sdk/lib/sys/cpp/outgoing_directory.cc的AddPublicService();
~~//內調outgoing_directory.h的AddEntry();其中,根是通過PseudoDir->Lookup("svc")獲取;//內核zircon/system/ulib/fs/pseudo_dir.cc的AddEntry();//內調EntryByNameMap的insert();
獲取服務:garnet/examples/fidl/echo_client_cpp/echo_client_app.cc的Start();
~~//內調component_context.h的Create(),ComponentContext的svc();//service_directory.cc的ServiceDirectory::Connect();
~~//內調zircon/system/ulib/fdio/remoteio.cc的fdio_service_connect_at();//內調local-filesystem.cc的fdio_namespace::Open();
~~//轉到fdio_namespace::WalkLocked();//內核zircon/system/ulib/fs/pseudo_dir.cc中PseudoDir繼承LocalVnode的Lookup();//內調EntryByNameMap的find();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章