An error occurred while loading the file. Please try again.
-
陈睿玮 authored7789e077
# Building variables
DOCKER_NAME = phoenix
BOARD := qemu
NET ?=n # 是否启用VirtioNet设备,如果不开启则使用本地Loopback设备
# For submit
export PATH := /opt/riscv64-linux-musl-cross/bin:$(PATH)
export TARGET = riscv64gc-unknown-none-elf
export MODE = release
export LOG = error
export Phoenix_IP=$(IP)
export Phoenix_GW=$(GW)
# Tools
OBJDUMP = rust-objdump --arch-name=riscv64
OBJCOPY = rust-objcopy --binary-architecture=riscv64
QEMU = qemu-system-riscv64
RISCV_GDB ?= riscv64-unknown-elf-gdb
PAGER ?= less
# Target files
TARGET_DIR := ./target/$(TARGET)/$(MODE)
VENDOR_DIR := ./third-party/vendor
KERNEL_ELF := $(TARGET_DIR)/kernel
KERNEL_BIN := $(KERNEL_ELF).bin
KERNEL_ASM := $(KERNEL_ELF).asm
USER_APPS_DIR := ./user/src/bin
USER_APPS := $(wildcard $(USER_APPS_DIR)/*.rs)
USER_ELFS := $(patsubst $(USER_APPS_DIR)/%.rs, $(TARGET_DIR)/%, $(USER_APPS))
USER_BINS := $(patsubst $(USER_APPS_DIR)/%.rs, $(TARGET_DIR)/%.bin, $(USER_APPS))
FS_IMG_DIR := .
FS_IMG := $(FS_IMG_DIR)/sdcard.img
TEST := 24/final
# FS := fat32
FS := ext4
TEST_DIR := ./testcase/$(TEST)
# TEST_DIR := ./testcase/24/preliminary/
# Crate features
export STRACE :=
export SMP :=
export PREEMPT :=
export DEBUG :=
# Args
DISASM_ARGS = -d
BOOTLOADER := default
CPUS := 2
QEMU_ARGS :=
QEMU_ARGS += -m 128M
QEMU_ARGS += -machine virt
QEMU_ARGS += -nographic
QEMU_ARGS += -smp $(CPUS)
QEMU_ARGS += -kernel $(KERNEL_BIN)
QEMU_ARGS += -bios $(BOOTLOADER)
QEMU_ARGS += -drive file=$(FS_IMG),if=none,format=raw,id=x0
QEMU_ARGS += -device virtio-blk-device,drive=x0,bus=virtio-mmio-bus.0
# Net
IP ?= 10.0.2.15
GW ?= 10.0.2.2
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
ifeq ($(NET),y)
$(info "enabled qemu net device")
# 指定该网络设备使用 net0 这个网络后端,使用用户模式网络。
# 设置端口转发,将主机的 TCP 端口 5555 和 UDP 端口 5555 分别转发到虚拟机的 TCP端口 5555 和 UDP 端口 5555。
QEMU_ARGS += -device virtio-net-device,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::5555-:5555,hostfwd=udp::5555-:5555
QEMU_ARGS += -d guest_errors\
-d unimp
endif
DOCKER_RUN_ARGS := run
DOCKER_RUN_ARGS += --rm
DOCKER_RUN_ARGS += -it
DOCKER_RUN_ARGS += --privileged
DOCKER_RUN_ARGS += --network="host"
DOCKER_RUN_ARGS += -v $(PWD):/mnt
DOCKER_RUN_ARGS += -v /dev:/dev
DOCKER_RUN_ARGS += -w /mnt
DOCKER_RUN_ARGS += $(DOCKER_NAME)
DOCKER_RUN_ARGS += bash
# File targets
$(KERNEL_ASM): $(KERNEL_ELF)
@$(OBJDUMP) $(DISASM_ARGS) $(KERNEL_ELF) > $(KERNEL_ASM)
@echo "Updated: $(KERNEL_ASM)"
# Phony targets
PHONY := all
all:
@rm -rf third-party/vendor/
@mkdir third-party/vendor
@tar xvf third-party/vendor.tar.gz --directory third-party/vendor
@rm -rf .cargo
@cp -r cargo-submit .cargo
@rm -rf kernel/.cargo
@cp -r kernel/cargo-submit kernel/.cargo
@rm -rf user/.cargo
@cp -r user/cargo-submit user/.cargo
@make user kernel MODE=release
@cp ./target/riscv64gc-unknown-none-elf/release/kernel.bin kernel-qemu
PHONY += build_docker
build_docker:
docker build --network="host" -t ${DOCKER_NAME} .
PHONY += docker
docker:
docker $(DOCKER_RUN_ARGS)
PHONY += env
env:
@(cargo install --list | grep "cargo-binutils" > /dev/null 2>&1) || cargo install cargo-binutils
@cargo vendor $(VENDOR_DIR)
PHONY += fmt
fmt:
@cargo fmt
PHONY += build
build: fmt user fs-img kernel
PHONY += kernel
kernel:
@echo "building kernel..."
@echo Platform: $(BOARD)
@cd kernel && make build
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
@$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $(KERNEL_BIN)
@echo "building kernel finished"
PHONY += user
user:
@echo "building user..."
@cd user && make build
@$(foreach elf, $(USER_ELFS), $(OBJCOPY) $(elf) --strip-all -O binary $(patsubst $(TARGET_DIR)/%, $(TARGET_DIR)/%.bin, $(elf));)
@echo "building user finished"
PHONY += fs-img
fs-img:
@echo "building fs-img..."
@rm -f $(FS_IMG)
@mkdir -p $(FS_IMG_DIR)
@mkdir -p mnt
ifeq ($(FS), fat32)
@dd if=/dev/zero of=$(FS_IMG) count=1363148 bs=1K
@mkfs.vfat -F 32 $(FS_IMG)
@echo "making fatfs image by using $(TEST_DIR)"
@mount -t vfat -o user,umask=000,utf8=1 --source $(FS_IMG) --target mnt
else
@dd if=/dev/zero of=$(FS_IMG) count=2048 bs=1M
# @mkfs.ext4 $(FS_IMG)
@mkfs.ext4 -F -O ^metadata_csum_seed $(FS_IMG)
@echo "making ext4 image by using $(TEST_DIR)"
@mount $(FS_IMG) mnt
endif
@cp -r $(TEST_DIR)/* mnt
@cp -r $(USER_ELFS) mnt
@umount mnt
@rm -rf mnt
@chmod 777 $(FS_IMG)
@echo "building fs-img finished"
PHONY += qemu
qemu:
@echo "start to run kernel in qemu..."
$(QEMU) $(QEMU_ARGS)
PHONY += dumpdtb
dumpdtb:
$(QEMU) $(QEMU_ARGS) -machine dumpdtb=riscv64-virt.dtb
dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb
PHONY += run
run: qemu
PHONY += brun
brun: fmt clean-cargo user kernel run
PHONY += clean
clean:
@cargo clean
@rm -rf $(FS_IMG)
PHONY += clean-cargo
clean-cargo:
@cargo clean
PHONY += disasm
disasm: $(KERNEL_ASM)
@$(PAGER) $(KERNEL_ASM)
PHONY += trace
trace:
addr2line -fipe $(KERNEL_ELF) | rustfilt
PHONY += drun
drun: fmt clean-cargo user kernel