SimpleKernel  0.0.1
load_elf.h
Go to the documentation of this file.
1 
17 #ifndef SIMPLEKERNEL_LOAD_ELF_H
18 #define SIMPLEKERNEL_LOAD_ELF_H
19 
20 #include <array>
21 #include <elf.h>
22 #include <span>
23 #include <utility>
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 #include "efi.h"
30 #include "efilib.h"
31 
32 #ifdef __cplusplus
33 }
34 #endif
35 
39 class Graphics {
40 public:
44  Graphics();
45 
49  ~Graphics() = default;
50 
53  Graphics(const Graphics &) = delete;
54  Graphics(Graphics &&) = delete;
55  auto operator=(const Graphics &) -> Graphics & = delete;
56  auto operator=(Graphics &&) -> Graphics & = delete;
58 
65  void set_mode(
66  EFI_GRAPHICS_PIXEL_FORMAT _format = PixelBlueGreenRedReserved8BitPerColor,
67  uint32_t _width = DEFAULT_WIDTH, uint32_t _height = DEFAULT_HEIGHT) const;
68 
72  void print_info() const;
73 
74 private:
77  static constexpr const uint32_t DEFAULT_WIDTH = 1920;
78  static constexpr const uint32_t DEFAULT_HEIGHT = 1080;
81  EFI_GRAPHICS_OUTPUT_PROTOCOL *gop = nullptr;
82 };
83 
87 class Memory {
88 public:
92  Memory();
93 
97  ~Memory() = default;
98 
101  Memory(const Memory &) = delete;
102  Memory(Memory &&) = delete;
103  auto operator=(const Memory &) -> Memory & = delete;
104  auto operator=(Memory &&) -> Memory & = delete;
106 
110  void print_info();
111 
112 private:
115  uint64_t desc_count = 0;
116  EFI_MEMORY_DESCRIPTOR *memory_map = nullptr;
117  uint64_t map_key = 0;
118  uint64_t desc_size = 0;
119  uint32_t desc_version = 0;
121 
125  void flush_desc();
126 };
127 
131 class Elf {
132 public:
137  explicit Elf(wchar_t *_kernel_image_filename);
138 
142  ~Elf();
143 
146  Elf(const Elf &) = delete;
147  Elf(Elf &&) = delete;
148  auto operator=(const Elf &) -> Elf & = delete;
149  auto operator=(Elf &&) -> Elf & = delete;
151 
156  [[nodiscard]] auto load_kernel_image() const -> uint64_t;
157 
161  auto load() const -> uintptr_t;
162 
163 private:
166  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *file_system_protocol = nullptr;
167  EFI_FILE *root_file_system = nullptr;
169  EFI_FILE *elf = nullptr;
171  size_t elf_file_size = 0;
173  void *elf_file_buffer = nullptr;
175  std::span<uint8_t> file = {};
176  Elf64_Ehdr ehdr = {};
177  std::span<Elf64_Phdr> phdr = {};
178  std::span<Elf64_Shdr> shdr = {};
180  static constexpr const size_t SECTION_BUF_SIZE = 1024;
182  std::array<uint8_t, SECTION_BUF_SIZE> shstrtab_buf = {};
184 
189  [[nodiscard]] auto get_file_size() const -> size_t;
190 
195  [[nodiscard]] auto check_elf_identity() const -> bool;
196 
200  void get_ehdr();
201 
205  void print_ehdr() const;
206 
210  void get_phdr();
211 
215  void print_phdr() const;
216 
220  void get_shdr();
221 
225  void print_shdr() const;
226 
231  void load_sections(const Elf64_Phdr &_phdr) const;
232 
236  void load_program_sections() const;
237 };
238 
239 #endif /* SIMPLEKERNEL_LOAD_ELF_H */
Definition: load_elf.h:131
Elf(wchar_t *_kernel_image_filename)
Definition: load_elf.cpp:51
auto operator=(const Elf &) -> Elf &=delete
auto check_elf_identity() const -> bool
Definition: load_elf.cpp:210
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL * file_system_protocol
Definition: load_elf.h:166
void get_shdr()
Definition: load_elf.cpp:530
void load_sections(const Elf64_Phdr &_phdr) const
Definition: load_elf.cpp:815
~Elf()
Definition: load_elf.cpp:126
auto get_file_size() const -> size_t
Definition: load_elf.cpp:203
EFI_FILE * root_file_system
Definition: load_elf.h:167
size_t elf_file_size
elf 文件大小
Definition: load_elf.h:171
void print_shdr() const
Definition: load_elf.cpp:539
void get_phdr()
Definition: load_elf.cpp:390
void print_ehdr() const
Definition: load_elf.cpp:233
void load_program_sections() const
Definition: load_elf.cpp:885
Elf(const Elf &)=delete
std::span< Elf64_Phdr > phdr
Definition: load_elf.h:177
Elf(Elf &&)=delete
void * elf_file_buffer
elf 文件内容缓冲区
Definition: load_elf.h:173
std::span< Elf64_Shdr > shdr
Definition: load_elf.h:178
auto load_kernel_image() const -> uint64_t
Definition: load_elf.cpp:141
std::array< uint8_t, SECTION_BUF_SIZE > shstrtab_buf
shstrtab 缓冲
Definition: load_elf.h:182
EFI_FILE * elf
elf 文件指针
Definition: load_elf.h:169
Elf64_Ehdr ehdr
Definition: load_elf.h:176
auto operator=(Elf &&) -> Elf &=delete
auto load() const -> uintptr_t
Definition: load_elf.cpp:181
std::span< uint8_t > file
elf 文件访问
Definition: load_elf.h:175
void get_ehdr()
Definition: load_elf.cpp:229
static constexpr const size_t SECTION_BUF_SIZE
section 缓冲区大小
Definition: load_elf.h:180
void print_phdr() const
Definition: load_elf.cpp:395
static constexpr const uint32_t DEFAULT_HEIGHT
Definition: load_elf.h:78
void set_mode(EFI_GRAPHICS_PIXEL_FORMAT _format=PixelBlueGreenRedReserved8BitPerColor, uint32_t _width=DEFAULT_WIDTH, uint32_t _height=DEFAULT_HEIGHT) const
Definition: graphics.cpp:37
EFI_GRAPHICS_OUTPUT_PROTOCOL * gop
Definition: load_elf.h:81
~Graphics()=default
auto operator=(Graphics &&) -> Graphics &=delete
Graphics(const Graphics &)=delete
Graphics(Graphics &&)=delete
auto operator=(const Graphics &) -> Graphics &=delete
void print_info() const
Definition: graphics.cpp:78
static constexpr const uint32_t DEFAULT_WIDTH
Definition: load_elf.h:77
Graphics()
Definition: graphics.cpp:22
uint64_t desc_count
Definition: load_elf.h:115
void flush_desc()
Definition: memory.cpp:22
~Memory()=default
auto operator=(Memory &&) -> Memory &=delete
EFI_MEMORY_DESCRIPTOR * memory_map
Definition: load_elf.h:116
Memory()
Definition: memory.cpp:30
uint32_t desc_version
Definition: load_elf.h:119
void print_info()
Definition: memory.cpp:32
Memory(const Memory &)=delete
uint64_t desc_size
Definition: load_elf.h:118
Memory(Memory &&)=delete
auto operator=(const Memory &) -> Memory &=delete
uint64_t map_key
Definition: load_elf.h:117