DragonOS/run.sh
2022-07-28 13:03:36 +08:00

157 lines
4.4 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ======检查是否以sudo运行=================
uid=`id -u`
if [ ! $uid == "0" ];then
echo "请以sudo权限运行"
exit
fi
GENERATE_ISO=0
IN_DOCKER=0
# 第一个参数如果是--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
make clean
GENERATE_ISO=1
else
make all -j 16
make clean
GENERATE_ISO=1
fi
fi
IA32_USE_QEMU=1
bochsrc="./bochsrc"
ARCH="x86_64"
# 内核映像
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
cp ${root_folder}/bin/user/shell.elf ${root_folder}/bin/disk_mount
cp ${root_folder}/bin/user/about.elf ${root_folder}/bin/disk_mount
mkdir -p ${root_folder}/bin/disk_mount/dev
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)
grub-install --target=i386-pc --boot-directory=${root_folder}/bin/disk_mount/boot/ /dev/${LOOP_DEVICE:2:5}
sync
bash umount_virt_disk.sh
cd ..
if [ "${IN_DOCKER}" == "1" ]; then
echo "运行在docker中, 构建结束"
exit 0
fi
fi
# 进行启动前检查
flag_can_run=1
# if [ -d "${iso_folder}" ]; then
# flag_can_run=0
# echo "${iso_folder} 文件夹未删除!"
# else
# flag_can_run=1
# fi
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|,$||")
# 调试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
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 cpu_reset,guest_errors,trace:check_exception,exec,cpu,out_asm,in_asm,${qemu_trace_usb} \
-s -S -cpu "IvyBridge,+apic,+x2apic,+fpu,check,${allflags}" --enable-kvm -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 \
-usb \
-device qemu-xhci,id=xhci,p2=8,p3=4
fi
else
echo "不满足运行条件"
fi