戻る
題名
目次
ブートローダ記述等
メモリの確保
EFI_PHYSICAL_ADDRESS buffer; // 確保したメモリのアドレスを格納する変数 UINTN pages = (file_size + 4095) / 4096; // ファイルサイズを4KBページ単位に切り上げ // UEFIにメモリ確保を依頼 EFI_STATUS status = gBS->AllocatePages( AllocateAnyPages, // 空いている場所ならどこでもOK EfiLoaderCode, // 「実行コード用」として確保(実行権限がつく) pages, // 必要なページ数 &buffer // 確保されたアドレスがここに書き込まれる );
ファイルの読み込みからエントリポイントへ
// 1. ファイルサイズ取得 // 2. メモリ確保 gBS->AllocatePages(AllocateAnyPages, EfiLoaderCode, pages, &buffer); // 3. ファイルをメモリへロード file->Read(file, &size, buffer); // 4. エントリポイントへジャンプ void (*entry)() = (void (*)())(buffer + header->entry_point); entry();
EFI_FILE_PROTOCOL *Root; EFI_FILE_PROTOCOL *File; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem; // 1. ファイルシステムにアクセス(通常は起動したメディア) gBS->LocateProtocol(&gEfiSimpleFileSystemProtocolGuid, NULL, (VOID**)&FileSystem); FileSystem->OpenVolume(FileSystem, &Root); // 2. ファイルを「読み込みモード」で開く Root->Open(Root, &File, L"kernel.elf", EFI_FILE_MODE_READ, 0); // 3. ファイルサイズを取得 UINTN FileSize = 0; EFI_FILE_INFO *FileInfo; UINTN InfoSize = sizeof(EFI_FILE_INFO) + 200; // 適度な余裕を持つ gBS->AllocatePool(EfiLoaderData, InfoSize, (VOID**)&FileInfo); File->GetInfo(File, &gEfiFileInfoGuid, &InfoSize, FileInfo); FileSize = FileInfo->FileSize; // 4. メモリを確保して読み込む void* buffer; gBS->AllocatePages(AllocateAnyPages, EfiLoaderCode, (FileSize + 4095) / 4096, (EFI_PHYSICAL_ADDRESS*)&buffer); File->Read(File, &FileSize, buffer); // 完了したらファイルを閉じる File->Close(File);
トップへ戻る
トップへ戻る
トップへ戻る
トップへ戻る
トップへ戻る
トップへ戻る