load elf
This commit is contained in:
38
nel_os_bootloader/Cargo.lock
generated
38
nel_os_bootloader/Cargo.lock
generated
@@ -26,6 +26,17 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
|
||||
|
||||
[[package]]
|
||||
name = "goblin"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e961b33649994dcf69303af6b3a332c1228549e604d455d61ec5d2ab5e68d3a"
|
||||
dependencies = [
|
||||
"log",
|
||||
"plain",
|
||||
"scroll",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.27"
|
||||
@@ -36,11 +47,18 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
|
||||
name = "nel_os_bootloader"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"goblin",
|
||||
"log",
|
||||
"uefi",
|
||||
"x86",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "plain"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.95"
|
||||
@@ -88,6 +106,26 @@ dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scroll"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add"
|
||||
dependencies = [
|
||||
"scroll_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scroll_derive"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22fc4f90c27b57691bbaf11d8ecc7cfbfe98a4da6dbe60226115d322aa80c06e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.104"
|
||||
|
||||
@@ -4,6 +4,7 @@ version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
goblin = { version = "0.10.0", features = ["elf32", "elf64", "endian_fd"], default-features = false }
|
||||
log = "0.4.27"
|
||||
uefi = { version = "0.35.0", features = ["logger", "panic_handler", "alloc"] }
|
||||
x86 = "0.52.0"
|
||||
|
||||
@@ -7,6 +7,7 @@ mformat -i fat.img -f 1440 ::
|
||||
mmd -i fat.img ::/EFI
|
||||
mmd -i fat.img ::/EFI/BOOT
|
||||
mcopy -i fat.img "$EFI_BINARY" ::/EFI/BOOT/BOOTX64.EFI
|
||||
mcopy -i fat.img ../nel_os_kernel/target/x86_64-nel_os/release/nel_os_kernel.elf ::/nel_os_kernel.elf
|
||||
|
||||
mkdir iso
|
||||
cp fat.img iso
|
||||
|
||||
@@ -3,14 +3,20 @@
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
use alloc::{boxed::Box, vec};
|
||||
use core::arch::asm;
|
||||
use goblin::elf;
|
||||
use uefi::{
|
||||
allocator::Allocator,
|
||||
boot::{MemoryType, ScopedProtocol},
|
||||
mem::memory_map::MemoryMap,
|
||||
prelude::*,
|
||||
println,
|
||||
proto::media::{file::Directory, fs::SimpleFileSystem},
|
||||
proto::media::{
|
||||
file::{Directory, File, FileAttribute, FileInfo, FileMode},
|
||||
fs::SimpleFileSystem,
|
||||
},
|
||||
CStr16,
|
||||
};
|
||||
|
||||
#[global_allocator]
|
||||
@@ -31,6 +37,25 @@ fn get_fs() -> Directory {
|
||||
fs.open_volume().unwrap()
|
||||
}
|
||||
|
||||
fn read_kernel(name: &CStr16) -> Box<[u8]> {
|
||||
let mut root = get_fs();
|
||||
let kernel_file_info = root
|
||||
.open(name, FileMode::Read, FileAttribute::empty())
|
||||
.unwrap();
|
||||
let mut kernel_file = kernel_file_info.into_regular_file().unwrap();
|
||||
|
||||
let file_size = kernel_file
|
||||
.get_boxed_info::<FileInfo>()
|
||||
.unwrap()
|
||||
.file_size();
|
||||
let mut buf = vec![0; file_size as usize];
|
||||
|
||||
let read_size = kernel_file.read(&mut buf).unwrap();
|
||||
println!("kernel size: {}", read_size);
|
||||
|
||||
buf.into_boxed_slice()
|
||||
}
|
||||
|
||||
#[entry]
|
||||
fn main() -> Status {
|
||||
uefi::helpers::init().unwrap();
|
||||
@@ -51,15 +76,14 @@ fn main() -> Status {
|
||||
println!(" PhysStart: {:?}", entry.phys_start);
|
||||
}
|
||||
|
||||
let mut root = get_fs();
|
||||
let kernel = read_kernel(cstr16!("nel_os_kernel.elf"));
|
||||
|
||||
println!("Root directory entries:");
|
||||
while let Ok(Some(file_info)) = root.read_entry_boxed() {
|
||||
if file_info.is_directory() {
|
||||
println!("Directory: {}", file_info.file_name());
|
||||
} else {
|
||||
println!("File: {}", file_info.file_name());
|
||||
}
|
||||
let elf = elf::Elf::parse(&kernel).expect("Failed to parse kernel");
|
||||
|
||||
println!("Entry point: {}", elf.entry);
|
||||
|
||||
unsafe {
|
||||
let _ = uefi::boot::exit_boot_services(Some(MemoryType::LOADER_DATA));
|
||||
}
|
||||
|
||||
hlt_loop();
|
||||
|
||||
Reference in New Issue
Block a user