fuchsia引导过程分析

fuchsia对于x64使用uefi进行引导,下面分析引导过程

uefi的引导入口为efi_main, 这是application阶段的入口

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 初始化了四个全局变量
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/8603632
344-348行 cmdline_set 将找到的地址按照key xdc.mmio 存储起来
353-354 行 读取cmdline文件,并将内容以key value形式存储起来

370-373行设置输出控制台亮度和颜色, 回执bootloader版本文字

接下来390-395行分从1m开始的地方分配6m内存,用于kernel空间,如果分配失败,就不在分配6m,而分配3m

413-432行 , 检测网卡是否可用,之后回执 netboot_nodename
434行打印 cmdline
440行 加载zedboot.bin
441行 验证zedboot.bin文件,并且确定该文件的的类型, IMAGE_COMBO 代表混合类型,也就是kernel和ramdisk在同一个镜像中

482行 如果没有网络接口, 则需要使用zedboot启动,如果不存在zedboot kernel也可以,使用kernel启动, 如果三者都没有则无法继续引导, 到fail流程

490-573行主要设置了几个用户操作的选项,其中 按b键 打印启动菜单,n键执行网络启动, m键 执行zedboot或者本地启动, z执行zedboot

你可能感兴趣的:(fuchsia引导过程分析)