This commit is contained in:
mii443
2025-07-01 19:32:36 +09:00
parent 96efe350eb
commit 830b95bad4
4 changed files with 73 additions and 9 deletions

View File

@@ -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"

View File

@@ -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"

View File

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

View File

@@ -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();