DragonOS/run.sh
2022-08-30 20:34:52 +08:00

168 lines
4.8 KiB
Bash
Executable File
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
IA32_USE_QEMU=1
bochsrc="./bochsrc"
ARCH="x86_64"
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
make clean
GENERATE_ISO=1
else
make all -j 16
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
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|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 [ "${OS}" == "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 \
-usb \
-device qemu-xhci,id=xhci,p2=8,p3=4 \
-machine accel=${qemu_accel}
fi
else
echo "不满足运行条件"
fi