fuchsia誘導プロセス分析

1830 ワード

fuchsiaはx 64に対してuefiを用いて起動し、以下に起動過程を分析する.
uefiのブートエントリはefi_main、これはアプリケーションフェーズのエントリです
339 EFIAPI efi_status efi_main(efi_handle img, efi_system_table* sys) {
340     xefi_init(img, sys);
341     gConOut->ClearScreen(gConOut);
342 
343     uint64_t mmio;
344     if (xefi_find_pci_mmio(gBS, 0x0C, 0x03, 0x30, &mmio) == EFI_SUCCESS) {
345         char tmp[32];
346         sprintf(tmp, "%#" PRIx64 , mmio);
347         cmdline_set("xdc.mmio", tmp);
348     }
349 
350     // Load the cmdline
351     size_t csz = 0;
352     char* cmdline_file = xefi_load_file(L"cmdline", &csz, 0);
353     if (cmdline_file) {
354         cmdline_append(cmdline_file, csz);
355     }
356 
357     efi_graphics_output_protocol* gop;
358     efi_status status = gBS->LocateProtocol(&GraphicsOutputProtocol, NULL,
359                                             (void**)&gop);


まず340行xefi_initは4つのグローバル変数gSys=sysを初期化しました//efi_system_table gImg = img;//efi_handle img gBS = sys->BootServices; gConOut = sys->ConOut;
341行クリーンアップ操作343はusb 3.0デバイスのioマッピングアドレスを見つけ、関数のパラメータについてclass codeの紹介参照https://blog.csdn.net/pankul/article/details/8603632344-348行cmdline_setは見つけたアドレスをkey xdc.に従う.mmioは353-354行格納してcmdlineファイルを読み出し、内容をkey value形式で格納する
370-373行出力コンソールの明るさと色、返却bootloaderバージョン文字を設定
次に390-395行分1 mから6 mメモリをkernel空間に割り当て、割り当てに失敗すると6 mではなく3 mを割り当てる.
413-432行、NICが使用可能かどうかを検出し、netboot_に返信します.nodename 434行印刷cmdline 440行ロードzedboot.bin 441行検証zedboot.binファイル、そしてファイルのタイプを確定して、IMAGE_COMBOは、同じミラーにkernelとramdiskが混在するタイプを表します.
482行ネットワークインタフェースがない場合はzedbootを使用して起動する必要があります.zedboot kernelが存在しない場合はkernelを使用して起動し、3つが存在しない場合はfailプロセスへの起動を続行できません.
490-573行は主にいくつかのユーザー操作のオプションを設定し、bキーを押して起動メニューを印刷し、nキーでネットワーク起動を実行し、mキーでzedbootまたはローカル起動を実行し、zでzedbootを実行する.