From a7620d6c707bc440d2e458eb5de40a5effe14ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E7=92=9C?= <113148619+donjuanplatinum@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:54:21 +0800 Subject: [PATCH 1/5] 1. add link.ld 2. run a naked asm 3. disable the #[test] of rkos-arch (#2) --- .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 {} } From d0d79b5d255b592a2fcedb5e06ffef5794797cf3 Mon Sep 17 00:00:00 2001 From: Donjuanplatinum Date: Sat, 28 Mar 2026 18:03:26 +0800 Subject: [PATCH 2/5] fix ci --- crates/rkos/Cargo.toml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/rkos/Cargo.toml b/crates/rkos/Cargo.toml index 530d65a..79b1255 100644 --- a/crates/rkos/Cargo.toml +++ b/crates/rkos/Cargo.toml @@ -13,4 +13,10 @@ rust-version.workspace = true # [lints] -# workspace = true \ No newline at end of file +# workspace = true + + +[[bin]] +name = "rkos" +path = "src/main.rs" +test = false From 46117f1e9a6175baf4f2d00422968f6d8b654d9c Mon Sep 17 00:00:00 2001 From: Donjuanplatinum Date: Sat, 28 Mar 2026 18:06:54 +0800 Subject: [PATCH 3/5] fix ci --- .github/workflows/rust-test.yml | 2 +- crates/rkos-arch/Cargo.toml | 2 ++ crates/rkos/Cargo.toml | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index 451a68a..6bd3b73 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -45,7 +45,7 @@ jobs: - name: Format run: cargo fmt --all -- --check - name: Lint - run: cargo clippy --all-targets --all-features -- -D warnings + run: cargo clippy --all-targets --lib --bins -- -D warnings tests: runs-on: ubuntu-latest diff --git a/crates/rkos-arch/Cargo.toml b/crates/rkos-arch/Cargo.toml index 3d60ad0..29a19b7 100644 --- a/crates/rkos-arch/Cargo.toml +++ b/crates/rkos-arch/Cargo.toml @@ -14,3 +14,5 @@ rust-version.workspace = true [lib] test = false doctest = false + +[features] diff --git a/crates/rkos/Cargo.toml b/crates/rkos/Cargo.toml index 79b1255..4a4d212 100644 --- a/crates/rkos/Cargo.toml +++ b/crates/rkos/Cargo.toml @@ -20,3 +20,5 @@ rust-version.workspace = true name = "rkos" path = "src/main.rs" test = false + + From 86eaaabe7b48b1bfd620659a968b27bf3d41bcbd Mon Sep 17 00:00:00 2001 From: Donjuanplatinum Date: Sat, 28 Mar 2026 18:09:09 +0800 Subject: [PATCH 4/5] fix ci --- .github/workflows/rust-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index 6bd3b73..3da7c1e 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -45,7 +45,7 @@ jobs: - name: Format run: cargo fmt --all -- --check - name: Lint - run: cargo clippy --all-targets --lib --bins -- -D warnings + run: cargo clippy --lib --bins -- -D warnings tests: runs-on: ubuntu-latest From db264bdc29bdfb50ab3d55be9ed60f518d3f024a Mon Sep 17 00:00:00 2001 From: Donjuanplatinum Date: Sat, 28 Mar 2026 18:10:22 +0800 Subject: [PATCH 5/5] fix ci --- crates/rkos-arch/src/x86/link.ld | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/crates/rkos-arch/src/x86/link.ld b/crates/rkos-arch/src/x86/link.ld index a38aec4..ade506b 100644 --- a/crates/rkos-arch/src/x86/link.ld +++ b/crates/rkos-arch/src/x86/link.ld @@ -1,27 +1,6 @@ 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;