run.sh 4.1 KB

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