diff --git a/.gitignore b/.gitignore index ad452815..7782556c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ /cmake-build-debug/ /bin/ +tools/arch/i386/bios/grub/* +tools/arch/i386/efi/grub/* +tools/arch/x86_64/efi/grub/* +!.gitkeep DragonOS.iso .idea/ kernel/kernel @@ -9,7 +13,6 @@ kernel/kernel *.s serial_opt.txt user/sys_api_lib - docs/_build draft cppcheck.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/customTargets.xml b/.idea/customTargets.xml deleted file mode 100644 index 24a2d593..00000000 --- a/.idea/customTargets.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/dragonOS.iml b/.idea/dragonOS.iml deleted file mode 100644 index f08604bb..00000000 --- a/.idea/dragonOS.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 79b3c948..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 7dcc9e44..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Makefile b/Makefile index 58d96078..94ff8a1a 100644 --- a/Makefile +++ b/Makefile @@ -66,11 +66,11 @@ gdb: # 写入磁盘镜像 write_diskimage: - sudo sh -c "cd tools && bash $(ROOT_PATH)/tools/write_disk_image.sh --bios=legacy && cd .." + sudo sh -c "cd tools && bash grub_auto_install.sh && bash $(ROOT_PATH)/tools/write_disk_image.sh --bios=legacy && cd .." # 写入磁盘镜像(uefi) write_diskimage-uefi: - sudo sh -c "cd tools && bash $(ROOT_PATH)/tools/write_disk_image.sh --bios=uefi && cd .." + sudo sh -c "cd tools && bash grub_auto_install.sh && bash $(ROOT_PATH)/tools/write_disk_image.sh --bios=uefi && cd .." # 不编译,直接启动QEMU qemu: sh -c "cd tools && bash run-qemu.sh --bios=legacy && cd .." diff --git a/tools/arch/i386/bios/grub/.gitkeep b/tools/arch/i386/bios/grub/.gitkeep new file mode 100644 index 00000000..c6a5447c --- /dev/null +++ b/tools/arch/i386/bios/grub/.gitkeep @@ -0,0 +1,3 @@ +# Ignore everything in this directory +* +# Except this file !.gitkeep diff --git a/tools/arch/i386/efi/OVMF-pure-efi.fd b/tools/arch/i386/efi/OVMF-pure-efi.fd new file mode 100644 index 00000000..3fef902d Binary files /dev/null and b/tools/arch/i386/efi/OVMF-pure-efi.fd differ diff --git a/tools/arch/i386/efi/grub/.gitkeep b/tools/arch/i386/efi/grub/.gitkeep new file mode 100644 index 00000000..c6a5447c --- /dev/null +++ b/tools/arch/i386/efi/grub/.gitkeep @@ -0,0 +1,3 @@ +# Ignore everything in this directory +* +# Except this file !.gitkeep diff --git a/tools/arch/x86_64/OVMF.fd b/tools/arch/x86_64/OVMF.fd deleted file mode 100644 index 4b1cb364..00000000 Binary files a/tools/arch/x86_64/OVMF.fd and /dev/null differ diff --git a/tools/arch/x86_64/efi/OVMF-pure-efi.fd b/tools/arch/x86_64/efi/OVMF-pure-efi.fd new file mode 100644 index 00000000..a2f39dfa Binary files /dev/null and b/tools/arch/x86_64/efi/OVMF-pure-efi.fd differ diff --git a/tools/arch/x86_64/efi/grub/.gitkeep b/tools/arch/x86_64/efi/grub/.gitkeep new file mode 100644 index 00000000..c6a5447c --- /dev/null +++ b/tools/arch/x86_64/efi/grub/.gitkeep @@ -0,0 +1,3 @@ +# Ignore everything in this directory +* +# Except this file !.gitkeep diff --git a/tools/bootstrap.sh b/tools/bootstrap.sh index e9151f9b..f1f11edd 100644 --- a/tools/bootstrap.sh +++ b/tools/bootstrap.sh @@ -177,7 +177,7 @@ fi # 创建磁盘镜像 bash create_hdd_image.sh - +bash grub_auto_install.sh # 解决kvm权限问题 USR=$USER sudo adduser $USR kvm diff --git a/tools/grub_auto_install.sh b/tools/grub_auto_install.sh new file mode 100644 index 00000000..b84dafae --- /dev/null +++ b/tools/grub_auto_install.sh @@ -0,0 +1,59 @@ +#!/bin/bash +grub_dir_i386_efi=arch/i386/efi/grub +grub_dir_i386_bios=arch/i386/bios/grub +grub_dir_x86_64_efi=arch/x86_64/efi/grub +#编译核心数目 +nproc=8 + +#检测grub是否已经安装 +if [ -d ${grub_dir_i386_efi}/bin ] || [ -d ${grub_dir_i386_bios}/bin ] || [ -d ${grub_dir_x86_64_efi}/bin ] ; then + exit 0 +fi +#仅支持Ubuntu/Debain下的自动安装 +if ! hash 2>/dev/null apt-get; then + echo "脚本暂不支持对该系统下grub的安装,请手动完成" + exit 0 +fi +#下载grub2.06 +echo "开始下载grub2.06" +wget https://ftp.gnu.org/gnu/grub/grub-2.06.tar.gz +echo "下载完成" +tar -xvzf grub-2.06.tar.gz +#安装对应依赖 +sudo apt-get update +sudo apt-get install -y \ + make \ + binutils \ + bison \ + gcc \ + gettext \ + flex\ + bison\ + automake\ + autoconf\ + +cd grub-2.06 +echo "开始安装grub2.06" +#编译安装三个版本的grub +./configure --target=i386 --prefix=$(dirname $PWD)/${grub_dir_i386_bios} +make -j $(nporc) +make install +make clean + +./configure --target=i386 --with-platform=efi --prefix=$(dirname $PWD)/${grub_dir_i386_efi} +make -j $(nporc) +make install +make clean + +./configure --target=x86_64 --with-platform=efi --prefix=$(dirname $PWD)/${grub_dir_x86_64_efi} +make -j $(nporc) +make install + +cd .. +#解除权限限制 +sudo chmod -R 777 ${grub_dir_i386_bios} +sudo chmod -R 777 ${grub_dir_i386_efi} +sudo chmod -R 777 ${grub_dir_x86_64_efi} +rm -rf grub-2.06 +rm grub-2.06.tar.gz +echo "grub2.06安装完成" diff --git a/tools/run-qemu.sh b/tools/run-qemu.sh index 15f23f6f..0595479c 100644 --- a/tools/run-qemu.sh +++ b/tools/run-qemu.sh @@ -4,7 +4,8 @@ ARGS=`getopt -o p -l bios: -- "$@"` eval set -- "${ARGS}" echo "$@" 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|,$||") - +ARCH="x86_64" +#ARCH="i386" # 请根据自己的需要,在-d 后方加入所需的trace事件 # 标准的trace events @@ -40,7 +41,11 @@ if [ $flag_can_run -eq 1 ]; then --bios) case "$2" in uefi) #uefi启动新增ovmf.fd固件 - ${QEMU} -bios arch/X86_64/OVMF.fd ${QEMU_ARGUMENT} + if [ ${ARCH} == x86_64 ] ;then + ${QEMU} -bios arch/x86_64/efi/OVMF-pure-efi.fd ${QEMU_ARGUMENT} + elif [ ${ARCH} == i386 ] ;then + ${QEMU} -bios arch/i386/efi/OVMF-pure-efi.fd ${QEMU_ARGUMENT} + fi ;; legacy) ${QEMU} ${QEMU_ARGUMENT} diff --git a/tools/write_disk_image.sh b/tools/write_disk_image.sh index 4b3e7ccf..9483fe2d 100644 --- a/tools/write_disk_image.sh +++ b/tools/write_disk_image.sh @@ -5,9 +5,11 @@ # 用法:bash write_disk_image.sh --bios legacy/uefi # 如果之前创建的disk.img是MBR分区表,那么请这样运行它:bash write_disk_image.sh --bios legacy # 如果之前创建的disk.img是GPT分区表,那么请这样运行它:bash write_disk_image.sh --bios uefi +# 通过设置ARCH为x86_64或i386,进行64/32位uefi的install,但是请记住该处的ARCH应与run-qemu.sh中的一致 ############################################### ARCH="x86_64" +#ARCH="i386" # 内核映像 root_folder=$(dirname $(pwd)) kernel="${root_folder}/bin/kernel/kernel.elf" @@ -90,9 +92,11 @@ 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 + insmod efi_gop menuentry "DragonOS" { multiboot2 /boot/kernel.elf "KERNEL_ELF" }' +# 增加insmod efi_gop防止32位uefi启动报错 echo "echo '${cfg_content}' > ${boot_folder}/grub/grub.cfg" | sh fi @@ -103,10 +107,14 @@ case "$1" in --bios) case "$2" in uefi) #uefi - grub-install --target=x86_64-efi --efi-directory=${mount_folder} --boot-directory=${boot_folder} --removable + if [ ${ARCH} == "i386" ];then + ./arch/i386/efi/grub/sbin/grub-install --target=i386-efi --efi-directory=${mount_folder} --boot-directory=${boot_folder} --removable + elif [ ${ARCH} == "x86_64" ];then + ./arch/x86_64/efi/grub/sbin/grub-install --target=x86_64-efi --efi-directory=${mount_folder} --boot-directory=${boot_folder} --removable + fi ;; legacy) #传统bios - grub-install --target=i386-pc --boot-directory=${boot_folder} /dev/$LOOP_DEVICE + ./arch/i386/bios/grub/sbin/grub-install --target=i386-pc --boot-directory=${boot_folder} /dev/$LOOP_DEVICE ;; esac ;;