diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..d5f3114 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,9 @@ +[build] +target = "riscv64gc-unknown-none-elf" + +[target.riscv64gc-unknown-none-elf] +rustflags = [ + "-Cforce-frame-pointers=yes" +] +# cargo automatically use ELF's path as the first argument +runner = "tools/run_qemu.sh" diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index bd45416..5564d85 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -16,5 +16,5 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@v8 - name: kernel test - run: nix develop --command bash -c "cd os && make run" + run: nix develop --command bash -c "make run" diff --git a/.gitignore b/.gitignore index b618fef..e42409c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,12 @@ /.nix-tools /.direnv /os/src/linker.ld +/kernel/target + + +# Added by cargo +# +# already existing elements were commented out + +#/target +/kernel/src/link_app.S diff --git a/os/Cargo.lock b/Cargo.lock similarity index 84% rename from os/Cargo.lock rename to Cargo.lock index a737b60..4b10805 100644 --- a/os/Cargo.lock +++ b/Cargo.lock @@ -38,7 +38,20 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4e85e760e105b46ae0bd1236578793c6c147ae7463fe95c8350296b8bfcb830" dependencies = [ - "spin 0.7.1", + "spin 0.7.2", +] + +[[package]] +name = "kernel" +version = "0.1.0" +dependencies = [ + "bitflags", + "buddy_system_allocator", + "lazy_static", + "log", + "riscv", + "sbi-rt", + "xmas-elf", ] [[package]] @@ -47,39 +60,26 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.9.8", + "spin 0.9.9", ] [[package]] name = "log" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b30b4cd05f7c06868fdb2854f66a7b9fece9a48425351cd532e810d74024f" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" - -[[package]] -name = "os" -version = "0.1.0" -dependencies = [ - "bitflags", - "buddy_system_allocator", - "lazy_static", - "log", - "riscv", - "sbi-rt", - "xmas-elf", -] +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -89,9 +89,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad" dependencies = [ "aho-corasick", "memchr", @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "riscv" @@ -170,15 +170,15 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "spin" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13287b4da9d1207a4f4929ac390916d64eacfe236a487e9a9f5b3be392be5162" +checksum = "9335ac53859132805f619b68dab9229ec74e45ad9c92d5edca2a80240806eb65" [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "static_assertions" @@ -186,6 +186,13 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "user_lib" +version = "0.1.0" +dependencies = [ + "riscv", +] + [[package]] name = "xmas-elf" version = "0.7.0" diff --git a/os/Cargo.toml b/Cargo.toml similarity index 55% rename from os/Cargo.toml rename to Cargo.toml index 4f65901..2bbc8ad 100644 --- a/os/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,18 @@ -[package] -name = "os" +[workspace] +resolver = "2" +members = [ + "kernel", + "user_lib", +] +exclude = [ + "framework", +] + +[workspace.package] version = "0.1.0" edition = "2024" -[dependencies] +[workspace.dependencies] riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] } lazy_static = { version = "1.4.0", features = ["spin_no_std"] } log = "0.4" @@ -12,5 +21,12 @@ sbi-rt = { version = "0.0.2", features = ["legacy"] } buddy_system_allocator = "0.6" bitflags = "1.2.1" +[workspace.lints.rust] +redundant_imports = "warn" +unused_qualifications = "warn" + +[workspace.lints.clippy] +allow_attributes = "warn" + [profile.release] debug = true diff --git a/Makefile b/Makefile index 3245a05..9989a47 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,26 @@ all: - cd os ; cargo build; + cargo build -p user_lib --release + cargo build -p kernel --release + run: - ./run_tcp_off.sh + cargo build -p user_lib --release + cargo run -p kernel --release + +debug: + cargo build -p user_lib --release + RACHO_GDB=1 cargo run -p kernel --release + +gdb_client: + ./tools/gdb_client.sh + +disasm: + cargo build -p kernel --release + llvm-objdump -x target/riscv64gc-unknown-none-elf/release/kernel | less + +disasm-vim: + cargo build -p kernel --release + llvm-objdump -x target/riscv64gc-unknown-none-elf/release/kernel > /tmp/racho.asm + vim /tmp/racho.asm + +clean: + cargo clean diff --git a/flake.nix b/flake.nix index 0898b31..61a929b 100644 --- a/flake.nix +++ b/flake.nix @@ -28,10 +28,11 @@ ]; shellHook = '' echo "==> racho dev shell" - echo " Rust: rust-toolchain.toml (auto-installs on first cargo run)" - echo " QEMU: qemu-system-riscv64" - echo " GDB: gdb" - echo " Build: cd os && make run" + echo " Rust: rust-toolchain.toml (auto-installs on first cargo run)" + echo " Rust: Cargo.toml (for Build system + Package manager)" + echo " QEMU: make run" + echo " GDB: make debug / make gdb_client" + echo " Build: make all" echo "" ''; }; diff --git a/framework/Cargo.toml b/framework/Cargo.toml new file mode 100644 index 0000000..1162d03 --- /dev/null +++ b/framework/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "framework" +version.workspace = true +edition.workspace = true + +[dependencies] + +[lints] +workspace = true diff --git a/framework/src/main.rs b/framework/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/framework/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml new file mode 100644 index 0000000..5fd6390 --- /dev/null +++ b/kernel/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "kernel" +version.workspace = true +edition.workspace = true + +[dependencies] +riscv.workspace = true +lazy_static.workspace = true +log.workspace = true +xmas-elf.workspace = true +sbi-rt.workspace = true +buddy_system_allocator.workspace = true +bitflags.workspace = true + +[lints] +workspace = true diff --git a/os/build.rs b/kernel/build.rs similarity index 58% rename from os/build.rs rename to kernel/build.rs index 12afb5e..3bb255b 100644 --- a/os/build.rs +++ b/kernel/build.rs @@ -1,17 +1,28 @@ use std::fs::{File, read_dir}; use std::io::{Result, Write}; +use std::path::PathBuf; fn main() { - println!("cargo:rerun-if-changed=../user/src/"); - println!("cargo:rerun-if-changed={}", TARGET_PATH); - insert_app_data().unwrap(); -} + println!("cargo:rustc-link-arg=-Tkernel/src/linker-qemu.ld"); + println!("cargo:rerun-if-changed=../user_lib/src/"); + + let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); + let target_dir = manifest_dir + .parent() + .unwrap() + .join("target") + .join("riscv64gc-unknown-none-elf") + .join("release"); -static TARGET_PATH: &str = "../user/target/riscv64gc-unknown-none-elf/release/"; + let target_path = target_dir.to_string_lossy().into_owned(); + println!("cargo:rerun-if-changed={}", target_path); + + insert_app_data(&target_path).unwrap(); +} -fn insert_app_data() -> Result<()> { +fn insert_app_data(target_path: &str) -> Result<()> { let mut f = File::create("src/link_app.S").unwrap(); - let mut apps: Vec<_> = read_dir("../user/src/bin") + let mut apps: Vec<_> = read_dir("../user_lib/src/bin") .unwrap() .map(|dir_entry| { let mut name_with_ext = dir_entry.unwrap().file_name().into_string().unwrap(); @@ -46,9 +57,9 @@ fn insert_app_data() -> Result<()> { .global app_{0}_start .global app_{0}_end app_{0}_start: - .incbin "{2}{1}" + .incbin "{1}/{2}" app_{0}_end:"#, - idx, app, TARGET_PATH + idx, target_path, app )?; } Ok(()) diff --git a/os/rust-analyzer.toml b/kernel/rust-analyzer.toml similarity index 100% rename from os/rust-analyzer.toml rename to kernel/rust-analyzer.toml diff --git a/os/src/boards/qemu.rs b/kernel/src/boards/qemu.rs similarity index 100% rename from os/src/boards/qemu.rs rename to kernel/src/boards/qemu.rs diff --git a/os/src/config.rs b/kernel/src/config.rs similarity index 100% rename from os/src/config.rs rename to kernel/src/config.rs diff --git a/os/src/console.rs b/kernel/src/console.rs similarity index 100% rename from os/src/console.rs rename to kernel/src/console.rs diff --git a/os/src/entry.asm b/kernel/src/entry.asm similarity index 100% rename from os/src/entry.asm rename to kernel/src/entry.asm diff --git a/os/src/lang_items.rs b/kernel/src/lang_items.rs similarity index 100% rename from os/src/lang_items.rs rename to kernel/src/lang_items.rs diff --git a/os/src/linker-qemu.ld b/kernel/src/linker-qemu.ld similarity index 100% rename from os/src/linker-qemu.ld rename to kernel/src/linker-qemu.ld diff --git a/os/src/loader.rs b/kernel/src/loader.rs similarity index 100% rename from os/src/loader.rs rename to kernel/src/loader.rs diff --git a/os/src/logging.rs b/kernel/src/logging.rs similarity index 100% rename from os/src/logging.rs rename to kernel/src/logging.rs diff --git a/os/src/main.rs b/kernel/src/main.rs similarity index 94% rename from os/src/main.rs rename to kernel/src/main.rs index f99fa61..8c97bfa 100644 --- a/os/src/main.rs +++ b/kernel/src/main.rs @@ -98,8 +98,8 @@ pub fn rust_main() -> ! { // TODO: // 7.19,20;继续排除问题重构代码让上面这两个函数的调用链正常,遇到必要时,重构代码和写测试代码 // 重构代码,参考framework kernel,分离safe rust和unsafe rust; - // 给孙班主任分享想法(重构framework kernel后,录制演示视频) - // 关键给孙老师直接录制演示视频,写一个架构介绍去咨询意见 + // 分享想法(重构framework kernel后,录制演示视频) + // 直接录制演示视频,写一个架构介绍去咨询意见 mm::init(); trap::init(); // setup the kernel trap trap::enable_timer_interrupt(); diff --git a/os/src/mm/address.rs b/kernel/src/mm/address.rs similarity index 100% rename from os/src/mm/address.rs rename to kernel/src/mm/address.rs diff --git a/os/src/mm/frame_allocator.rs b/kernel/src/mm/frame_allocator.rs similarity index 100% rename from os/src/mm/frame_allocator.rs rename to kernel/src/mm/frame_allocator.rs diff --git a/os/src/mm/heap_allocator.rs b/kernel/src/mm/heap_allocator.rs similarity index 100% rename from os/src/mm/heap_allocator.rs rename to kernel/src/mm/heap_allocator.rs diff --git a/os/src/mm/memory_set.rs b/kernel/src/mm/memory_set.rs similarity index 100% rename from os/src/mm/memory_set.rs rename to kernel/src/mm/memory_set.rs diff --git a/os/src/mm/mod.rs b/kernel/src/mm/mod.rs similarity index 100% rename from os/src/mm/mod.rs rename to kernel/src/mm/mod.rs diff --git a/os/src/mm/page_table.rs b/kernel/src/mm/page_table.rs similarity index 100% rename from os/src/mm/page_table.rs rename to kernel/src/mm/page_table.rs diff --git a/os/src/sbi.rs b/kernel/src/sbi.rs similarity index 100% rename from os/src/sbi.rs rename to kernel/src/sbi.rs diff --git a/os/src/sync/mod.rs b/kernel/src/sync/mod.rs similarity index 100% rename from os/src/sync/mod.rs rename to kernel/src/sync/mod.rs diff --git a/os/src/sync/up.rs b/kernel/src/sync/up.rs similarity index 100% rename from os/src/sync/up.rs rename to kernel/src/sync/up.rs diff --git a/os/src/syscall/fs.rs b/kernel/src/syscall/fs.rs similarity index 100% rename from os/src/syscall/fs.rs rename to kernel/src/syscall/fs.rs diff --git a/os/src/syscall/mod.rs b/kernel/src/syscall/mod.rs similarity index 100% rename from os/src/syscall/mod.rs rename to kernel/src/syscall/mod.rs diff --git a/os/src/syscall/process.rs b/kernel/src/syscall/process.rs similarity index 100% rename from os/src/syscall/process.rs rename to kernel/src/syscall/process.rs diff --git a/os/src/task/context.rs b/kernel/src/task/context.rs similarity index 100% rename from os/src/task/context.rs rename to kernel/src/task/context.rs diff --git a/os/src/task/mod.rs b/kernel/src/task/mod.rs similarity index 100% rename from os/src/task/mod.rs rename to kernel/src/task/mod.rs diff --git a/os/src/task/switch.S b/kernel/src/task/switch.S similarity index 100% rename from os/src/task/switch.S rename to kernel/src/task/switch.S diff --git a/os/src/task/switch.rs b/kernel/src/task/switch.rs similarity index 100% rename from os/src/task/switch.rs rename to kernel/src/task/switch.rs diff --git a/os/src/task/task.rs b/kernel/src/task/task.rs similarity index 100% rename from os/src/task/task.rs rename to kernel/src/task/task.rs diff --git a/os/src/timer.rs b/kernel/src/timer.rs similarity index 100% rename from os/src/timer.rs rename to kernel/src/timer.rs diff --git a/os/src/trap/context.rs b/kernel/src/trap/context.rs similarity index 100% rename from os/src/trap/context.rs rename to kernel/src/trap/context.rs diff --git a/os/src/trap/mod.rs b/kernel/src/trap/mod.rs similarity index 100% rename from os/src/trap/mod.rs rename to kernel/src/trap/mod.rs diff --git a/os/src/trap/trap.S b/kernel/src/trap/trap.S similarity index 100% rename from os/src/trap/trap.S rename to kernel/src/trap/trap.S diff --git a/os/.cargo/config.toml b/os/.cargo/config.toml deleted file mode 100644 index 4275fca..0000000 --- a/os/.cargo/config.toml +++ /dev/null @@ -1,7 +0,0 @@ -[build] -target = "riscv64gc-unknown-none-elf" - -[target.riscv64gc-unknown-none-elf] -rustflags = [ - "-Clink-arg=-Tsrc/linker.ld", "-Cforce-frame-pointers=yes" -] diff --git a/os/Makefile b/os/Makefile deleted file mode 100644 index a524282..0000000 --- a/os/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -# Building -TARGET := riscv64gc-unknown-none-elf -MODE := release -KERNEL_ELF := target/$(TARGET)/$(MODE)/os -KERNEL_BIN := $(KERNEL_ELF).bin -DISASM_TMP := target/$(TARGET)/$(MODE)/asm - -# Building mode argument -ifeq ($(MODE), release) - MODE_ARG := --release -endif - -# BOARD -BOARD := qemu -SBI ?= rustsbi -BOOTLOADER := ../bootloader/$(SBI)-$(BOARD).bin - -# KERNEL ENTRY -KERNEL_ENTRY_PA := 0x80200000 - -# Binutils (from llvm-tools component, resolved via rustc sysroot) -SYSROOT := $(shell rustc --print sysroot) -HOST_TRIPLE := $(shell rustc -vV | awk '/host:/ {print $$2}') -LLVM_TOOLS := $(SYSROOT)/lib/rustlib/$(HOST_TRIPLE)/bin -OBJDUMP := $(LLVM_TOOLS)/llvm-objdump -OBJCOPY := $(LLVM_TOOLS)/llvm-objcopy - -# Disassembly -DISASM ?= -x - -build: env $(KERNEL_BIN) - -env: - (rustup target list | grep "riscv64gc-unknown-none-elf (installed)") || rustup target add $(TARGET) - -$(KERNEL_BIN): kernel - @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ - -kernel: - @cd ../user && make build - @echo Platform: $(BOARD) - @cp src/linker-$(BOARD).ld src/linker.ld - @cargo build $(MODE_ARG) - @rm src/linker.ld - - -clean: - @cargo clean - -disasm: kernel - @$(OBJDUMP) $(DISASM) $(KERNEL_ELF) | less - -disasm-vim: kernel - @$(OBJDUMP) $(DISASM) $(KERNEL_ELF) > $(DISASM_TMP) - @vim $(DISASM_TMP) - @rm $(DISASM_TMP) - -run: run-inner - -QEMU_ARGS := -machine virt \ - -nographic \ - -bios $(BOOTLOADER) \ - -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) - -QEMU_NAME := qemu-system-riscv64 -# qemu-version-check: -# @sh scripts/qemu-ver-check.sh $(QEMU_NAME) - -run-inner: qemu-version-check build - @qemu-system-riscv64 $(QEMU_ARGS) - -# debug: qemu-version-check build -# @tmux new-session -d \ -# "qemu-system-riscv64 $(QEMU_ARGS) -s -S" && \ -# tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \ -# tmux -2 attach-session -d - -gdbserver: qemu-version-check build - @qemu-system-riscv64 $(QEMU_ARGS) -s -S - -gdbclient: - @riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234' - -.PHONY: build env kernel clean disasm disasm-vim run-inner gdbserver gdbclient qemu-version-check diff --git a/os/rust_objcopy.sh b/os/rust_objcopy.sh deleted file mode 100755 index 3d96c3e..0000000 --- a/os/rust_objcopy.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -SYSROOT=$(rustc --print sysroot) -HOST=$(rustc -vV | sed -n 's/^host: //p') -LLVM_OBJCOPY="$SYSROOT/lib/rustlib/$HOST/bin/llvm-objcopy" -$LLVM_OBJCOPY --strip-all target/riscv64gc-unknown-none-elf/release/os -O binary target/riscv64gc-unknown-none-elf/release/os.bin diff --git a/run_tcp_off.sh b/run_tcp_off.sh deleted file mode 100755 index e2f5285..0000000 --- a/run_tcp_off.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -cd os -./rust_objcopy.sh -cd .. -qemu-system-riscv64 \ - -machine virt \ - -nographic \ - -bios ./bootloader/rustsbi-qemu.bin \ - -device loader,file=./os/target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000 diff --git a/run_tcp_on.sh b/run_tcp_on.sh deleted file mode 100755 index 35e4c6a..0000000 --- a/run_tcp_on.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -echo "' x' to exit" -cd os -./rust_objcopy.sh -cd .. -qemu-system-riscv64 \ - -machine virt \ - -nographic \ - -bios ./bootloader/rustsbi-qemu.bin \ - -device loader,file=./os/target/riscv64gc-unknown-none-elf/release/os.bin,addr=0x80200000 \ - -s -S - diff --git a/tcp_gdb_on.sh b/tcp_gdb_on.sh deleted file mode 100755 index c116db5..0000000 --- a/tcp_gdb_on.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -gdb \ - -ex 'file os/target/riscv64gc-unknown-none-elf/release/os' \ - -ex 'set arch riscv:rv64' \ - -ex 'target remote localhost:1234' diff --git a/tools/gdb_client.sh b/tools/gdb_client.sh new file mode 100755 index 0000000..277e603 --- /dev/null +++ b/tools/gdb_client.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +gdb \ + -ex 'file kernel/target/riscv64gc-unknown-none-elf/release/kernel' \ + -ex 'set arch riscv:rv64' \ + -ex 'target remote localhost:1234' diff --git a/tools/run_qemu.sh b/tools/run_qemu.sh new file mode 100755 index 0000000..d4aa510 --- /dev/null +++ b/tools/run_qemu.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +BIN="$1" +PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" + +SYSROOT=$(rustc --print sysroot) +HOST=$(rustc -vV | sed -n 's/^host: //p') +LLVM_OBJCOPY="$SYSROOT/lib/rustlib/$HOST/bin/llvm-objcopy" +$LLVM_OBJCOPY --strip-all "$BIN" -O binary "$BIN.bin" + +if [ "${RACHO_GDB:-0}" = "1" ]; then + echo "' x' to exit" + exec qemu-system-riscv64 \ + -machine virt \ + -nographic \ + -bios "$PROJECT_DIR/bootloader/rustsbi-qemu.bin" \ + -device loader,file="$BIN.bin",addr=0x80200000 \ + -s -S +else + exec qemu-system-riscv64 \ + -machine virt \ + -nographic \ + -bios "$PROJECT_DIR/bootloader/rustsbi-qemu.bin" \ + -device loader,file="$BIN.bin",addr=0x80200000 +fi diff --git a/user/.cargo/config.toml b/user/.cargo/config.toml deleted file mode 100644 index 334d01e..0000000 --- a/user/.cargo/config.toml +++ /dev/null @@ -1,7 +0,0 @@ -[build] -target = "riscv64gc-unknown-none-elf" - -[target.riscv64gc-unknown-none-elf] -rustflags = [ - "-Clink-args=-Tsrc/linker.ld", "-Cforce-frame-pointers=yes" -] diff --git a/user/Cargo.lock b/user/Cargo.lock deleted file mode 100644 index 17e38ab..0000000 --- a/user/Cargo.lock +++ /dev/null @@ -1,133 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "bare-metal" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5deb64efa5bd81e31fcd1938615a6d98c82eafcbcd787162b6f63b91d6bac5b3" -dependencies = [ - "rustc_version", -] - -[[package]] -name = "bit_field" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "log" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" - -[[package]] -name = "memchr" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "riscv" -version = "0.6.0" -source = "git+https://github.com/rcore-os/riscv#11d43cf7cccb3b62a3caaf3e07a1db7449588f9a" -dependencies = [ - "bare-metal", - "bit_field", - "bitflags", - "log", - "riscv-target", -] - -[[package]] -name = "riscv-target" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88aa938cda42a0cf62a20cfe8d139ff1af20c2e681212b5b34adb5a58333f222" -dependencies = [ - "lazy_static", - "regex", -] - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "user_lib" -version = "0.1.0" -dependencies = [ - "riscv", -] diff --git a/user/Cargo.toml b/user/Cargo.toml deleted file mode 100644 index 6f9d69c..0000000 --- a/user/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "user_lib" -version = "0.1.0" -edition = "2024" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -riscv = { git = "https://github.com/rcore-os/riscv", features = ["inline-asm"] } - -[profile.release] -debug = true - -# [features] -# board_qemu = [] -# board_k210 = [] diff --git a/user/Makefile b/user/Makefile deleted file mode 100644 index f316ef5..0000000 --- a/user/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -TARGET := riscv64gc-unknown-none-elf -MODE := release -APP_DIR := src/bin -TARGET_DIR := target/$(TARGET)/$(MODE) -APPS := $(wildcard $(APP_DIR)/*.rs) - -build: $(APPS) - @cargo build --release - -clean: - @cargo clean - -.PHONY: build clean diff --git a/user_lib/Cargo.toml b/user_lib/Cargo.toml new file mode 100644 index 0000000..f1723dc --- /dev/null +++ b/user_lib/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "user_lib" +version.workspace = true +edition.workspace = true + +[dependencies] +riscv.workspace = true + +[lints] +workspace = true diff --git a/user_lib/build.rs b/user_lib/build.rs new file mode 100644 index 0000000..3be5533 --- /dev/null +++ b/user_lib/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rustc-link-arg=-Tuser_lib/src/linker.ld"); +} diff --git a/user/rust-analyzer.toml b/user_lib/rust-analyzer.toml similarity index 100% rename from user/rust-analyzer.toml rename to user_lib/rust-analyzer.toml diff --git a/user/src/bin/00power_3.rs b/user_lib/src/bin/00power_3.rs similarity index 100% rename from user/src/bin/00power_3.rs rename to user_lib/src/bin/00power_3.rs diff --git a/user/src/bin/01power_5.rs b/user_lib/src/bin/01power_5.rs similarity index 100% rename from user/src/bin/01power_5.rs rename to user_lib/src/bin/01power_5.rs diff --git a/user/src/bin/02power_7.rs b/user_lib/src/bin/02power_7.rs similarity index 100% rename from user/src/bin/02power_7.rs rename to user_lib/src/bin/02power_7.rs diff --git a/user/src/bin/03sleep.rs b/user_lib/src/bin/03sleep.rs similarity index 100% rename from user/src/bin/03sleep.rs rename to user_lib/src/bin/03sleep.rs diff --git a/user/src/console.rs b/user_lib/src/console.rs similarity index 100% rename from user/src/console.rs rename to user_lib/src/console.rs diff --git a/user/src/lang_items.rs b/user_lib/src/lang_items.rs similarity index 100% rename from user/src/lang_items.rs rename to user_lib/src/lang_items.rs diff --git a/user/src/lib.rs b/user_lib/src/lib.rs similarity index 100% rename from user/src/lib.rs rename to user_lib/src/lib.rs diff --git a/user/src/linker.ld b/user_lib/src/linker.ld similarity index 100% rename from user/src/linker.ld rename to user_lib/src/linker.ld diff --git a/user/src/syscall.rs b/user_lib/src/syscall.rs similarity index 100% rename from user/src/syscall.rs rename to user_lib/src/syscall.rs