diff --git a/.github/workflows/makefile.yml b/.github/workflows/makefile.yml index 0fa57c2b..8d302dd2 100644 --- a/.github/workflows/makefile.yml +++ b/.github/workflows/makefile.yml @@ -15,4 +15,4 @@ jobs: - uses: actions/checkout@v3 - name: build the DragonOS - run: sudo apt install -y llvm-dev libclang-dev clang && cargo install cargo-binutils && rustup toolchain install nightly && rustup default nightly && rustup component add rust-src && rustup component add llvm-tools-preview && rustup target add x86_64-unknown-none && make -j 4 + run: sudo apt install -y llvm-dev libclang-dev clang gcc-multilib && cargo install cargo-binutils && rustup toolchain install nightly && rustup default nightly && rustup component add rust-src && rustup component add llvm-tools-preview && rustup target add x86_64-unknown-none && make -j 4 diff --git a/.vscode/settings.json b/.vscode/settings.json index 288878d2..160dbc83 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -157,5 +157,7 @@ "fat32.h": "c" }, "C_Cpp.errorSquiggles": "Enabled", - "esbonio.sphinx.confDir": "" + "esbonio.sphinx.confDir": "", + "rust-analyzer.cargo.target": "x86_64-unknown-none", + "rust-analyzer.checkOnSave.allTargets": false } \ No newline at end of file diff --git a/Makefile b/Makefile index 6cd38550..fce7d1d9 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,8 @@ SUBDIRS = kernel user ifeq ($(EMULATOR), ) export EMULATOR=__NO_EMULATION__ endif +# todo: 增加参数,判断是否在QEMU中仿真,若是,则启用该环境变量 +# export EMULATOR=__QEMU_EMULATION__ # 计算cpu核心数 NPROCS:=1 @@ -37,31 +39,13 @@ all: kernel user .PHONY: kernel kernel: mkdir -p bin/kernel/ - @list='./kernel'; for subdir in $$list; do \ - echo "make all in $$subdir";\ - cd $$subdir;\ - $(MAKE) all;\ - if [ "$$?" != "0" ]; then\ - echo "内核编译失败";\ - exit 1;\ - fi;\ - cd ..;\ - done - + $(MAKE) -C ./kernel all || (sh -c "echo 内核编译失败" && exit 1) + .PHONY: user user: mkdir -p bin/user/ mkdir -p bin/tmp/user - @list='./user'; for subdir in $$list; do \ - echo "make all in $$subdir";\ - cd $$subdir;\ - $(MAKE) all;\ - if [ "$$?" != "0" ]; then\ - echo "用户态程序编译失败";\ - exit 1;\ - fi;\ - cd ..;\ - done + $(MAKE) -C ./user all || (sh -c "echo 用户程序编译失败" && exit 1) .PHONY: clean clean: @@ -79,3 +63,33 @@ cppcheck: gdb: gdb -n -x tools/.gdbinit + +# 写入磁盘镜像 +write_diskimage: + sudo sh -c "cd tools && bash $(ROOT_PATH)/tools/write_disk_image.sh && cd .." + +# 不编译,直接启动QEMU +qemu: + sh -c "cd tools && bash run-qemu.sh && cd .." + +# 编译并写入磁盘镜像 +build: + $(MAKE) all -j $(NPROCS) + $(MAKE) write_diskimage || exit 1 + +# 在docker中编译,并写入磁盘镜像 +docker: + @echo "使用docker构建" + sudo bash tools/build_in_docker.sh || exit 1 + +# 编译并启动QEMU +run: + $(MAKE) all -j $(NPROCS) + $(MAKE) write_diskimage || exit 1 + $(MAKE) qemu + +# 在docker中编译,并启动QEMU +run-docker: + @echo "使用docker构建并运行" + sudo bash tools/build_in_docker.sh || exit 1 + $(MAKE) qemu diff --git a/docs/introduction/build_system.md b/docs/introduction/build_system.md index c6064a17..f1a7c582 100644 --- a/docs/introduction/build_system.md +++ b/docs/introduction/build_system.md @@ -17,7 +17,7 @@   当您成功安装了docker之后,您可以通过以下命令,下载DragonOS的编译镜像: ```shell -docker pull dragonos/dragonos-dev:v1.0 +docker pull dragonos/dragonos-dev:v1.1.0-beta3 ``` ### 安装qemu虚拟机 @@ -64,20 +64,19 @@ bash create_hdd_image.sh   如果不出意外的话,这将是运行DragonOS的最后一步。您只需要在DragonOS的根目录下方,执行以下命令,即可运行DragonOS。 ```shell -bash run.sh --docker +make run-docker ``` -  若输入密码后仍提示权限不足,您可以使用以下命令运行: - -```shell -sudo bash run.sh --docker -```   稍等片刻,DragonOS将会被运行。   在qemu虚拟机被启动后,我们需要在控制台输入字母`c`,然后回车。这样,虚拟机就会开始执行。 +:::{note} +首次编译时,由于需要下载Rust相关的索引(几百MB大小),因此需要一定的时间,请耐心等候! +::: +**关于编译命令的用法,请见:{ref}`编译命令讲解 <_build_system_command>`** ## 手动搭建开发环境 @@ -92,20 +91,24 @@ sudo bash run.sh --docker   需要注意的是,编译安装qemu将会是一件费时费力的工作,它可能需要花费你40分钟以上的时间。 -  对于以下软件依赖,建议您使用系统自带的包管理器进行安装。 +  对于其余的软件依赖,我们提供了一键配置脚本,可以一键安装,只需要在控制台运行以下命令: -- gcc >= 8.3.0 +```shell +cd tools +bash bootstrap.sh +``` +:::{note} +一键配置脚本目前只支持以下系统: -- xorriso +- Ubuntu/Debian/Deepin/UOS 等基于Debian的衍生版本 -- fdisk +欢迎您为其他的系统完善构建脚本! +::: -- make -- VNC Viewer - -- gdb +### 创建磁盘镜像 +  首先,您需要使用`sudo`权限运行`tools/create_hdd_image.sh`,为DragonOS创建一块磁盘镜像文件。该脚本会自动完成创建磁盘镜像的工作,并将其移动到`bin/`目录下。 ### 编译DragonOS @@ -113,19 +116,33 @@ sudo bash run.sh --docker 1. 安装编译及运行环境 2. 进入DragonOS文件夹 3. 输入命令:`make -j 16`即可编译 +4. 输入`make build`即可编译并写入磁盘镜像 -### 创建磁盘镜像 - -  首先,您需要使用`sudo`权限运行`tools/create_hdd_image.sh`,为DragonOS创建一块磁盘镜像文件。该脚本会自动完成创建磁盘镜像的工作,并将其移动到`bin/`目录下。 ### 运行DragonOS   至此,准备工作已经完成,您可以在DragonOS项目的根目录下,输入 ```shell -bash run.sh +make run ```   然后,DragonOS将会被启动,您可以通过VNC Viewer连接至虚拟机。在qemu虚拟机被启动后,我们需要在控制台输入字母`c`,然后回车。这样,虚拟机就会开始执行。 + +:::{note} +首次编译时,由于需要下载Rust相关的索引(几百MB大小),因此需要一定的时间,请耐心等候! +::: + +**关于编译命令的用法,请见:{ref}`编译命令讲解 <_build_system_command>`** + +(_build_system_command)= +## 编译命令讲解 + +- 本地编译,不运行: `make all -j 您的CPU核心数` +- 本地编译,并写入磁盘镜像,不运行: `make build` +- 本地编译,写入磁盘镜像,并在QEMU中运行: `make run` +- Docker编译,并写入磁盘镜像,: `make docker` +- Docker编译,写入磁盘镜像,并在QEMU中运行: `make run-docker` +- 不编译,直接从已有的磁盘镜像启动: `make qemu` \ No newline at end of file diff --git a/kernel/.cargo/config.toml b/kernel/.cargo/config.toml new file mode 100644 index 00000000..fbf166c4 --- /dev/null +++ b/kernel/.cargo/config.toml @@ -0,0 +1,11 @@ +[build] +target = "src/arch/x86_64/x86_64-unknown-none.json" + +[unstable] +build-std = ["core", "compiler_builtins"] +build-std-features = ["compiler-builtins-mem"] + +[target.'cfg(target_os = "none")'] +runner = "bootimage runner" + +[env] diff --git a/kernel/.gitignore b/kernel/.gitignore new file mode 100644 index 00000000..31002ed7 --- /dev/null +++ b/kernel/.gitignore @@ -0,0 +1,5 @@ +target/ +src/kernel +Cargo.lock +# 将自动生成的Rust FFI加到gitignore +src/include/bindings/bindings.rs \ No newline at end of file diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml new file mode 100644 index 00000000..e3c8925e --- /dev/null +++ b/kernel/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "dragonos_kernel" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["staticlib"] + +[dependencies] +x86_64 = "0.14.10" + +[build-dependencies] +bindgen = "0.61.0" diff --git a/kernel/Makefile b/kernel/Makefile index afc8a33f..ced63e7b 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,75 +1,8 @@ -SUBDIR_ROOTS := . -DIRS := . $(shell find $(SUBDIR_ROOTS) -type d) -GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel -GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) -DIR_LIB=lib -lib_patterns := *.a -LIB_FILES := $(foreach DIR,$(DIR_LIB),$(addprefix $(DIR)/,$(lib_patterns))) - - -# 控制操作系统使用的中断控制器 _INTR_8259A_ _INTR_APIC_ -PIC := _INTR_APIC_ -CFLAGS = $(GLOBAL_CFLAGS) -D $(PIC) -I $(shell pwd) - -export ASFLAGS := --64 - -LD_LIST := head.o - - -kernel_subdirs := common driver process debug filesystem time arch exception mm smp sched syscall ktest lib ipc +all: + $(MAKE) -C src all - -head.o: head.S - $(CC) -E head.S > _head.s # 预处理 - as $(ASFLAGS) -o head.o _head.s - - -main.o: main.c -# -fno-builtin: 不使用C语言内建函数 -# The -m64 option sets int to 32bits and long and pointer to 64 bits and generates code for AMD’s x86-64 architecture. - $(CC) $(CFLAGS) -c main.c -o main.o - - -all: kernel - @echo "Linking kernel..." - ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") -T link.lds -# 生成kallsyms - current_dir=$(pwd) - - @dbg='debug';for x in $$dbg; do \ - cd $$x;\ - $(MAKE) generate_kallsyms kernel_root_path="$(shell pwd)";\ - cd ..;\ - if [ "$$?" != "0" ]; then\ - exit $$?;\ - fi;\ - done - -# 重新链接 - @echo "Re-Linking kernel..." - ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") ./debug/kallsyms.o -T link.lds - @echo "Generating kernel ELF file..." -# 生成内核文件 - objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../bin/kernel/kernel.elf - @echo "Kernel Build Done." - -ECHO: - @echo "$@" - -$(kernel_subdirs): ECHO - - $(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)" PIC="$(PIC)" kernel_root_path="$(shell pwd)" - -kernel: head.o main.o $(kernel_subdirs) - - - -clean: - rm -rf $(GARBAGE) - @list='$(kernel_subdirs)'; for subdir in $$list; do \ - echo "Clean in dir: $$subdir";\ - cd $$subdir && $(MAKE) clean;\ - cd .. ;\ - done \ No newline at end of file +clean: + rm -f Cargo.lock + $(MAKE) -C src clean \ No newline at end of file diff --git a/kernel/build.rs b/kernel/build.rs new file mode 100644 index 00000000..90d8d34e --- /dev/null +++ b/kernel/build.rs @@ -0,0 +1,40 @@ +extern crate bindgen; + +use std::path::PathBuf; + +fn main() { + // Tell cargo to look for shared libraries in the specified directory + println!("cargo:rustc-link-search=src"); + println!("cargo:rerun-if-changed=src/include/bindings/wrapper.h"); + let binding_file_path = "src/include/bindings/bindings.rs"; + // The bindgen::Builder is the main entry point + // to bindgen, and lets you build up options for + // the resulting bindings. + { + let bindings = bindgen::Builder::default() + .clang_arg("-I./src") + // The input header we would like to generate + // bindings for. + .header("src/include/bindings/wrapper.h") + .clang_arg("--target=x86_64-none-none") + .clang_arg("-v") + // 使用core,并将c语言的类型改为core::ffi,而不是使用std库。 + .use_core() + .ctypes_prefix("::core::ffi") + .generate_inline_functions(true) + // Tell cargo to invalidate the built crate whenever any of the + // included header files changed. + .parse_callbacks(Box::new(bindgen::CargoCallbacks)) + // Finish the builder and generate the bindings. + .generate() + // Unwrap the Result and panic on failure. + .expect("Unable to generate bindings"); + + // Write the bindings to the $OUT_DIR/bindings.rs file. + let out_path = PathBuf::from(String::from(".")); + + bindings + .write_to_file(out_path.join(binding_file_path)) + .expect("Couldn't write bindings!"); + } +} diff --git a/kernel/src/Makefile b/kernel/src/Makefile new file mode 100644 index 00000000..caf45519 --- /dev/null +++ b/kernel/src/Makefile @@ -0,0 +1,79 @@ +SUBDIR_ROOTS := . +DIRS := . $(shell find $(SUBDIR_ROOTS) -type d) +GARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel +GARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) + +DIR_LIB=lib +lib_patterns := *.a +LIB_FILES := $(foreach DIR,$(DIR_LIB),$(addprefix $(DIR)/,$(lib_patterns))) + + +# 控制操作系统使用的中断控制器 _INTR_8259A_ _INTR_APIC_ +PIC := _INTR_APIC_ +CFLAGS = $(GLOBAL_CFLAGS) -D $(PIC) -I $(shell pwd) + +export ASFLAGS := --64 + +LD_LIST := head.o + + +kernel_subdirs := common driver process debug filesystem time arch exception mm smp sched syscall ktest lib ipc + + + +head.o: head.S + $(CC) -E head.S > _head.s # 预处理 + as $(ASFLAGS) -o head.o _head.s + + +main.o: main.c +# -fno-builtin: 不使用C语言内建函数 +# The -m64 option sets int to 32bits and long and pointer to 64 bits and generates code for AMD’s x86-64 architecture. + $(CC) $(CFLAGS) -c main.c -o main.o + + +all: kernel + rustup default nightly + cargo +nightly build --release --target ./arch/x86_64/x86_64-unknown-none.json + @echo "Linking kernel..." + ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a -T link.lds +# 生成kallsyms + current_dir=$(pwd) + + @dbg='debug';for x in $$dbg; do \ + cd $$x;\ + $(MAKE) generate_kallsyms kernel_root_path="$(shell pwd)";\ + cd ..;\ + if [ "$$?" != "0" ]; then\ + exit $$?;\ + fi;\ + done + + +# 重新链接 + @echo "Re-Linking kernel..." + ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a ./debug/kallsyms.o -T link.lds + @echo "Generating kernel ELF file..." +# 生成内核文件 + objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../../bin/kernel/kernel.elf + @echo "Kernel Build Done." + +ECHO: + @echo "$@" + +$(kernel_subdirs): ECHO + + $(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)" PIC="$(PIC)" kernel_root_path="$(shell pwd)" + +kernel: head.o main.o $(kernel_subdirs) + + + +clean: + cargo clean + rm -rf $(GARBAGE) + @list='$(kernel_subdirs)'; for subdir in $$list; do \ + echo "Clean in dir: $$subdir";\ + cd $$subdir && $(MAKE) clean;\ + cd .. ;\ + done \ No newline at end of file diff --git a/kernel/arch/Makefile b/kernel/src/arch/Makefile similarity index 100% rename from kernel/arch/Makefile rename to kernel/src/arch/Makefile diff --git a/kernel/arch/arch.h b/kernel/src/arch/arch.h similarity index 100% rename from kernel/arch/arch.h rename to kernel/src/arch/arch.h diff --git a/kernel/arch/x86_64/Makefile b/kernel/src/arch/x86_64/Makefile similarity index 100% rename from kernel/arch/x86_64/Makefile rename to kernel/src/arch/x86_64/Makefile diff --git a/kernel/arch/x86_64/asm/asm.h b/kernel/src/arch/x86_64/asm/asm.h similarity index 100% rename from kernel/arch/x86_64/asm/asm.h rename to kernel/src/arch/x86_64/asm/asm.h diff --git a/kernel/arch/x86_64/asm/cmpxchg.h b/kernel/src/arch/x86_64/asm/cmpxchg.h similarity index 100% rename from kernel/arch/x86_64/asm/cmpxchg.h rename to kernel/src/arch/x86_64/asm/cmpxchg.h diff --git a/kernel/arch/x86_64/current.h b/kernel/src/arch/x86_64/current.h similarity index 100% rename from kernel/arch/x86_64/current.h rename to kernel/src/arch/x86_64/current.h diff --git a/kernel/arch/x86_64/ia64_msi.c b/kernel/src/arch/x86_64/ia64_msi.c similarity index 100% rename from kernel/arch/x86_64/ia64_msi.c rename to kernel/src/arch/x86_64/ia64_msi.c diff --git a/kernel/arch/x86_64/ia64_msi.h b/kernel/src/arch/x86_64/ia64_msi.h similarity index 100% rename from kernel/arch/x86_64/ia64_msi.h rename to kernel/src/arch/x86_64/ia64_msi.h diff --git a/kernel/arch/x86_64/math/bitcount.h b/kernel/src/arch/x86_64/math/bitcount.h similarity index 100% rename from kernel/arch/x86_64/math/bitcount.h rename to kernel/src/arch/x86_64/math/bitcount.h diff --git a/kernel/src/arch/x86_64/x86_64-unknown-none.json b/kernel/src/arch/x86_64/x86_64-unknown-none.json new file mode 100644 index 00000000..a24b9878 --- /dev/null +++ b/kernel/src/arch/x86_64/x86_64-unknown-none.json @@ -0,0 +1,15 @@ +{ + "llvm-target": "x86_64-unknown-none", + "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", + "arch": "x86_64", + "target-endian": "little", + "target-pointer-width": "64", + "target-c-int-width": "32", + "os": "none", + "linker": "rust-lld", + "linker-flavor": "ld.lld", + "executables": true, + "features": "-mmx,-sse,+soft-float", + "disable-redzone": true, + "panic-strategy": "abort" +} diff --git a/kernel/arch/x86_64/x86_64_ipi.c b/kernel/src/arch/x86_64/x86_64_ipi.c similarity index 100% rename from kernel/arch/x86_64/x86_64_ipi.c rename to kernel/src/arch/x86_64/x86_64_ipi.c diff --git a/kernel/arch/x86_64/x86_64_ipi.h b/kernel/src/arch/x86_64/x86_64_ipi.h similarity index 100% rename from kernel/arch/x86_64/x86_64_ipi.h rename to kernel/src/arch/x86_64/x86_64_ipi.h diff --git a/kernel/common/Makefile b/kernel/src/common/Makefile similarity index 100% rename from kernel/common/Makefile rename to kernel/src/common/Makefile diff --git a/kernel/common/asm.h b/kernel/src/common/asm.h similarity index 100% rename from kernel/common/asm.h rename to kernel/src/common/asm.h diff --git a/kernel/common/atomic.h b/kernel/src/common/atomic.h similarity index 100% rename from kernel/common/atomic.h rename to kernel/src/common/atomic.h diff --git a/kernel/common/bitree.h b/kernel/src/common/bitree.h similarity index 100% rename from kernel/common/bitree.h rename to kernel/src/common/bitree.h diff --git a/kernel/common/blk_types.h b/kernel/src/common/blk_types.h similarity index 100% rename from kernel/common/blk_types.h rename to kernel/src/common/blk_types.h diff --git a/kernel/common/block.h b/kernel/src/common/block.h similarity index 100% rename from kernel/common/block.h rename to kernel/src/common/block.h diff --git a/kernel/common/boot_info.h b/kernel/src/common/boot_info.h similarity index 100% rename from kernel/common/boot_info.h rename to kernel/src/common/boot_info.h diff --git a/kernel/common/compiler.h b/kernel/src/common/compiler.h similarity index 100% rename from kernel/common/compiler.h rename to kernel/src/common/compiler.h diff --git a/kernel/common/compiler_attributes.h b/kernel/src/common/compiler_attributes.h similarity index 100% rename from kernel/common/compiler_attributes.h rename to kernel/src/common/compiler_attributes.h diff --git a/kernel/common/completion.h b/kernel/src/common/completion.h similarity index 100% rename from kernel/common/completion.h rename to kernel/src/common/completion.h diff --git a/kernel/common/cpu.h b/kernel/src/common/cpu.h similarity index 100% rename from kernel/common/cpu.h rename to kernel/src/common/cpu.h diff --git a/kernel/common/crc16.h b/kernel/src/common/crc16.h similarity index 100% rename from kernel/common/crc16.h rename to kernel/src/common/crc16.h diff --git a/kernel/common/crc32.h b/kernel/src/common/crc32.h similarity index 100% rename from kernel/common/crc32.h rename to kernel/src/common/crc32.h diff --git a/kernel/common/crc64.h b/kernel/src/common/crc64.h similarity index 100% rename from kernel/common/crc64.h rename to kernel/src/common/crc64.h diff --git a/kernel/common/crc7.h b/kernel/src/common/crc7.h similarity index 100% rename from kernel/common/crc7.h rename to kernel/src/common/crc7.h diff --git a/kernel/common/crc8.h b/kernel/src/common/crc8.h similarity index 100% rename from kernel/common/crc8.h rename to kernel/src/common/crc8.h diff --git a/kernel/common/dirent.h b/kernel/src/common/dirent.h similarity index 100% rename from kernel/common/dirent.h rename to kernel/src/common/dirent.h diff --git a/kernel/common/elf.h b/kernel/src/common/elf.h similarity index 100% rename from kernel/common/elf.h rename to kernel/src/common/elf.h diff --git a/kernel/common/err.h b/kernel/src/common/err.h similarity index 100% rename from kernel/common/err.h rename to kernel/src/common/err.h diff --git a/kernel/common/errno.h b/kernel/src/common/errno.h similarity index 100% rename from kernel/common/errno.h rename to kernel/src/common/errno.h diff --git a/kernel/common/fcntl.h b/kernel/src/common/fcntl.h similarity index 100% rename from kernel/common/fcntl.h rename to kernel/src/common/fcntl.h diff --git a/kernel/common/font.h b/kernel/src/common/font.h similarity index 100% rename from kernel/common/font.h rename to kernel/src/common/font.h diff --git a/kernel/common/gfp.h b/kernel/src/common/gfp.h similarity index 100% rename from kernel/common/gfp.h rename to kernel/src/common/gfp.h diff --git a/kernel/common/glib.h b/kernel/src/common/glib.h similarity index 100% rename from kernel/common/glib.h rename to kernel/src/common/glib.h diff --git a/kernel/common/hid.h b/kernel/src/common/hid.h similarity index 100% rename from kernel/common/hid.h rename to kernel/src/common/hid.h diff --git a/kernel/common/idr.h b/kernel/src/common/idr.h similarity index 100% rename from kernel/common/idr.h rename to kernel/src/common/idr.h diff --git a/kernel/common/kfifo.h b/kernel/src/common/kfifo.h similarity index 100% rename from kernel/common/kfifo.h rename to kernel/src/common/kfifo.h diff --git a/kernel/common/kprint.h b/kernel/src/common/kprint.h similarity index 100% rename from kernel/common/kprint.h rename to kernel/src/common/kprint.h diff --git a/kernel/common/kthread.h b/kernel/src/common/kthread.h similarity index 100% rename from kernel/common/kthread.h rename to kernel/src/common/kthread.h diff --git a/kernel/common/list.h b/kernel/src/common/list.h similarity index 100% rename from kernel/common/list.h rename to kernel/src/common/list.h diff --git a/kernel/common/lockref.h b/kernel/src/common/lockref.h similarity index 100% rename from kernel/common/lockref.h rename to kernel/src/common/lockref.h diff --git a/kernel/common/lz4.h b/kernel/src/common/lz4.h similarity index 100% rename from kernel/common/lz4.h rename to kernel/src/common/lz4.h diff --git a/kernel/common/math.h b/kernel/src/common/math.h similarity index 100% rename from kernel/common/math.h rename to kernel/src/common/math.h diff --git a/kernel/common/math/Makefile b/kernel/src/common/math/Makefile similarity index 100% rename from kernel/common/math/Makefile rename to kernel/src/common/math/Makefile diff --git a/kernel/common/math/fabs.c b/kernel/src/common/math/fabs.c similarity index 100% rename from kernel/common/math/fabs.c rename to kernel/src/common/math/fabs.c diff --git a/kernel/common/math/libm.h b/kernel/src/common/math/libm.h similarity index 100% rename from kernel/common/math/libm.h rename to kernel/src/common/math/libm.h diff --git a/kernel/common/math/pow.c b/kernel/src/common/math/pow.c similarity index 100% rename from kernel/common/math/pow.c rename to kernel/src/common/math/pow.c diff --git a/kernel/common/math/round.c b/kernel/src/common/math/round.c similarity index 100% rename from kernel/common/math/round.c rename to kernel/src/common/math/round.c diff --git a/kernel/common/mutex.h b/kernel/src/common/mutex.h similarity index 100% rename from kernel/common/mutex.h rename to kernel/src/common/mutex.h diff --git a/kernel/common/numa.h b/kernel/src/common/numa.h similarity index 100% rename from kernel/common/numa.h rename to kernel/src/common/numa.h diff --git a/kernel/common/printk.h b/kernel/src/common/printk.h similarity index 100% rename from kernel/common/printk.h rename to kernel/src/common/printk.h diff --git a/kernel/common/semaphore.h b/kernel/src/common/semaphore.h similarity index 100% rename from kernel/common/semaphore.h rename to kernel/src/common/semaphore.h diff --git a/kernel/common/spinlock.h b/kernel/src/common/spinlock.h similarity index 100% rename from kernel/common/spinlock.h rename to kernel/src/common/spinlock.h diff --git a/kernel/common/stddef.h b/kernel/src/common/stddef.h similarity index 100% rename from kernel/common/stddef.h rename to kernel/src/common/stddef.h diff --git a/kernel/common/stdio.h b/kernel/src/common/stdio.h similarity index 100% rename from kernel/common/stdio.h rename to kernel/src/common/stdio.h diff --git a/kernel/common/stdlib.h b/kernel/src/common/stdlib.h similarity index 100% rename from kernel/common/stdlib.h rename to kernel/src/common/stdlib.h diff --git a/kernel/common/string.h b/kernel/src/common/string.h similarity index 100% rename from kernel/common/string.h rename to kernel/src/common/string.h diff --git a/kernel/common/sys/types.h b/kernel/src/common/sys/types.h similarity index 100% rename from kernel/common/sys/types.h rename to kernel/src/common/sys/types.h diff --git a/kernel/common/sys/wait.h b/kernel/src/common/sys/wait.h similarity index 100% rename from kernel/common/sys/wait.h rename to kernel/src/common/sys/wait.h diff --git a/kernel/common/time.h b/kernel/src/common/time.h similarity index 100% rename from kernel/common/time.h rename to kernel/src/common/time.h diff --git a/kernel/common/unistd.h b/kernel/src/common/unistd.h similarity index 100% rename from kernel/common/unistd.h rename to kernel/src/common/unistd.h diff --git a/kernel/common/user_namespace.h b/kernel/src/common/user_namespace.h similarity index 100% rename from kernel/common/user_namespace.h rename to kernel/src/common/user_namespace.h diff --git a/kernel/common/wait_queue.h b/kernel/src/common/wait_queue.h similarity index 100% rename from kernel/common/wait_queue.h rename to kernel/src/common/wait_queue.h diff --git a/kernel/common/wait_queue_head.h b/kernel/src/common/wait_queue_head.h similarity index 100% rename from kernel/common/wait_queue_head.h rename to kernel/src/common/wait_queue_head.h diff --git a/kernel/debug/.gitignore b/kernel/src/debug/.gitignore similarity index 100% rename from kernel/debug/.gitignore rename to kernel/src/debug/.gitignore diff --git a/kernel/debug/Makefile b/kernel/src/debug/Makefile similarity index 100% rename from kernel/debug/Makefile rename to kernel/src/debug/Makefile diff --git a/kernel/debug/bug.h b/kernel/src/debug/bug.h similarity index 100% rename from kernel/debug/bug.h rename to kernel/src/debug/bug.h diff --git a/kernel/debug/kallsyms.c b/kernel/src/debug/kallsyms.c similarity index 100% rename from kernel/debug/kallsyms.c rename to kernel/src/debug/kallsyms.c diff --git a/kernel/debug/traceback/traceback.c b/kernel/src/debug/traceback/traceback.c similarity index 100% rename from kernel/debug/traceback/traceback.c rename to kernel/src/debug/traceback/traceback.c diff --git a/kernel/debug/traceback/traceback.h b/kernel/src/debug/traceback/traceback.h similarity index 100% rename from kernel/debug/traceback/traceback.h rename to kernel/src/debug/traceback/traceback.h diff --git a/kernel/driver/Makefile b/kernel/src/driver/Makefile similarity index 100% rename from kernel/driver/Makefile rename to kernel/src/driver/Makefile diff --git a/kernel/driver/acpi/Makefile b/kernel/src/driver/acpi/Makefile similarity index 100% rename from kernel/driver/acpi/Makefile rename to kernel/src/driver/acpi/Makefile diff --git a/kernel/driver/acpi/acpi.c b/kernel/src/driver/acpi/acpi.c similarity index 100% rename from kernel/driver/acpi/acpi.c rename to kernel/src/driver/acpi/acpi.c diff --git a/kernel/driver/acpi/acpi.h b/kernel/src/driver/acpi/acpi.h similarity index 100% rename from kernel/driver/acpi/acpi.h rename to kernel/src/driver/acpi/acpi.h diff --git a/kernel/driver/disk/Makefile b/kernel/src/driver/disk/Makefile similarity index 100% rename from kernel/driver/disk/Makefile rename to kernel/src/driver/disk/Makefile diff --git a/kernel/driver/disk/ahci/ahci.c b/kernel/src/driver/disk/ahci/ahci.c similarity index 100% rename from kernel/driver/disk/ahci/ahci.c rename to kernel/src/driver/disk/ahci/ahci.c diff --git a/kernel/driver/disk/ahci/ahci.h b/kernel/src/driver/disk/ahci/ahci.h similarity index 100% rename from kernel/driver/disk/ahci/ahci.h rename to kernel/src/driver/disk/ahci/ahci.h diff --git a/kernel/driver/disk/ata.c b/kernel/src/driver/disk/ata.c similarity index 100% rename from kernel/driver/disk/ata.c rename to kernel/src/driver/disk/ata.c diff --git a/kernel/driver/disk/ata.h b/kernel/src/driver/disk/ata.h similarity index 100% rename from kernel/driver/disk/ata.h rename to kernel/src/driver/disk/ata.h diff --git a/kernel/driver/hid/Makefile b/kernel/src/driver/hid/Makefile similarity index 100% rename from kernel/driver/hid/Makefile rename to kernel/src/driver/hid/Makefile diff --git a/kernel/driver/hid/hidparse.c b/kernel/src/driver/hid/hidparse.c similarity index 100% rename from kernel/driver/hid/hidparse.c rename to kernel/src/driver/hid/hidparse.c diff --git a/kernel/driver/hid/hidstrings.c b/kernel/src/driver/hid/hidstrings.c similarity index 100% rename from kernel/driver/hid/hidstrings.c rename to kernel/src/driver/hid/hidstrings.c diff --git a/kernel/driver/hid/internal.h b/kernel/src/driver/hid/internal.h similarity index 100% rename from kernel/driver/hid/internal.h rename to kernel/src/driver/hid/internal.h diff --git a/kernel/driver/hid/usbhid/Makefile b/kernel/src/driver/hid/usbhid/Makefile similarity index 100% rename from kernel/driver/hid/usbhid/Makefile rename to kernel/src/driver/hid/usbhid/Makefile diff --git a/kernel/driver/interrupt/8259A/8259A.c b/kernel/src/driver/interrupt/8259A/8259A.c similarity index 100% rename from kernel/driver/interrupt/8259A/8259A.c rename to kernel/src/driver/interrupt/8259A/8259A.c diff --git a/kernel/driver/interrupt/8259A/8259A.h b/kernel/src/driver/interrupt/8259A/8259A.h similarity index 100% rename from kernel/driver/interrupt/8259A/8259A.h rename to kernel/src/driver/interrupt/8259A/8259A.h diff --git a/kernel/driver/interrupt/Makefile b/kernel/src/driver/interrupt/Makefile similarity index 100% rename from kernel/driver/interrupt/Makefile rename to kernel/src/driver/interrupt/Makefile diff --git a/kernel/driver/interrupt/apic/apic.c b/kernel/src/driver/interrupt/apic/apic.c similarity index 100% rename from kernel/driver/interrupt/apic/apic.c rename to kernel/src/driver/interrupt/apic/apic.c diff --git a/kernel/driver/interrupt/apic/apic.h b/kernel/src/driver/interrupt/apic/apic.h similarity index 100% rename from kernel/driver/interrupt/apic/apic.h rename to kernel/src/driver/interrupt/apic/apic.h diff --git a/kernel/driver/interrupt/apic/apic_timer.c b/kernel/src/driver/interrupt/apic/apic_timer.c similarity index 100% rename from kernel/driver/interrupt/apic/apic_timer.c rename to kernel/src/driver/interrupt/apic/apic_timer.c diff --git a/kernel/driver/interrupt/apic/apic_timer.h b/kernel/src/driver/interrupt/apic/apic_timer.h similarity index 100% rename from kernel/driver/interrupt/apic/apic_timer.h rename to kernel/src/driver/interrupt/apic/apic_timer.h diff --git a/kernel/driver/keyboard/Makefile b/kernel/src/driver/keyboard/Makefile similarity index 100% rename from kernel/driver/keyboard/Makefile rename to kernel/src/driver/keyboard/Makefile diff --git a/kernel/driver/keyboard/ps2_keyboard.c b/kernel/src/driver/keyboard/ps2_keyboard.c similarity index 100% rename from kernel/driver/keyboard/ps2_keyboard.c rename to kernel/src/driver/keyboard/ps2_keyboard.c diff --git a/kernel/driver/keyboard/ps2_keyboard.h b/kernel/src/driver/keyboard/ps2_keyboard.h similarity index 100% rename from kernel/driver/keyboard/ps2_keyboard.h rename to kernel/src/driver/keyboard/ps2_keyboard.h diff --git a/kernel/driver/mouse/Makefile b/kernel/src/driver/mouse/Makefile similarity index 100% rename from kernel/driver/mouse/Makefile rename to kernel/src/driver/mouse/Makefile diff --git a/kernel/driver/mouse/ps2_mouse.c b/kernel/src/driver/mouse/ps2_mouse.c similarity index 100% rename from kernel/driver/mouse/ps2_mouse.c rename to kernel/src/driver/mouse/ps2_mouse.c diff --git a/kernel/driver/mouse/ps2_mouse.h b/kernel/src/driver/mouse/ps2_mouse.h similarity index 100% rename from kernel/driver/mouse/ps2_mouse.h rename to kernel/src/driver/mouse/ps2_mouse.h diff --git a/kernel/driver/multiboot2/Makefile b/kernel/src/driver/multiboot2/Makefile similarity index 100% rename from kernel/driver/multiboot2/Makefile rename to kernel/src/driver/multiboot2/Makefile diff --git a/kernel/driver/multiboot2/multiboot2.c b/kernel/src/driver/multiboot2/multiboot2.c similarity index 100% rename from kernel/driver/multiboot2/multiboot2.c rename to kernel/src/driver/multiboot2/multiboot2.c diff --git a/kernel/driver/multiboot2/multiboot2.h b/kernel/src/driver/multiboot2/multiboot2.h similarity index 100% rename from kernel/driver/multiboot2/multiboot2.h rename to kernel/src/driver/multiboot2/multiboot2.h diff --git a/kernel/driver/pci/Makefile b/kernel/src/driver/pci/Makefile similarity index 100% rename from kernel/driver/pci/Makefile rename to kernel/src/driver/pci/Makefile diff --git a/kernel/driver/pci/msi.c b/kernel/src/driver/pci/msi.c similarity index 100% rename from kernel/driver/pci/msi.c rename to kernel/src/driver/pci/msi.c diff --git a/kernel/driver/pci/msi.h b/kernel/src/driver/pci/msi.h similarity index 100% rename from kernel/driver/pci/msi.h rename to kernel/src/driver/pci/msi.h diff --git a/kernel/driver/pci/pci.c b/kernel/src/driver/pci/pci.c similarity index 100% rename from kernel/driver/pci/pci.c rename to kernel/src/driver/pci/pci.c diff --git a/kernel/driver/pci/pci.h b/kernel/src/driver/pci/pci.h similarity index 100% rename from kernel/driver/pci/pci.h rename to kernel/src/driver/pci/pci.h diff --git a/kernel/driver/timers/HPET/HPET.c b/kernel/src/driver/timers/HPET/HPET.c similarity index 100% rename from kernel/driver/timers/HPET/HPET.c rename to kernel/src/driver/timers/HPET/HPET.c diff --git a/kernel/driver/timers/HPET/HPET.h b/kernel/src/driver/timers/HPET/HPET.h similarity index 100% rename from kernel/driver/timers/HPET/HPET.h rename to kernel/src/driver/timers/HPET/HPET.h diff --git a/kernel/driver/timers/Makefile b/kernel/src/driver/timers/Makefile similarity index 100% rename from kernel/driver/timers/Makefile rename to kernel/src/driver/timers/Makefile diff --git a/kernel/driver/timers/rtc/rtc.c b/kernel/src/driver/timers/rtc/rtc.c similarity index 100% rename from kernel/driver/timers/rtc/rtc.c rename to kernel/src/driver/timers/rtc/rtc.c diff --git a/kernel/driver/timers/rtc/rtc.h b/kernel/src/driver/timers/rtc/rtc.h similarity index 100% rename from kernel/driver/timers/rtc/rtc.h rename to kernel/src/driver/timers/rtc/rtc.h diff --git a/kernel/driver/tty/Makefile b/kernel/src/driver/tty/Makefile similarity index 100% rename from kernel/driver/tty/Makefile rename to kernel/src/driver/tty/Makefile diff --git a/kernel/driver/tty/tty.c b/kernel/src/driver/tty/tty.c similarity index 100% rename from kernel/driver/tty/tty.c rename to kernel/src/driver/tty/tty.c diff --git a/kernel/driver/tty/tty.h b/kernel/src/driver/tty/tty.h similarity index 100% rename from kernel/driver/tty/tty.h rename to kernel/src/driver/tty/tty.h diff --git a/kernel/driver/uart/Makefile b/kernel/src/driver/uart/Makefile similarity index 100% rename from kernel/driver/uart/Makefile rename to kernel/src/driver/uart/Makefile diff --git a/kernel/driver/uart/uart.c b/kernel/src/driver/uart/uart.c similarity index 100% rename from kernel/driver/uart/uart.c rename to kernel/src/driver/uart/uart.c diff --git a/kernel/driver/uart/uart.h b/kernel/src/driver/uart/uart.h similarity index 100% rename from kernel/driver/uart/uart.h rename to kernel/src/driver/uart/uart.h diff --git a/kernel/driver/usb/Makefile b/kernel/src/driver/usb/Makefile similarity index 100% rename from kernel/driver/usb/Makefile rename to kernel/src/driver/usb/Makefile diff --git a/kernel/driver/usb/usb.c b/kernel/src/driver/usb/usb.c similarity index 100% rename from kernel/driver/usb/usb.c rename to kernel/src/driver/usb/usb.c diff --git a/kernel/driver/usb/usb.h b/kernel/src/driver/usb/usb.h similarity index 100% rename from kernel/driver/usb/usb.h rename to kernel/src/driver/usb/usb.h diff --git a/kernel/driver/usb/xhci/internal.h b/kernel/src/driver/usb/xhci/internal.h similarity index 100% rename from kernel/driver/usb/xhci/internal.h rename to kernel/src/driver/usb/xhci/internal.h diff --git a/kernel/driver/usb/xhci/xhci.c b/kernel/src/driver/usb/xhci/xhci.c similarity index 100% rename from kernel/driver/usb/xhci/xhci.c rename to kernel/src/driver/usb/xhci/xhci.c diff --git a/kernel/driver/usb/xhci/xhci.h b/kernel/src/driver/usb/xhci/xhci.h similarity index 100% rename from kernel/driver/usb/xhci/xhci.h rename to kernel/src/driver/usb/xhci/xhci.h diff --git a/kernel/driver/video/Makefile b/kernel/src/driver/video/Makefile similarity index 100% rename from kernel/driver/video/Makefile rename to kernel/src/driver/video/Makefile diff --git a/kernel/driver/video/video.c b/kernel/src/driver/video/video.c similarity index 100% rename from kernel/driver/video/video.c rename to kernel/src/driver/video/video.c diff --git a/kernel/driver/video/video.h b/kernel/src/driver/video/video.h similarity index 100% rename from kernel/driver/video/video.h rename to kernel/src/driver/video/video.h diff --git a/kernel/exception/Makefile b/kernel/src/exception/Makefile similarity index 100% rename from kernel/exception/Makefile rename to kernel/src/exception/Makefile diff --git a/kernel/exception/entry.S b/kernel/src/exception/entry.S similarity index 100% rename from kernel/exception/entry.S rename to kernel/src/exception/entry.S diff --git a/kernel/exception/gate.h b/kernel/src/exception/gate.h similarity index 100% rename from kernel/exception/gate.h rename to kernel/src/exception/gate.h diff --git a/kernel/exception/irq.c b/kernel/src/exception/irq.c similarity index 100% rename from kernel/exception/irq.c rename to kernel/src/exception/irq.c diff --git a/kernel/exception/irq.h b/kernel/src/exception/irq.h similarity index 100% rename from kernel/exception/irq.h rename to kernel/src/exception/irq.h diff --git a/kernel/exception/softirq.c b/kernel/src/exception/softirq.c similarity index 100% rename from kernel/exception/softirq.c rename to kernel/src/exception/softirq.c diff --git a/kernel/exception/softirq.h b/kernel/src/exception/softirq.h similarity index 100% rename from kernel/exception/softirq.h rename to kernel/src/exception/softirq.h diff --git a/kernel/exception/trap.c b/kernel/src/exception/trap.c similarity index 100% rename from kernel/exception/trap.c rename to kernel/src/exception/trap.c diff --git a/kernel/exception/trap.h b/kernel/src/exception/trap.h similarity index 100% rename from kernel/exception/trap.h rename to kernel/src/exception/trap.h diff --git a/kernel/filesystem/MBR.c b/kernel/src/filesystem/MBR.c similarity index 100% rename from kernel/filesystem/MBR.c rename to kernel/src/filesystem/MBR.c diff --git a/kernel/filesystem/MBR.h b/kernel/src/filesystem/MBR.h similarity index 100% rename from kernel/filesystem/MBR.h rename to kernel/src/filesystem/MBR.h diff --git a/kernel/filesystem/Makefile b/kernel/src/filesystem/Makefile similarity index 100% rename from kernel/filesystem/Makefile rename to kernel/src/filesystem/Makefile diff --git a/kernel/filesystem/VFS/Makefile b/kernel/src/filesystem/VFS/Makefile similarity index 100% rename from kernel/filesystem/VFS/Makefile rename to kernel/src/filesystem/VFS/Makefile diff --git a/kernel/filesystem/VFS/VFS.c b/kernel/src/filesystem/VFS/VFS.c similarity index 100% rename from kernel/filesystem/VFS/VFS.c rename to kernel/src/filesystem/VFS/VFS.c diff --git a/kernel/filesystem/VFS/VFS.h b/kernel/src/filesystem/VFS/VFS.h similarity index 100% rename from kernel/filesystem/VFS/VFS.h rename to kernel/src/filesystem/VFS/VFS.h diff --git a/kernel/filesystem/VFS/dcache.c b/kernel/src/filesystem/VFS/dcache.c similarity index 100% rename from kernel/filesystem/VFS/dcache.c rename to kernel/src/filesystem/VFS/dcache.c diff --git a/kernel/filesystem/VFS/internal.h b/kernel/src/filesystem/VFS/internal.h similarity index 100% rename from kernel/filesystem/VFS/internal.h rename to kernel/src/filesystem/VFS/internal.h diff --git a/kernel/filesystem/VFS/mount.c b/kernel/src/filesystem/VFS/mount.c similarity index 100% rename from kernel/filesystem/VFS/mount.c rename to kernel/src/filesystem/VFS/mount.c diff --git a/kernel/filesystem/VFS/mount.h b/kernel/src/filesystem/VFS/mount.h similarity index 100% rename from kernel/filesystem/VFS/mount.h rename to kernel/src/filesystem/VFS/mount.h diff --git a/kernel/filesystem/block.c b/kernel/src/filesystem/block.c similarity index 100% rename from kernel/filesystem/block.c rename to kernel/src/filesystem/block.c diff --git a/kernel/filesystem/devfs/Makefile b/kernel/src/filesystem/devfs/Makefile similarity index 100% rename from kernel/filesystem/devfs/Makefile rename to kernel/src/filesystem/devfs/Makefile diff --git a/kernel/filesystem/devfs/chardev.c b/kernel/src/filesystem/devfs/chardev.c similarity index 100% rename from kernel/filesystem/devfs/chardev.c rename to kernel/src/filesystem/devfs/chardev.c diff --git a/kernel/filesystem/devfs/chardev.h b/kernel/src/filesystem/devfs/chardev.h similarity index 100% rename from kernel/filesystem/devfs/chardev.h rename to kernel/src/filesystem/devfs/chardev.h diff --git a/kernel/filesystem/devfs/devfs-types.h b/kernel/src/filesystem/devfs/devfs-types.h similarity index 100% rename from kernel/filesystem/devfs/devfs-types.h rename to kernel/src/filesystem/devfs/devfs-types.h diff --git a/kernel/filesystem/devfs/devfs.c b/kernel/src/filesystem/devfs/devfs.c similarity index 100% rename from kernel/filesystem/devfs/devfs.c rename to kernel/src/filesystem/devfs/devfs.c diff --git a/kernel/filesystem/devfs/devfs.h b/kernel/src/filesystem/devfs/devfs.h similarity index 100% rename from kernel/filesystem/devfs/devfs.h rename to kernel/src/filesystem/devfs/devfs.h diff --git a/kernel/filesystem/devfs/internal.h b/kernel/src/filesystem/devfs/internal.h similarity index 100% rename from kernel/filesystem/devfs/internal.h rename to kernel/src/filesystem/devfs/internal.h diff --git a/kernel/filesystem/fat32/Makefile b/kernel/src/filesystem/fat32/Makefile similarity index 100% rename from kernel/filesystem/fat32/Makefile rename to kernel/src/filesystem/fat32/Makefile diff --git a/kernel/filesystem/fat32/fat32.c b/kernel/src/filesystem/fat32/fat32.c similarity index 100% rename from kernel/filesystem/fat32/fat32.c rename to kernel/src/filesystem/fat32/fat32.c diff --git a/kernel/filesystem/fat32/fat32.h b/kernel/src/filesystem/fat32/fat32.h similarity index 100% rename from kernel/filesystem/fat32/fat32.h rename to kernel/src/filesystem/fat32/fat32.h diff --git a/kernel/filesystem/fat32/fat_ent.c b/kernel/src/filesystem/fat32/fat_ent.c similarity index 100% rename from kernel/filesystem/fat32/fat_ent.c rename to kernel/src/filesystem/fat32/fat_ent.c diff --git a/kernel/filesystem/fat32/fat_ent.h b/kernel/src/filesystem/fat32/fat_ent.h similarity index 100% rename from kernel/filesystem/fat32/fat_ent.h rename to kernel/src/filesystem/fat32/fat_ent.h diff --git a/kernel/filesystem/fat32/internal.h b/kernel/src/filesystem/fat32/internal.h similarity index 100% rename from kernel/filesystem/fat32/internal.h rename to kernel/src/filesystem/fat32/internal.h diff --git a/kernel/filesystem/rootfs/Makefile b/kernel/src/filesystem/rootfs/Makefile similarity index 100% rename from kernel/filesystem/rootfs/Makefile rename to kernel/src/filesystem/rootfs/Makefile diff --git a/kernel/filesystem/rootfs/rootfs.c b/kernel/src/filesystem/rootfs/rootfs.c similarity index 100% rename from kernel/filesystem/rootfs/rootfs.c rename to kernel/src/filesystem/rootfs/rootfs.c diff --git a/kernel/filesystem/rootfs/rootfs.h b/kernel/src/filesystem/rootfs/rootfs.h similarity index 100% rename from kernel/filesystem/rootfs/rootfs.h rename to kernel/src/filesystem/rootfs/rootfs.h diff --git a/kernel/head.S b/kernel/src/head.S similarity index 100% rename from kernel/head.S rename to kernel/src/head.S diff --git a/kernel/src/include/bindings/wrapper.h b/kernel/src/include/bindings/wrapper.h new file mode 100644 index 00000000..9eed82a8 --- /dev/null +++ b/kernel/src/include/bindings/wrapper.h @@ -0,0 +1,25 @@ +/** + * @file sched-wrapper.h + * @author longjin (longjin@RinGoTek.cn) + * @brief 这是为调度器相关接口创建rust绑定的wrapper + * @version 0.1 + * @date 2022-11-10 + * + * @copyright Copyright (c) 2022 + * + */ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include \ No newline at end of file diff --git a/kernel/ipc/Makefile b/kernel/src/ipc/Makefile similarity index 100% rename from kernel/ipc/Makefile rename to kernel/src/ipc/Makefile diff --git a/kernel/ipc/pipe.c b/kernel/src/ipc/pipe.c similarity index 100% rename from kernel/ipc/pipe.c rename to kernel/src/ipc/pipe.c diff --git a/kernel/ipc/pipe.h b/kernel/src/ipc/pipe.h similarity index 100% rename from kernel/ipc/pipe.h rename to kernel/src/ipc/pipe.h diff --git a/kernel/ktest/Makefile b/kernel/src/ktest/Makefile similarity index 100% rename from kernel/ktest/Makefile rename to kernel/src/ktest/Makefile diff --git a/kernel/ktest/ktest.c b/kernel/src/ktest/ktest.c similarity index 100% rename from kernel/ktest/ktest.c rename to kernel/src/ktest/ktest.c diff --git a/kernel/ktest/ktest.h b/kernel/src/ktest/ktest.h similarity index 100% rename from kernel/ktest/ktest.h rename to kernel/src/ktest/ktest.h diff --git a/kernel/ktest/ktest_utils.h b/kernel/src/ktest/ktest_utils.h similarity index 100% rename from kernel/ktest/ktest_utils.h rename to kernel/src/ktest/ktest_utils.h diff --git a/kernel/ktest/test-bitree.c b/kernel/src/ktest/test-bitree.c similarity index 100% rename from kernel/ktest/test-bitree.c rename to kernel/src/ktest/test-bitree.c diff --git a/kernel/ktest/test-idr.c b/kernel/src/ktest/test-idr.c similarity index 100% rename from kernel/ktest/test-idr.c rename to kernel/src/ktest/test-idr.c diff --git a/kernel/ktest/test-kfifo.c b/kernel/src/ktest/test-kfifo.c similarity index 100% rename from kernel/ktest/test-kfifo.c rename to kernel/src/ktest/test-kfifo.c diff --git a/kernel/ktest/test-mutex.c b/kernel/src/ktest/test-mutex.c similarity index 100% rename from kernel/ktest/test-mutex.c rename to kernel/src/ktest/test-mutex.c diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs new file mode 100644 index 00000000..0179d5d4 --- /dev/null +++ b/kernel/src/lib.rs @@ -0,0 +1,26 @@ +#![no_std] // <1> +#![no_main] // <1> +#![feature(core_intrinsics)] // <2> +#[allow(non_upper_case_globals)] +#[allow(non_camel_case_types)] +#[allow(non_snake_case)] + +use core::ffi::c_char; +use core::intrinsics; // <2> +use core::panic::PanicInfo; // <3> +include!("include/bindings/bindings.rs"); + +#[panic_handler] +#[no_mangle] +pub fn panic(_info: &PanicInfo) -> ! { + intrinsics::abort(); // <4> +} + +#[no_mangle] +pub extern "C" fn __rust_demo_func() -> i32 { + unsafe{ + let f = b"\nDragonOS's Rust lib called printk_color()\n".as_ptr() as *const c_char; + printk_color(GREEN, BLACK, f); + } + return 0; +} diff --git a/kernel/lib/Makefile b/kernel/src/lib/Makefile similarity index 100% rename from kernel/lib/Makefile rename to kernel/src/lib/Makefile diff --git a/kernel/lib/bitree.c b/kernel/src/lib/bitree.c similarity index 100% rename from kernel/lib/bitree.c rename to kernel/src/lib/bitree.c diff --git a/kernel/lib/cpu.c b/kernel/src/lib/cpu.c similarity index 100% rename from kernel/lib/cpu.c rename to kernel/src/lib/cpu.c diff --git a/kernel/lib/crc16.c b/kernel/src/lib/crc16.c similarity index 100% rename from kernel/lib/crc16.c rename to kernel/src/lib/crc16.c diff --git a/kernel/lib/crc32.c b/kernel/src/lib/crc32.c similarity index 100% rename from kernel/lib/crc32.c rename to kernel/src/lib/crc32.c diff --git a/kernel/lib/crc64.c b/kernel/src/lib/crc64.c similarity index 100% rename from kernel/lib/crc64.c rename to kernel/src/lib/crc64.c diff --git a/kernel/lib/crc7.c b/kernel/src/lib/crc7.c similarity index 100% rename from kernel/lib/crc7.c rename to kernel/src/lib/crc7.c diff --git a/kernel/lib/crc8.c b/kernel/src/lib/crc8.c similarity index 100% rename from kernel/lib/crc8.c rename to kernel/src/lib/crc8.c diff --git a/kernel/lib/glib.c b/kernel/src/lib/glib.c similarity index 100% rename from kernel/lib/glib.c rename to kernel/src/lib/glib.c diff --git a/kernel/lib/idr.c b/kernel/src/lib/idr.c similarity index 100% rename from kernel/lib/idr.c rename to kernel/src/lib/idr.c diff --git a/kernel/lib/kfifo.c b/kernel/src/lib/kfifo.c similarity index 100% rename from kernel/lib/kfifo.c rename to kernel/src/lib/kfifo.c diff --git a/kernel/lib/libELF/Makefile b/kernel/src/lib/libELF/Makefile similarity index 100% rename from kernel/lib/libELF/Makefile rename to kernel/src/lib/libELF/Makefile diff --git a/kernel/lib/libELF/elf.c b/kernel/src/lib/libELF/elf.c similarity index 100% rename from kernel/lib/libELF/elf.c rename to kernel/src/lib/libELF/elf.c diff --git a/kernel/lib/libUI/Makefile b/kernel/src/lib/libUI/Makefile similarity index 100% rename from kernel/lib/libUI/Makefile rename to kernel/src/lib/libUI/Makefile diff --git a/kernel/lib/libUI/screen_manager.c b/kernel/src/lib/libUI/screen_manager.c similarity index 100% rename from kernel/lib/libUI/screen_manager.c rename to kernel/src/lib/libUI/screen_manager.c diff --git a/kernel/lib/libUI/screen_manager.h b/kernel/src/lib/libUI/screen_manager.h similarity index 100% rename from kernel/lib/libUI/screen_manager.h rename to kernel/src/lib/libUI/screen_manager.h diff --git a/kernel/lib/libUI/textui-render.c b/kernel/src/lib/libUI/textui-render.c similarity index 100% rename from kernel/lib/libUI/textui-render.c rename to kernel/src/lib/libUI/textui-render.c diff --git a/kernel/lib/libUI/textui.c b/kernel/src/lib/libUI/textui.c similarity index 100% rename from kernel/lib/libUI/textui.c rename to kernel/src/lib/libUI/textui.c diff --git a/kernel/lib/libUI/textui.h b/kernel/src/lib/libUI/textui.h similarity index 100% rename from kernel/lib/libUI/textui.h rename to kernel/src/lib/libUI/textui.h diff --git a/kernel/lib/lockref.c b/kernel/src/lib/lockref.c similarity index 100% rename from kernel/lib/lockref.c rename to kernel/src/lib/lockref.c diff --git a/kernel/lib/lz4.c b/kernel/src/lib/lz4.c similarity index 100% rename from kernel/lib/lz4.c rename to kernel/src/lib/lz4.c diff --git a/kernel/lib/mutex.c b/kernel/src/lib/mutex.c similarity index 100% rename from kernel/lib/mutex.c rename to kernel/src/lib/mutex.c diff --git a/kernel/lib/printk.c b/kernel/src/lib/printk.c similarity index 100% rename from kernel/lib/printk.c rename to kernel/src/lib/printk.c diff --git a/kernel/lib/rust_helloworld/Makefile b/kernel/src/lib/rust_helloworld/Makefile similarity index 100% rename from kernel/lib/rust_helloworld/Makefile rename to kernel/src/lib/rust_helloworld/Makefile diff --git a/kernel/lib/rust_helloworld/helloworld.rs b/kernel/src/lib/rust_helloworld/helloworld.rs similarity index 100% rename from kernel/lib/rust_helloworld/helloworld.rs rename to kernel/src/lib/rust_helloworld/helloworld.rs diff --git a/kernel/lib/semaphore.c b/kernel/src/lib/semaphore.c similarity index 100% rename from kernel/lib/semaphore.c rename to kernel/src/lib/semaphore.c diff --git a/kernel/lib/stdlib.c b/kernel/src/lib/stdlib.c similarity index 100% rename from kernel/lib/stdlib.c rename to kernel/src/lib/stdlib.c diff --git a/kernel/lib/string.c b/kernel/src/lib/string.c similarity index 100% rename from kernel/lib/string.c rename to kernel/src/lib/string.c diff --git a/kernel/lib/sys/Makefile b/kernel/src/lib/sys/Makefile similarity index 100% rename from kernel/lib/sys/Makefile rename to kernel/src/lib/sys/Makefile diff --git a/kernel/lib/sys/wait.c b/kernel/src/lib/sys/wait.c similarity index 100% rename from kernel/lib/sys/wait.c rename to kernel/src/lib/sys/wait.c diff --git a/kernel/lib/unistd.c b/kernel/src/lib/unistd.c similarity index 100% rename from kernel/lib/unistd.c rename to kernel/src/lib/unistd.c diff --git a/kernel/lib/wait_queue.c b/kernel/src/lib/wait_queue.c similarity index 100% rename from kernel/lib/wait_queue.c rename to kernel/src/lib/wait_queue.c diff --git a/kernel/lib/wait_queue_head.c b/kernel/src/lib/wait_queue_head.c similarity index 100% rename from kernel/lib/wait_queue_head.c rename to kernel/src/lib/wait_queue_head.c diff --git a/kernel/link.lds b/kernel/src/link.lds similarity index 100% rename from kernel/link.lds rename to kernel/src/link.lds diff --git a/kernel/main.c b/kernel/src/main.c similarity index 99% rename from kernel/main.c rename to kernel/src/main.c index 31a619a2..ab25bfae 100644 --- a/kernel/main.c +++ b/kernel/src/main.c @@ -41,6 +41,7 @@ #include ul bsp_idt_size, bsp_gdt_size; +extern int __rust_demo_func(); #pragma GCC push_options #pragma GCC optimize("O0") @@ -165,7 +166,7 @@ void system_initialize() // 启用double buffer // scm_enable_double_buffer(); // 因为时序问题, 该函数调用被移到 initial_kernel_thread io_mfence(); - + __rust_demo_func(); // fat32_init(); HPET_enable(); diff --git a/kernel/mm/Makefile b/kernel/src/mm/Makefile similarity index 100% rename from kernel/mm/Makefile rename to kernel/src/mm/Makefile diff --git a/kernel/mm/internal.h b/kernel/src/mm/internal.h similarity index 100% rename from kernel/mm/internal.h rename to kernel/src/mm/internal.h diff --git a/kernel/mm/mm-stat.c b/kernel/src/mm/mm-stat.c similarity index 100% rename from kernel/mm/mm-stat.c rename to kernel/src/mm/mm-stat.c diff --git a/kernel/mm/mm-types.h b/kernel/src/mm/mm-types.h similarity index 100% rename from kernel/mm/mm-types.h rename to kernel/src/mm/mm-types.h diff --git a/kernel/mm/mm.c b/kernel/src/mm/mm.c similarity index 100% rename from kernel/mm/mm.c rename to kernel/src/mm/mm.c diff --git a/kernel/mm/mm.h b/kernel/src/mm/mm.h similarity index 98% rename from kernel/mm/mm.h rename to kernel/src/mm/mm.h index 75ea7c37..7fe96b0b 100644 --- a/kernel/mm/mm.h +++ b/kernel/src/mm/mm.h @@ -10,12 +10,12 @@ #define PTRS_PER_PGT 512 // 内核层的起始地址 -#define PAGE_OFFSET (0xffff800000000000UL) -#define KERNEL_BASE_LINEAR_ADDR (0xffff800000000000UL) +#define PAGE_OFFSET 0xffff800000000000UL +#define KERNEL_BASE_LINEAR_ADDR 0xffff800000000000UL #define USER_MAX_LINEAR_ADDR 0x00007fffffffffffUL // MMIO虚拟地址空间:1TB -#define MMIO_BASE (0xffffa10000000000UL) -#define MMIO_TOP (0xffffa20000000000UL) +#define MMIO_BASE 0xffffa10000000000UL +#define MMIO_TOP 0xffffa20000000000UL #define PAGE_4K_SHIFT 12 #define PAGE_2M_SHIFT 21 diff --git a/kernel/mm/mmap.c b/kernel/src/mm/mmap.c similarity index 100% rename from kernel/mm/mmap.c rename to kernel/src/mm/mmap.c diff --git a/kernel/mm/mmio-buddy.c b/kernel/src/mm/mmio-buddy.c similarity index 100% rename from kernel/mm/mmio-buddy.c rename to kernel/src/mm/mmio-buddy.c diff --git a/kernel/mm/mmio-buddy.h b/kernel/src/mm/mmio-buddy.h similarity index 100% rename from kernel/mm/mmio-buddy.h rename to kernel/src/mm/mmio-buddy.h diff --git a/kernel/mm/mmio.c b/kernel/src/mm/mmio.c similarity index 100% rename from kernel/mm/mmio.c rename to kernel/src/mm/mmio.c diff --git a/kernel/mm/mmio.h b/kernel/src/mm/mmio.h similarity index 100% rename from kernel/mm/mmio.h rename to kernel/src/mm/mmio.h diff --git a/kernel/mm/slab.c b/kernel/src/mm/slab.c similarity index 100% rename from kernel/mm/slab.c rename to kernel/src/mm/slab.c diff --git a/kernel/mm/slab.h b/kernel/src/mm/slab.h similarity index 100% rename from kernel/mm/slab.h rename to kernel/src/mm/slab.h diff --git a/kernel/mm/utils.c b/kernel/src/mm/utils.c similarity index 100% rename from kernel/mm/utils.c rename to kernel/src/mm/utils.c diff --git a/kernel/mm/vma.c b/kernel/src/mm/vma.c similarity index 100% rename from kernel/mm/vma.c rename to kernel/src/mm/vma.c diff --git a/kernel/process/Makefile b/kernel/src/process/Makefile similarity index 100% rename from kernel/process/Makefile rename to kernel/src/process/Makefile diff --git a/kernel/process/kthread.c b/kernel/src/process/kthread.c similarity index 100% rename from kernel/process/kthread.c rename to kernel/src/process/kthread.c diff --git a/kernel/process/preempt.h b/kernel/src/process/preempt.h similarity index 100% rename from kernel/process/preempt.h rename to kernel/src/process/preempt.h diff --git a/kernel/process/proc-types.h b/kernel/src/process/proc-types.h similarity index 100% rename from kernel/process/proc-types.h rename to kernel/src/process/proc-types.h diff --git a/kernel/process/proc.S b/kernel/src/process/proc.S similarity index 100% rename from kernel/process/proc.S rename to kernel/src/process/proc.S diff --git a/kernel/process/process.c b/kernel/src/process/process.c similarity index 100% rename from kernel/process/process.c rename to kernel/src/process/process.c diff --git a/kernel/process/process.h b/kernel/src/process/process.h similarity index 100% rename from kernel/process/process.h rename to kernel/src/process/process.h diff --git a/kernel/process/ptrace.h b/kernel/src/process/ptrace.h similarity index 100% rename from kernel/process/ptrace.h rename to kernel/src/process/ptrace.h diff --git a/kernel/sched/Makefile b/kernel/src/sched/Makefile similarity index 100% rename from kernel/sched/Makefile rename to kernel/src/sched/Makefile diff --git a/kernel/sched/cfs.c b/kernel/src/sched/cfs.c similarity index 100% rename from kernel/sched/cfs.c rename to kernel/src/sched/cfs.c diff --git a/kernel/sched/cfs.h b/kernel/src/sched/cfs.h similarity index 100% rename from kernel/sched/cfs.h rename to kernel/src/sched/cfs.h diff --git a/kernel/sched/completion.c b/kernel/src/sched/completion.c similarity index 100% rename from kernel/sched/completion.c rename to kernel/src/sched/completion.c diff --git a/kernel/sched/sched.c b/kernel/src/sched/sched.c similarity index 100% rename from kernel/sched/sched.c rename to kernel/src/sched/sched.c diff --git a/kernel/sched/sched.h b/kernel/src/sched/sched.h similarity index 100% rename from kernel/sched/sched.h rename to kernel/src/sched/sched.h diff --git a/kernel/smp/Makefile b/kernel/src/smp/Makefile similarity index 100% rename from kernel/smp/Makefile rename to kernel/src/smp/Makefile diff --git a/kernel/smp/apu_boot.S b/kernel/src/smp/apu_boot.S similarity index 100% rename from kernel/smp/apu_boot.S rename to kernel/src/smp/apu_boot.S diff --git a/kernel/smp/ipi.h b/kernel/src/smp/ipi.h similarity index 100% rename from kernel/smp/ipi.h rename to kernel/src/smp/ipi.h diff --git a/kernel/smp/smp.c b/kernel/src/smp/smp.c similarity index 100% rename from kernel/smp/smp.c rename to kernel/src/smp/smp.c diff --git a/kernel/smp/smp.h b/kernel/src/smp/smp.h similarity index 100% rename from kernel/smp/smp.h rename to kernel/src/smp/smp.h diff --git a/kernel/syscall/Makefile b/kernel/src/syscall/Makefile similarity index 100% rename from kernel/syscall/Makefile rename to kernel/src/syscall/Makefile diff --git a/kernel/syscall/syscall.c b/kernel/src/syscall/syscall.c similarity index 100% rename from kernel/syscall/syscall.c rename to kernel/src/syscall/syscall.c diff --git a/kernel/syscall/syscall.h b/kernel/src/syscall/syscall.h similarity index 100% rename from kernel/syscall/syscall.h rename to kernel/src/syscall/syscall.h diff --git a/kernel/syscall/syscall_num.h b/kernel/src/syscall/syscall_num.h similarity index 100% rename from kernel/syscall/syscall_num.h rename to kernel/src/syscall/syscall_num.h diff --git a/kernel/time/Makefile b/kernel/src/time/Makefile similarity index 100% rename from kernel/time/Makefile rename to kernel/src/time/Makefile diff --git a/kernel/time/sleep.c b/kernel/src/time/sleep.c similarity index 100% rename from kernel/time/sleep.c rename to kernel/src/time/sleep.c diff --git a/kernel/time/sleep.h b/kernel/src/time/sleep.h similarity index 100% rename from kernel/time/sleep.h rename to kernel/src/time/sleep.h diff --git a/kernel/time/timer.c b/kernel/src/time/timer.c similarity index 100% rename from kernel/time/timer.c rename to kernel/src/time/timer.c diff --git a/kernel/time/timer.h b/kernel/src/time/timer.h similarity index 100% rename from kernel/time/timer.h rename to kernel/src/time/timer.h diff --git a/run.sh b/run.sh deleted file mode 100755 index 7d93660f..00000000 --- a/run.sh +++ /dev/null @@ -1,186 +0,0 @@ -# ======检查是否以sudo运行================= -uid=`id -u` -if [ ! $uid == "0" ];then - echo "请以sudo权限运行" - exit -fi -GENERATE_ISO=0 -IN_DOCKER=0 - -IA32_USE_QEMU=1 -bochsrc="./bochsrc" -ARCH="x86_64" - -for i in "$@" -do - if [ $i == "--no-qemu" ];then - IA32_USE_QEMU=0 - fi -done - -if [ ${IA32_USE_QEMU} == "1" ];then - export EMULATOR=__QEMU_EMULATION__ -else - export EMULATOR=__NO_EMULATION__ -fi - -# 第一个参数如果是--notbuild 那就不构建,直接运行 -if [ ! "$1" == "--nobuild" ]; then - echo "开始构建..." - if [ "$1" == "--docker" ]; then - echo "使用docker构建" - sudo bash tools/build_in_docker.sh - GENERATE_ISO=0 - elif [ "$1" == "--current_in_docker" ]; then - echo "运行在docker内" - IN_DOCKER=1 - make all -j 16 - if [ "$?" != "0" ]; then\ - echo "DragonOS编译失败";\ - exit 1;\ - fi;\ - make clean - GENERATE_ISO=1 - else - - make all -j 16 - if [ "$?" != "0" ]; then\ - echo "DragonOS编译失败";\ - exit 1;\ - fi;\ - make clean - GENERATE_ISO=1 - fi -fi - - -# 内核映像 -root_folder="$(pwd)" -kernel="${root_folder}/bin/kernel/kernel.elf" -boot_folder="${root_folder}/bin/disk_mount/boot" - -if [ "${GENERATE_ISO}" == "1" ]; then - echo "开始生成iso..." - - # toolchain - OS=`uname -s` - if [ "${OS}" == "Linux" ]; then - GRUB_PATH="$(dirname $(which grub-file))" - elif [ "${OS}" == "Darwin" ]; then - GRUB_PATH="$(pwd)/tools/grub-2.06/build/grub/bin" - fi - export PATH="${GRUB_PATH}:$PATH" - - # ==============检查文件是否齐全================ - - - bins[0]=${kernel} - - for file in ${bins[*]};do - if [ ! -x $file ]; then - echo "$file 不存在!" - exit - fi - done - - # ===============文件检查完毕=================== - - # 如果是 i386/x86_64,需要判断是否符合 multiboot2 标准 - if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then - if ${GRUB_PATH}/grub-file --is-x86-multiboot2 ${kernel}; then - echo Multiboot2 Confirmed! - else - echo NOT Multiboot2! - exit - fi - fi - - # 拷贝程序到硬盘 - cd tools - # 判断是否存在硬盘镜像文件,如果不存在,就创建一个(docker模式下,由于镜像中缺少qemu-img不会创建) - if [ ! -f "${root_folder}/bin/disk.img" ]; then - echo "创建硬盘镜像文件..." - bash ./create_hdd_image.sh - fi - - mkdir -p ${root_folder}/bin/disk_mount - bash mount_virt_disk.sh || exit 1 - mkdir -p ${boot_folder}/grub - cp ${kernel} ${root_folder}/bin/disk_mount/boot - # 拷贝用户程序到磁盘镜像 - mkdir -p ${root_folder}/bin/disk_mount/bin - mkdir -p ${root_folder}/bin/disk_mount/dev - - cp -r ${root_folder}/bin/user/* ${root_folder}/bin/disk_mount/bin - touch ${root_folder}/bin/disk_mount/dev/keyboard.dev - - - # 设置 grub 相关数据 - if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then - - touch ${root_folder}/bin/disk_mount/boot/grub/grub.cfg -cfg_content='set timeout=15 - set default=0 - menuentry "DragonOS" { - multiboot2 /boot/kernel.elf "KERNEL_ELF" - }' - echo "echo '${cfg_content}' > ${boot_folder}/grub/grub.cfg" | sh - fi - - - # ${GRUB_PATH}/grub-mkrescue -o ${iso} ${iso_folder} - # rm -rf ${iso_folder} - LOOP_DEVICE=$(lsblk | grep disk_mount|sed 's/.*\(loop[0-9]*\)p1.*/\1/1g'|awk 'END{print $0}') - echo $LOOP_DEVICE - - grub-install --target=i386-pc --boot-directory=${root_folder}/bin/disk_mount/boot/ /dev/$LOOP_DEVICE - - sync - bash umount_virt_disk.sh - cd .. - - if [ "${IN_DOCKER}" == "1" ]; then - echo "运行在docker中, 构建结束" - exit 0 - fi -fi - - -# 进行启动前检查 -flag_can_run=1 - - -allflags=$(qemu-system-x86_64 -cpu help | awk '/flags/ {y=1; getline}; y {print}' | tr ' ' '\n' | grep -Ev "^$" | sed -r 's|^|+|' | tr '\n' ',' | sed -r "s|,$||") - -# 请根据自己的需要,在-d 后方加入所需的trace事件 - -# 标准的trace events -qemu_trace_std=cpu_reset,guest_errors,trace:check_exception,exec,cpu -# 调试usb的trace -qemu_trace_usb=trace:usb_xhci_reset,trace:usb_xhci_run,trace:usb_xhci_stop,trace:usb_xhci_irq_msi,trace:usb_xhci_irq_msix,trace:usb_xhci_port_reset,trace:msix_write_config,trace:usb_xhci_irq_msix,trace:usb_xhci_irq_msix_use,trace:usb_xhci_irq_msix_unuse,trace:usb_xhci_irq_msi,trace:usb_xhci_* - - -qemu_accel=kvm -if [ $(uname) == Darwin ]; then - qemu_accel=hvf -fi - -if [ $flag_can_run -eq 1 ]; then - if [ ${IA32_USE_QEMU} == 0 ]; then - bochs -q -f ${bochsrc} -rc ./tools/bochsinit - else - qemu-system-x86_64 -d bin/disk.img -m 512M -smp 2,cores=2,threads=1,sockets=1 \ - -boot order=d \ - -monitor stdio -d ${qemu_trace_std} \ - -s -S -cpu IvyBridge,apic,x2apic,+fpu,check,${allflags} -rtc clock=host,base=localtime -serial file:serial_opt.txt \ - -drive id=disk,file=bin/disk.img,if=none \ - -device ahci,id=ahci \ - -device ide-hd,drive=disk,bus=ahci.0 \ - -net nic,model=virtio \ - -usb \ - -device qemu-xhci,id=xhci,p2=8,p3=4 \ - -machine accel=${qemu_accel} - fi -else - echo "不满足运行条件" -fi \ No newline at end of file diff --git a/tools/bootstrap.sh b/tools/bootstrap.sh new file mode 100644 index 00000000..ff5a5bbe --- /dev/null +++ b/tools/bootstrap.sh @@ -0,0 +1,179 @@ +emulator="qemu" +defpackman="apt-get" + +banner() +{ + echo "|------------------------------------------|" + echo "| Welcome to the DragonOS bootstrap |" + echo "|------------------------------------------|" +} + +congratulations() +{ + echo "|-----------Congratulations!---------------|" + echo "| |" + echo "| 你成功安装了DragonOS所需的依赖项! |" + echo "| 您可以通过以下命令运行它: |" + echo "| |" + echo "| make run-docker -j 你的cpu核心数 |" + echo "| |" + echo "|------------------------------------------|" +} + +#################################### +# 当检测到ubuntu或Debian时,执行此函数 # +# 参数:第一个参数为包管理器 # +#################################### +install_ubuntu_debian_pkg() +{ + echo "检测到 Ubuntu/Debian" + echo "正在更新包管理器的列表..." + sudo "$1" update + echo "正在安装所需的包..." + sudo "$1" install -y \ + ca-certificates \ + curl \ + gnupg \ + lsb-release \ + llvm-dev libclang-dev clang gcc-multilib \ + gcc build-essential fdisk + + if [ -z "$(which docker)" ]; then + echo "正在安装docker..." + exit 1 + sudo mkdir -p /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo $1 update + sudo "$1" install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + else + echo "您的计算机上已经安装了docker" + fi + + if [ -z "$(which qemu-system-x86_64)" ]; then + echo "正在安装QEMU虚拟机..." + sudo $1 install -y qemu qemu-system qemu-kvm + else + echo "QEMU已经在您的电脑上安装!" + fi + +} + +install_osx_pkg() +{ + echo "Detected OSX! 暂不支持Mac OSX的一键安装!" + exit 1 +} + +#################################################################################### +# This function takes care of everything associated to rust, and the version manager +# That controls it, it can install rustup and uninstall multirust as well as making +# sure that the correct version of rustc is selected by rustup +#################################################################################### +rustInstall() { + # Check to see if multirust is installed, we don't want it messing with rustup + # In the future we can probably remove this but I believe it's good to have for now + if [ -e /usr/local/lib/rustlib/uninstall.sh ] ; then + echo "您的系统上似乎安装了multirust。" + echo "该工具已被维护人员弃用,并将导致问题。" + echo "如果您愿意,此脚本可以从系统中删除multirust" + printf "卸载 multirust (y/N):" + read multirust + if echo "$multirust" | grep -iq "^y" ;then + sudo /usr/local/lib/rustlib/uninstall.sh + else + echo "请手动卸载multistrust和任何其他版本的rust,然后重新运行bootstrap.sh" + exit + fi + fi + # If rustup is not installed we should offer to install it for them + if [ -z "$(which rustup)" ]; then + echo "您没有安装rustup," + echo "我们强烈建议使用rustup, 是否要立即安装?" + echo "*WARNING* 这将会发起这样的一个命令 'curl | sh' " + printf "(y/N): " + read rustup + if echo "$rustup" | grep -iq "^y" ;then + #install rustup + curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly + # You have to add the rustup variables to the $PATH + echo "export PATH=\"\$HOME/.cargo/bin:\$PATH\"" >> ~/.bashrc + # source the variables so that we can execute rustup commands in the current shell + source ~/.cargo/env + source "$HOME/.cargo/env" + else + echo "Rustup will not be installed!" + fi + fi + # + if [ -z "$(which rustc)" ]; then + echo "Rust 还未被安装" + echo "请再次运行脚本,接受rustup安装" + echo "或通过以下方式手动安装rustc(不推荐):" + echo "curl -sSf https://static.rust-lang.org/rustup.sh | sh -s -- --channel=nightly" + exit + else + echo "是否为Rust换源为Gitee镜像源?" + echo "如果您在国内,我们推荐您这样做,以提升网络速度。" + echo "*WARNING* 这将会替换原有的镜像源设置。" + printf "(y/N): " + read change_src + if echo "$change_src" | grep -iq "^y" ;then + touch ~/.cargo/config + bash change_rust_src.sh + else + echo "取消换源,您原有的配置不会被改变。" + fi + echo "正在安装DragonOS所需的rust组件...首次安装需要一些时间来更新索引,请耐心等待..." + cargo install cargo-binutils + rustup toolchain install nightly + rustup default nightly + rustup component add rust-src + rustup component add llvm-tools-preview + rustup target add x86_64-unknown-none + echo "Rust已经成功的在您的计算机上安装!请运行 source ~/.cargo/env 以使rust在当前窗口生效!" + fi +} + +############ 开始执行 ############### +banner +rustInstall +exit +if [ "Darwin" == "$(uname -s)" ]; then + install_osx_pkg "$emulator" || exit 1 +else + # Here we will use package managers to determine which operating system the user is using. + + # Suse and derivatives + if hash 2>/dev/null zypper; then + suse "$emulator" || exit 1 + # Debian or any derivative of it + elif hash 2>/dev/null apt-get; then + install_ubuntu_debian_pkg "$defpackman" || exit 1 + # Fedora + elif hash 2>/dev/null dnf; then + fedora "$emulator" || exit 1 + # Gentoo + elif hash 2>/dev/null emerge; then + gentoo "$emulator" || exit 1 + # SolusOS + elif hash 2>/dev/null eopkg; then + solus "$emulator" || exit 1 + # Arch linux + elif hash 2>/dev/null pacman; then + archLinux "$emulator" || exit 1 + # FreeBSD + elif hash 2>/dev/null pkg; then + freebsd "$emulator" || exit 1 + # Unsupported platform + else + printf "\e[31;1mFatal error: \e[0;31mUnsupported platform, please open an issue\[0m" || exit 1 + fi +fi + +# 创建磁盘镜像 +sudo bash create_hdd_image.sh + +congratulations \ No newline at end of file diff --git a/tools/build_in_docker.sh b/tools/build_in_docker.sh index 5c89f6a2..1c92fa41 100644 --- a/tools/build_in_docker.sh +++ b/tools/build_in_docker.sh @@ -1,7 +1,10 @@ docker rm -f dragonos-build || echo "No existed container" p=`pwd` cpu_count=$(cat /proc/cpuinfo |grep "processor"|wc -l) -docker run --rm --privileged=true --cap-add SYS_ADMIN --cap-add MKNOD -v $p:/data -v /dev:/dev --name dragonos-build -i dragonos/dragonos-dev:v1.0 bash << EOF +docker run --rm --privileged=true --cap-add SYS_ADMIN --cap-add MKNOD -v $p:/data -v /dev:/dev -v dragonos-build-cargo:/root/.cargo/registry --name dragonos-build -i dragonos/dragonos-dev:v1.1.0-beta3 bash << EOF +source ~/.cargo/env cd /data -bash run.sh --current_in_docker +# Change rust src +bash tools/change_rust_src.sh +make all -j $cpu_count && make write_diskimage EOF \ No newline at end of file diff --git a/tools/change_rust_src.sh b/tools/change_rust_src.sh new file mode 100644 index 00000000..85b14274 --- /dev/null +++ b/tools/change_rust_src.sh @@ -0,0 +1,8 @@ +# 更换Rust镜像源 +echo -e "[source.crates-io] \n \ +registry = \"https://github.com/rust-lang/crates.io-index\" \n \ +\n \ +replace-with = 'dragonos-gitee' \n \ +[source.dragonos-gitee] \n \ +registry = \"https://gitee.com/DragonOS/crates.io-index.git\" \n \ +" > ~/.cargo/config \ No newline at end of file diff --git a/tools/run-qemu.sh b/tools/run-qemu.sh new file mode 100644 index 00000000..fe02a5ce --- /dev/null +++ b/tools/run-qemu.sh @@ -0,0 +1,36 @@ +# 进行启动前检查 +flag_can_run=1 + + +allflags=$(qemu-system-x86_64 -cpu help | awk '/flags/ {y=1; getline}; y {print}' | tr ' ' '\n' | grep -Ev "^$" | sed -r 's|^|+|' | tr '\n' ',' | sed -r "s|,$||") + +# 请根据自己的需要,在-d 后方加入所需的trace事件 + +# 标准的trace events +qemu_trace_std=cpu_reset,guest_errors,trace:check_exception,exec,cpu +# 调试usb的trace +qemu_trace_usb=trace:usb_xhci_reset,trace:usb_xhci_run,trace:usb_xhci_stop,trace:usb_xhci_irq_msi,trace:usb_xhci_irq_msix,trace:usb_xhci_port_reset,trace:msix_write_config,trace:usb_xhci_irq_msix,trace:usb_xhci_irq_msix_use,trace:usb_xhci_irq_msix_unuse,trace:usb_xhci_irq_msi,trace:usb_xhci_* + + +qemu_accel=kvm +if [ $(uname) == Darwin ]; then + qemu_accel=hvf +fi + +if [ $flag_can_run -eq 1 ]; then + + qemu-system-x86_64 -d ../bin/disk.img -m 512M -smp 2,cores=2,threads=1,sockets=1 \ + -boot order=d \ + -monitor stdio -d ${qemu_trace_std} \ + -s -S -cpu IvyBridge,apic,x2apic,+fpu,check,${allflags} -rtc clock=host,base=localtime -serial file:../serial_opt.txt \ + -drive id=disk,file=../bin/disk.img,if=none \ + -device ahci,id=ahci \ + -device ide-hd,drive=disk,bus=ahci.0 \ + -net nic,model=virtio \ + -usb \ + -device qemu-xhci,id=xhci,p2=8,p3=4 \ + -machine accel=${qemu_accel} + +else + echo "不满足运行条件" +fi \ No newline at end of file diff --git a/tools/write_disk_image.sh b/tools/write_disk_image.sh new file mode 100644 index 00000000..cecff432 --- /dev/null +++ b/tools/write_disk_image.sh @@ -0,0 +1,79 @@ +ARCH="x86_64" +# 内核映像 +root_folder=$(dirname $(pwd)) +kernel="${root_folder}/bin/kernel/kernel.elf" +boot_folder="${root_folder}/bin/disk_mount/boot" + +echo "开始写入磁盘镜像..." + + +# toolchain +OS=`uname -s` +if [ "${OS}" == "Linux" ]; then + GRUB_PATH="$(dirname $(which grub-file))" +elif [ "${OS}" == "Darwin" ]; then + GRUB_PATH="${root_folder}/tools/grub-2.06/build/grub/bin" +fi +export PATH="${GRUB_PATH}:$PATH" + +# ==============检查文件是否齐全================ + +bins[0]=${kernel} + +for file in ${bins[*]};do +if [ ! -x $file ]; then +echo "$file 不存在!" +exit +fi +done + +# ===============文件检查完毕=================== + +# 如果是 i386/x86_64,需要判断是否符合 multiboot2 标准 +if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then + if ${GRUB_PATH}/grub-file --is-x86-multiboot2 ${kernel}; then + echo Multiboot2 Confirmed! + else + echo NOT Multiboot2! + exit + fi +fi + +# 拷贝程序到硬盘 +# 判断是否存在硬盘镜像文件,如果不存在,就创建一个(docker模式下,由于镜像中缺少qemu-img不会创建) +if [ ! -f "${root_folder}/bin/disk.img" ]; then + echo "创建硬盘镜像文件..." + sudo bash ./create_hdd_image.sh +fi + +mkdir -p ${root_folder}/bin/disk_mount +bash mount_virt_disk.sh || exit 1 +mkdir -p ${boot_folder}/grub +cp ${kernel} ${root_folder}/bin/disk_mount/boot +# 拷贝用户程序到磁盘镜像 +mkdir -p ${root_folder}/bin/disk_mount/bin +mkdir -p ${root_folder}/bin/disk_mount/dev + +cp -r ${root_folder}/bin/user/* ${root_folder}/bin/disk_mount/bin +touch ${root_folder}/bin/disk_mount/dev/keyboard.dev + +# 设置 grub 相关数据 +if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then + + touch ${root_folder}/bin/disk_mount/boot/grub/grub.cfg +cfg_content='set timeout=15 + set default=0 + menuentry "DragonOS" { + multiboot2 /boot/kernel.elf "KERNEL_ELF" +}' +echo "echo '${cfg_content}' > ${boot_folder}/grub/grub.cfg" | sh +fi + +# rm -rf ${iso_folder} +LOOP_DEVICE=$(lsblk | grep disk_mount|sed 's/.*\(loop[0-9]*\)p1.*/\1/1g'|awk 'END{print $0}') +echo $LOOP_DEVICE + +grub-install --target=i386-pc --boot-directory=${root_folder}/bin/disk_mount/boot/ /dev/$LOOP_DEVICE + +sync +bash umount_virt_disk.sh