|
|
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.