run.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. # ======检查是否以sudo运行=================
  2. #uid=`id -u`
  3. #if [ ! $uid == "0" ];then
  4. # echo "请以sudo权限运行"
  5. # exit
  6. #fi
  7. # 第一个参数如果是--notbuild 那就不构建,直接运行
  8. if [ ! "$1" == "--nobuild" ]; then
  9. echo "开始构建..."
  10. make all -j 16
  11. make clean
  12. fi
  13. IA32_USE_QEMU=1
  14. bochsrc="./bochsrc"
  15. ARCH="x86_64"
  16. # 内核映像
  17. kernel='./bin/kernel/kernel.elf'
  18. iso_boot_grub='./iso/boot/grub'
  19. iso_boot='./iso/boot/'
  20. iso='./DragonOS.iso'
  21. iso_folder='./iso/'
  22. root_folder="$(pwd)"
  23. # toolchain
  24. OS=`uname -s`
  25. if [ "${OS}" == "Linux" ]; then
  26. GRUB_PATH="$(dirname $(which grub-file))"
  27. elif [ "${OS}" == "Darwin" ]; then
  28. GRUB_PATH="$(pwd)/tools/grub-2.06/build/grub/bin"
  29. fi
  30. export PATH="${GRUB_PATH}:$PATH"
  31. # ==============检查文件是否齐全================
  32. bins[0]=${kernel}
  33. for file in ${bins[*]};do
  34. if [ ! -x $file ]; then
  35. echo "$file 不存在!"
  36. exit
  37. fi
  38. done
  39. # ===============文件检查完毕===================
  40. # 如果是 i386/x86_64,需要判断是否符合 multiboot2 标准
  41. if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then
  42. if ${GRUB_PATH}/grub-file --is-x86-multiboot2 ${kernel}; then
  43. echo Multiboot2 Confirmed!
  44. else
  45. echo NOT Multiboot2!
  46. exit
  47. fi
  48. fi
  49. # 检测路径是否合法,发生过 rm -rf -f /* 的惨剧
  50. if [ "${iso_boot}" == "" ]; then
  51. echo iso_boot path error.
  52. else
  53. mkdir -p ${iso_boot}
  54. rm -rf -f ${iso_boot}/*
  55. fi
  56. # 设置 grub 相关数据
  57. if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then
  58. cp ${kernel} ${iso_boot}
  59. mkdir ${iso_boot_grub}
  60. touch ${iso_boot_grub}/grub.cfg
  61. echo 'set timeout=15
  62. set default=0
  63. menuentry "DragonOS" {
  64. multiboot2 /boot/kernel.elf "KERNEL_ELF"
  65. }' >${iso_boot_grub}/grub.cfg
  66. fi
  67. ${GRUB_PATH}/grub-mkrescue -o ${iso} ${iso_folder}
  68. rm -rf ${iso_folder}
  69. # 进行启动前检查
  70. flag_can_run=0
  71. if [ -d "${iso_folder}" ]; then
  72. flag_can_run=0
  73. echo "${iso_folder} 文件夹未删除!"
  74. else
  75. flag_can_run=1
  76. fi
  77. # 拷贝应用程序到硬盘
  78. cd tools
  79. bash m*
  80. sudo mkdir -p ${root_folder}/bin/disk_mount
  81. sudo cp ${root_folder}/bin/user/shell.elf ${root_folder}/bin/disk_mount
  82. sudo cp ${root_folder}/bin/user/about.elf ${root_folder}/bin/disk_mount
  83. sudo mkdir ${root_folder}/bin/disk_mount/dev
  84. sudo touch ${root_folder}/bin/disk_mount/dev/keyboard.dev
  85. sync
  86. bash u*
  87. cd ..
  88. 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|,$||")
  89. if [ $flag_can_run -eq 1 ]; then
  90. if [ ${IA32_USE_QEMU} == 0 ]; then
  91. bochs -q -f ${bochsrc} -rc ./tools/bochsinit
  92. else
  93. qemu-system-x86_64 -cdrom ${iso} -m 512M -smp 2,cores=2,threads=1,sockets=1 \
  94. -boot order=d \
  95. -monitor stdio -d cpu_reset,guest_errors,trace:check_exception,exec,cpu,out_asm,in_asm -s -S -cpu "IvyBridge,+apic,+x2apic,+fpu,check,${allflags}" --enable-kvm -rtc clock=host,base=localtime -serial file:serial_opt.txt \
  96. -drive id=disk,file=bin/disk.img,if=none \
  97. -device ahci,id=ahci \
  98. -device ide-hd,drive=disk,bus=ahci.0 \
  99. -usb
  100. fi
  101. else
  102. echo "不满足运行条件"
  103. fi