From 3dc9ff66685b20ac46df6db38311a399934fce5d Mon Sep 17 00:00:00 2001 From: Donjuanplatinum Date: Sat, 28 Mar 2026 17:49:38 +0800 Subject: [PATCH] 1. add link.ld 2. run a naked asm 3. disable the #[test] of rkos-arch --- .cargo/config.toml | 7 ++++ Cargo.lock | 4 ++ crates/rkos-arch/Cargo.toml | 16 ++++++++ crates/rkos-arch/src/lib.rs | 3 ++ crates/rkos-arch/src/x86/link.ld | 70 ++++++++++++++++++++++++++++++++ crates/rkos-arch/src/x86/mod.rs | 1 + crates/rkos/build.rs | 15 +++++++ crates/rkos/src/main.rs | 41 ++++++++++++++++++- 8 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 .cargo/config.toml create mode 100644 crates/rkos-arch/Cargo.toml create mode 100644 crates/rkos-arch/src/lib.rs create mode 100644 crates/rkos-arch/src/x86/link.ld create mode 100644 crates/rkos-arch/src/x86/mod.rs create mode 100644 crates/rkos/build.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..f67bb53 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,7 @@ +[build] +target = "x86_64-unknown-none" + +[target.x86_64-unknown-none] +rustflags = [ + "-C", "relocation-model=static", +] diff --git a/Cargo.lock b/Cargo.lock index 23740b0..54839fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,3 +5,7 @@ version = 4 [[package]] name = "rkos" version = "0.1.0" + +[[package]] +name = "rkos-arch" +version = "0.1.0" diff --git a/crates/rkos-arch/Cargo.toml b/crates/rkos-arch/Cargo.toml new file mode 100644 index 0000000..3d60ad0 --- /dev/null +++ b/crates/rkos-arch/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "rkos-arch" +version = "0.1.0" +edition = "2024" +authors.workspace = true +categories.workspace = true +keywords.workspace = true +license.workspace = true +description.workspace = true +rust-version.workspace = true + +[dependencies] + +[lib] +test = false +doctest = false diff --git a/crates/rkos-arch/src/lib.rs b/crates/rkos-arch/src/lib.rs new file mode 100644 index 0000000..27058bd --- /dev/null +++ b/crates/rkos-arch/src/lib.rs @@ -0,0 +1,3 @@ +#![no_std] +#![no_main] +pub mod x86; diff --git a/crates/rkos-arch/src/x86/link.ld b/crates/rkos-arch/src/x86/link.ld new file mode 100644 index 0000000..a38aec4 --- /dev/null +++ b/crates/rkos-arch/src/x86/link.ld @@ -0,0 +1,70 @@ +OUTPUT_ARCH(i386:x86-64) +ENTRY(_start) + +/* kernel memory map + * + * Physical Address Memory Content + * ---------------- ----------------------- + * 0x100000 -----> +-----------------------+ <--- KERNEL_BASE_ADDRESS + * | .text.entry | (boot scripts) + * |-----------------------| + * | .text | (code) + * |-----------------------| <--- etext (4K aligned) + * | .rodata | (read-only data) + * |-----------------------| <--- erodata (4K aligned) + * | .data | (initialized data) + * |-----------------------| <--- edata (4K aligned) + * | .bss.stack | (kernel stack space) + * |-----------------------| + * | .bss | (uninitialized data) + * |-----------------------| <--- ebss (4K aligned) + * +-----------------------+ <--- ekernel (Heap Start) + * + */ + + +/* x86_64 kernel base address */ +KERNEL_BASE_ADDRESS = 0x100000; + +SECTIONS { + . = KERNEL_BASE_ADDRESS; + + /* kernel code */ + .text : { + stext = .; + *(.text.entry) + *(.text .text.*) + . = ALIGN(4096); + etext = .; + } + + /* kernel rodata */ + .rodata : { + srodata = .; + *(.rodata .rodata.*) + . = ALIGN(4096); + erodata = .; + } + + /* kernel data */ + .data : { + sdata = .; + *(.data .data.*) + . = ALIGN(4096); + edata = .; + } + + /* kernel bss */ + .bss : { + sbss = .; + *(.bss.stack) /* kernel stack */ + *(.bss .bss.*) + *(COMMON) + . = ALIGN(4096); + ebss = .; + } + + /* kernel end */ + . = ALIGN(4096); + ekernel = .; +} diff --git a/crates/rkos-arch/src/x86/mod.rs b/crates/rkos-arch/src/x86/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/crates/rkos-arch/src/x86/mod.rs @@ -0,0 +1 @@ + diff --git a/crates/rkos/build.rs b/crates/rkos/build.rs new file mode 100644 index 0000000..87f3ef8 --- /dev/null +++ b/crates/rkos/build.rs @@ -0,0 +1,15 @@ +use std::{env, path::PathBuf}; +fn main() { + if env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default() == "x86_64" { + let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); + // link scripts in rkos-arch/src/x86 + let link_ld_path = manifest_dir + .parent() + .unwrap() + .join("rkos-arch") + .join("src") + .join("x86") + .join("link.ld"); + println!("cargo:rustc-link-arg=-T{}", link_ld_path.display()); + } +} diff --git a/crates/rkos/src/main.rs b/crates/rkos/src/main.rs index e7a11a9..6e52051 100644 --- a/crates/rkos/src/main.rs +++ b/crates/rkos/src/main.rs @@ -1,3 +1,40 @@ -fn main() { - println!("Hello, world!"); +#![no_std] +#![no_main] + +use core::arch::global_asm; +use core::panic::PanicInfo; + +global_asm!( + r#" + .section .text.entry + .align 4 + + .global multiboot_header + multiboot_header: + + .long 0x1badb002 + .long 0x00010000 + .long -(0x1badb002 + 0x00010000) + + .long multiboot_header + .long stext + .long edata + .long ebss + .long _start + + .global _start + _start: + .code32 + mov eax, 0x4f4f4f4f + mov dword ptr [0xb8000], eax + + .loop: + hlt + jmp .loop + "# +); + +#[panic_handler] +fn panic(_info: &PanicInfo) -> ! { + loop {} }