From 11f78b73e7b18ef04e05e63612f8027eda0740e7 Mon Sep 17 00:00:00 2001 From: LoGin Date: Fri, 17 Nov 2023 20:05:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8kernel-build=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E6=9D=A5=E7=BC=96=E8=AF=91=E6=89=80=E6=9C=89=E7=9A=84?= =?UTF-8?q?asm=E6=96=87=E4=BB=B6=20(#445)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build-scripts/kernel_build/src/cfiles/arch/mod.rs | 3 +++ .../kernel_build/src/cfiles/arch/x86_64.rs | 9 +++++++++ build-scripts/kernel_build/src/cfiles/mod.rs | 4 ++++ kernel/src/Makefile | 13 ++++--------- kernel/src/{smp => arch/x86_64/asm}/apu_boot.S | 0 kernel/src/{exception => arch/x86_64/asm}/entry.S | 2 +- kernel/src/{ => arch/x86_64/asm}/head.S | 0 kernel/src/exception/Makefile | 6 +----- kernel/src/link.lds | 6 +++--- kernel/src/smp/Makefile | 7 +------ 10 files changed, 26 insertions(+), 24 deletions(-) rename kernel/src/{smp => arch/x86_64/asm}/apu_boot.S (100%) rename kernel/src/{exception => arch/x86_64/asm}/entry.S (99%) rename kernel/src/{ => arch/x86_64/asm}/head.S (100%) diff --git a/build-scripts/kernel_build/src/cfiles/arch/mod.rs b/build-scripts/kernel_build/src/cfiles/arch/mod.rs index 4aad8270..16c24651 100644 --- a/build-scripts/kernel_build/src/cfiles/arch/mod.rs +++ b/build-scripts/kernel_build/src/cfiles/arch/mod.rs @@ -15,6 +15,9 @@ pub(super) trait CFilesArch { fn setup_global_include_dir(&self, c: &mut Build); /// 设置需要编译的架构相关的文件 fn setup_files(&self, c: &mut Build, files: &mut Vec); + + /// 设置架构相关的全局编译标志 + fn setup_global_flags(&self, c: &mut Build); } /// 获取当前的架构; diff --git a/build-scripts/kernel_build/src/cfiles/arch/x86_64.rs b/build-scripts/kernel_build/src/cfiles/arch/x86_64.rs index bb301a42..88e6d18c 100644 --- a/build-scripts/kernel_build/src/cfiles/arch/x86_64.rs +++ b/build-scripts/kernel_build/src/cfiles/arch/x86_64.rs @@ -25,5 +25,14 @@ impl CFilesArch for X86_64CFilesArch { Some("c"), true, )); + + // setup asm files + files.push(PathBuf::from("src/arch/x86_64/asm/head.S")); + files.push(PathBuf::from("src/arch/x86_64/asm/entry.S")); + files.push(PathBuf::from("src/arch/x86_64/asm/apu_boot.S")); + } + + fn setup_global_flags(&self, c: &mut Build) { + c.asm_flag("-m64"); } } diff --git a/build-scripts/kernel_build/src/cfiles/mod.rs b/build-scripts/kernel_build/src/cfiles/mod.rs index 7dae54f3..f06c507d 100644 --- a/build-scripts/kernel_build/src/cfiles/mod.rs +++ b/build-scripts/kernel_build/src/cfiles/mod.rs @@ -14,6 +14,7 @@ pub struct CFilesBuilder; impl CFilesBuilder { pub fn build() { let mut c = cc::Build::new(); + Self::setup_global_flags(&mut c); Self::setup_defines(&mut c); Self::setup_global_include_dir(&mut c); @@ -31,6 +32,9 @@ impl CFilesBuilder { .flag("-Wno-unused-parameter") .flag("-m64") .flag("-O1"); + + // set Arch-specific flags + current_cfiles_arch().setup_global_flags(c); } fn setup_defines(c: &mut Build) { diff --git a/kernel/src/Makefile b/kernel/src/Makefile index ec31f2ac..ac7ac8f4 100644 --- a/kernel/src/Makefile +++ b/kernel/src/Makefile @@ -23,17 +23,12 @@ CFLAGS = $(GLOBAL_CFLAGS) -fno-pie $(CFLAGS_UNWIND) -I $(shell pwd) -I $(shell p export ASFLAGS := --64 -LD_LIST := head.o +LD_LIST := "" kernel_subdirs := common driver debug arch exception smp syscall ktest libs time -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. @@ -45,7 +40,7 @@ kernel_rust: all: kernel @echo "Linking kernel..." - $(LD) -b elf64-x86-64 -z muldefs $(LDFLAGS_UNWIND) -o kernel head.o main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a -T link.lds --no-relax + $(LD) -b elf64-x86-64 -z muldefs $(LDFLAGS_UNWIND) -o kernel main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a -T link.lds --no-relax # 生成kallsyms current_dir=$(pwd) @@ -59,7 +54,7 @@ all: kernel # 重新链接 @echo "Re-Linking kernel..." @echo $(shell find . -name "*.o") - $(LD) -b elf64-x86-64 -z muldefs $(LDFLAGS_UNWIND) -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 --no-relax + $(LD) -b elf64-x86-64 -z muldefs $(LDFLAGS_UNWIND) -o kernel main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a ./debug/kallsyms.o -T link.lds --no-relax @echo "Generating kernel ELF file..." # 生成内核文件 ifeq ($(UNWIND_ENABLE), yes) @@ -76,7 +71,7 @@ $(kernel_subdirs): ECHO $(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)" kernel_root_path="$(shell pwd)" -kernel: head.o main.o $(kernel_subdirs) kernel_rust +kernel: main.o $(kernel_subdirs) kernel_rust diff --git a/kernel/src/smp/apu_boot.S b/kernel/src/arch/x86_64/asm/apu_boot.S similarity index 100% rename from kernel/src/smp/apu_boot.S rename to kernel/src/arch/x86_64/asm/apu_boot.S diff --git a/kernel/src/exception/entry.S b/kernel/src/arch/x86_64/asm/entry.S similarity index 99% rename from kernel/src/exception/entry.S rename to kernel/src/arch/x86_64/asm/entry.S index ce67d50c..a5d526c2 100644 --- a/kernel/src/exception/entry.S +++ b/kernel/src/arch/x86_64/asm/entry.S @@ -1,4 +1,4 @@ -#include"../common/asm.h" +#include .code64 //.section .text diff --git a/kernel/src/head.S b/kernel/src/arch/x86_64/asm/head.S similarity index 100% rename from kernel/src/head.S rename to kernel/src/arch/x86_64/asm/head.S diff --git a/kernel/src/exception/Makefile b/kernel/src/exception/Makefile index b0c0e3da..e4bb9d8e 100644 --- a/kernel/src/exception/Makefile +++ b/kernel/src/exception/Makefile @@ -2,11 +2,7 @@ CFLAGS += -I . -all: entry.o irq.o trap.o - -entry.o: entry.S - $(CC) -E entry.S > _entry.s - $(AS) $(ASFLAGS) -o entry.o _entry.s +all: irq.o trap.o trap.o: trap.c $(CC) $(CFLAGS) -c trap.c -o trap.o diff --git a/kernel/src/link.lds b/kernel/src/link.lds index 58fd6a82..f9011e57 100644 --- a/kernel/src/link.lds +++ b/kernel/src/link.lds @@ -13,9 +13,9 @@ SECTIONS .boot.text : { KEEP(*(.multiboot_header)) - head.o(.bootstrap) - head.o(.bootstrap.code64) - head.o(.bootstrap.data) + *(.bootstrap) + *(.bootstrap.code64) + *(.bootstrap.data) . = ALIGN(4096); } diff --git a/kernel/src/smp/Makefile b/kernel/src/smp/Makefile index 3eb62a85..eb0e63a3 100644 --- a/kernel/src/smp/Makefile +++ b/kernel/src/smp/Makefile @@ -2,12 +2,7 @@ CFLAGS += -I . -all: apu_boot.o smp.o - - -apu_boot.o: apu_boot.S - $(CC) -E apu_boot.S > _apu_boot.s # 预处理 - $(AS) $(ASFLAGS) -o apu_boot.o _apu_boot.s +all: smp.o smp.o: smp.c $(CC) $(CFLAGS) -c smp.c -o smp.o