|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2022 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // ローダ ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "object.h" ! 14: #include "iodevstream.h" ! 15: ! 16: class LoadInfo; ! 17: class MainRAMDevice; ! 18: ! 19: // RAM から呼ばれてファイルを読み込むだけのヘルパー。 ! 20: class BootLoader : public Object ! 21: { ! 22: using inherited = Object; ! 23: public: ! 24: BootLoader(MainRAMDevice *ram_); ! 25: ~BootLoader() override; ! 26: ! 27: // path で指定されたホストファイルをロードする ! 28: bool LoadFromFile(LoadInfo *); ! 29: // data, size で指定されたバッファをロードする ! 30: bool LoadFromData(LoadInfo *); ! 31: ! 32: private: ! 33: bool LoadGzFile(LoadInfo *); ! 34: bool Load_aout(LoadInfo *); ! 35: bool Load_elf32(LoadInfo *); ! 36: bool Load_elf32_exec(LoadInfo *); ! 37: bool Load_elf32_rel(LoadInfo *); ! 38: bool Load_elf32_sym(LoadInfo *, std::string&); ! 39: void WriteFromHost(IODeviceStream&, const void *, int); ! 40: void readfile_global(uint32, const void *, int); ! 41: ! 42: MainRAMDevice *ram {}; ! 43: }; ! 44: ! 45: // 実行ファイルを読み込む際の受け渡しパラメータ ! 46: class LoadInfo { ! 47: public: ! 48: LoadInfo(); ! 49: LoadInfo(const char *path_); ! 50: LoadInfo(const char *path_, const uint8 *data_, size_t size_); ! 51: ! 52: // ファイルから読み込む時はファイルパスを指定する。 ! 53: // メモリから読み込む時はエラーの時に表示される名前を指定する。 ! 54: const char *path {}; ! 55: ! 56: // データ本体とそのサイズ。メモリから読み込む時には指定する。 ! 57: // ファイルから読み込む時は内部で使用。 ! 58: const uint8 *data {}; ! 59: size_t size {}; ! 60: ! 61: // RAM にロードした先頭アドレス。 ! 62: uint32 start {}; ! 63: ! 64: // RAM にロードしたファイルのエントリポイント。 ! 65: uint32 entry {}; ! 66: ! 67: // RAM にロードしたカーネル本体の後のシンボル開始アドレス。 ! 68: uint32 sym {}; ! 69: ! 70: // RAM にロードした最終アドレス(の次のアドレス)。 ! 71: uint32 end {}; ! 72: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.