当前位置:   article > 正文

qemu搭建和运行起来一个linux内核环境_qemu运行linux

qemu运行linux

qemu搭建和运行起来一个linux内核环境。

参考了博客:

搭建linux调试环境 (一)-- qemu环境搭建vexpress开发平台 - Edver - 博客园
【嵌入式Linux之QEMU模拟器】4、使用busybox制作根文件系统_ReCclay的博客-CSDN博客_busybox编译根文件系统 qemu

qemu模拟vexpress开发板 - bigsissy - 博客园

qemu 模拟arm - 小水同学 - 博客园

 QEMU简述:

因此,上述QEMU所做的工作,相当于:

1. 编译Linux Kernel镜像

  1. #!/bin/sh
  2. # 预期工具准备:
  3. # Ubuntu 22.04 安装qemu全套
  4. sudo apt install qemu
  5. sudo apt install qemu-system
  6. sudo apt install qemu-user
  7. sudo apt install qemu-efi
  8. sudo apt install qemu-web-desktop
  9. sudo apt install qemu-guest-agent
  10. sudo apt install qemu-block-extra
  11. sudo apt install qemu-utils
  12. sudo apt install qemubuilder
  13. # gcc-arm-linux-gnueabi工具
  14. sudo apt install gcc-arm-linux-gnueabi
  15. # 后续的编译过程还需要的工具
  16. sudo apt install u-boot-tools
  17. sudo apt install flex
  18. sudo apt install bison
  19. sudo apt install libncurses5-dev
  20. sudo apt install libncurses-dev
  21. # 开发时常用工具
  22. sudo apt install cmake
  23. sudo apt install git
  24. sudo apt install vim
  25. sudo apt install build-essential
  26. # 注意编译的Linux内核版本, 如内核版本过低, 而工具链和主机Ubuntu过旧, 则可能会带来大量编译错误
  27. # 1.
  28. # 修改linux kernel的Makefile的两个变量为:
  29. # ARCH ?= arm
  30. # CROSS_COMPILE ?= arm-linux-gnueabi-
  31. #
  32. cd linux-4.19.269/
  33. vim Makefile
  34. # 编译配置
  35. make vexpress_defconfig
  36. make menuconfig # 这个只要没有报错, 直接推出出现的窗口即可
  37. # 2.
  38. # 编译linux kernel代码, 为了加速编译, 开启多线程编译
  39. #
  40. make zImage -j 4
  41. make modules -j 4
  42. make dtbs -j 4
  43. make LOADADDR=0x60003000 uImage -j 4
  44. # 3.
  45. # 把镜像文件zImage和uImage, 设备树文件dtbs, 复制到工程目录testboot里, 进行测试一下
  46. cd ..
  47. mkdir testboot
  48. cp arch/arm/boot/zImage ../testboot/
  49. cp arch/arm/boot/uImage ../testboot/
  50. cp arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../testboot/
  51. # 4.
  52. # 测试
  53. sh testboot/test_boot.sh
  54. # test_boot.sh内容:
  55. # #!/bin/sh
  56. # # 测试uboot
  57. # # 上级路径
  58. # top_path="/home/thinks2/ProgramProject/qemu_study/"
  59. # src_path="linux-4.14.302/arch/arm/boot/"
  60. # # 内核文件与dtb文件的路径
  61. # kernel_path=${top_path}${src_path}"zImage"
  62. # dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"
  63. # qemu-system-arm \
  64. # -M vexpress-a9 \
  65. # -m 512M \
  66. # -kernel ${kernel_path} \
  67. # -dtb ${dtb_path} \
  68. # -append "console=ttyAMA0" \
  69. # -nographic \

2.  使用busybox制作最小文件系统

  1. #!/bin/sh
  2. # 1.
  3. # 修改busybox的Makefile的两个变量为:
  4. # ARCH ?= arm
  5. # CROSS_COMPILE ?= arm-linux-gnueabi-
  6. #
  7. cd busybox-1.35.0/
  8. vim Makefile
  9. # 设置编译为静态库:
  10. # Settings --->
  11. # Build Options --->
  12. # [*] Build as a static binary (no shared libs)
  13. make menuconfig
  14. # 2.
  15. # 编译:
  16. # 编译完成后会在busybox目录下生成一个_install的目录,
  17. # 该目录是编译好的文件系统需要使用的一些命令集合
  18. make defconfig
  19. make -j 4
  20. make install
  21. # 3.
  22. # 新建一个根文件系统的文件夹
  23. cd ..
  24. mkdir rootfs
  25. cd rootfs/
  26. # 拷贝_install目录的命令集到rootfs中
  27. cp -rf ../busybox-1.35.0/_install/* ./
  28. # 在rootfs中, 新建lib目录,从工具链中拷贝arm执行库到该lib中
  29. mkdir lib
  30. cp -p /usr/arm-linux-gnueabi/lib/* lib/
  31. # 4.
  32. # 创建字符设备: 设备文件, 跟用户和底层进行交互的接口, 这些接口以文件节点的形式存在, 读写文件, 直接读写对应的结点即可
  33. # 在rootfs中, 创建dev文件夹, 存放各种目录结点
  34. mkdir dev
  35. cd dev
  36. # 创建4个串口结点
  37. #
  38. # 命令和其参数的意义:
  39. # mknod: 创建结点
  40. # -m 666: 设置权限为666
  41. # ttyX: 表示串口
  42. # c: 表示字符设备
  43. # 4: 表示主设备号
  44. # 1: 表示次设备号
  45. sudo mknod -m 666 tty1 c 4 1
  46. sudo mknod -m 666 tty2 c 4 2
  47. sudo mknod -m 666 tty3 c 4 3
  48. sudo mknod -m 666 tty4 c 4 4
  49. # 创建1个工作台结点
  50. sudo mknod -m 666 console c 5 1
  51. # 创建null结点
  52. sudo mknod -m 666 null c 1 3
  53. # 5.
  54. # 制作SD根文件系统镜像: 根文件系统放到SD卡里, 内核启动后, 从SD卡挂载根文件系统
  55. cd ../..
  56. # 生成根文件系统镜像rootfs.ext3, 直接把rootfs.ext3看成一个SD卡即可
  57. # bs: 缓冲区大小, count: 表示块大小
  58. dd if=/dev/zero of=rootfs.ext3 bs=1M count=64
  59. # 格式化rootfs.ext3
  60. mkfs.ext3 rootfs.ext3
  61. # 6.
  62. # 将各种文件拷贝到文件系统镜像中
  63. mkdir tmpfs
  64. # 将虚拟sd卡挂载到/tmpfs
  65. # -t ext3: 表示文件系统是ext3格式
  66. # -o loop: 使用loop模式用来将一个档案当成硬盘分割挂上系统
  67. sudo mount -t ext3 rootfs.ext3 tmpfs/ -o loop
  68. # 拷贝rootfs的所有文件到sd卡中
  69. sudo cp -r rootfs/* tmpfs/
  70. # 卸载sd(块设备不能直接读写)
  71. sudo umount tmpfs
  72. # 7.
  73. # 使用qemu在这个最小文件系统上运行linux kernel
  74. sh step_qemu_run_os.sh
  75. # step_qemu_run_os.sh内容:
  76. # #!/bin/sh
  77. # # 使用qemu启动内核
  78. # # 上级路径
  79. # top_path="/home/thinks2/ProgramProject/qemu_study/"
  80. # src_path="linux-4.14.302/arch/arm/boot/"
  81. # # 内核文件与dtb文件的路径
  82. # kernel_path=${top_path}${src_path}"zImage"
  83. # dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"
  84. # # 用qemu运行Linux内核, 其中:
  85. # #
  86. # # 1. -M vexpress-a9: 模拟vexpress-a9单板, 能够使用-M ?參数来获取该qemu版本号支持的全部单板
  87. # # 2. -m 512M: 单板执行物理内存512M
  88. # # 3. -kernel xxx/zImage: 告诉qemu单板执行内核镜像路径
  89. # # 4. -nographic: 不使用图形化界面, 仅仅使用串口
  90. # #
  91. # # 5. -append "root=/dev/mmcblk0 rw console=tty0":
  92. # # 内核启动參数这里告诉内核vexpress单板执行. 其中:
  93. # # 5.1 root=/dev/mmcblk0: 文件系统的加载Root位置
  94. # # 5.2 rw: 以读写的方式打开文件系统, 以便能够创建, 修改, 删除文件
  95. # # 5.3 console=tty0: 控制台
  96. # #
  97. # # 6. -sd rootfs.ext3: 从SD卡加载系统
  98. # qemu-system-arm \
  99. # -M vexpress-a9 \
  100. # -m 512M \
  101. # -kernel ${kernel_path} \
  102. # -dtb ${dtb_path} \
  103. # -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
  104. # -sd rootfs.ext3 \
  105. # -nographic \
  106. # # console=ttyAMA0

3.  使用qemu在最小系统上运行编译好的Linux Kernel镜像

  1. #!/bin/sh
  2. # 使用qemu启动内核
  3. # 上级路径
  4. top_path="/home/thinks2/ProgramProject/qemu_study/"
  5. src_path="linux-4.14.302/arch/arm/boot/"
  6. # 内核文件与dtb文件的路径
  7. kernel_path=${top_path}${src_path}"zImage"
  8. dtb_path=${top_path}${src_path}"dts/vexpress-v2p-ca9.dtb"
  9. # 用qemu运行Linux内核, 其中:
  10. #
  11. # 1. -M vexpress-a9: 模拟vexpress-a9单板, 能够使用-M ?參数来获取该qemu版本号支持的全部单板
  12. # 2. -m 512M: 单板执行物理内存512M
  13. # 3. -kernel xxx/zImage: 告诉qemu单板执行内核镜像路径
  14. # 4. -nographic: 不使用图形化界面, 仅仅使用串口
  15. #
  16. # 5. -append "root=/dev/mmcblk0 rw console=tty0":
  17. # 内核启动參数这里告诉内核vexpress单板执行. 其中:
  18. # 5.1 root=/dev/mmcblk0: 文件系统的加载Root位置
  19. # 5.2 rw: 以读写的方式打开文件系统, 以便能够创建, 修改, 删除文件
  20. # 5.3 console=tty0: 控制台
  21. #
  22. # 6. -sd rootfs.ext3: 从SD卡加载系统
  23. qemu-system-arm \
  24. -M vexpress-a9 \
  25. -m 512M \
  26. -kernel ${kernel_path} \
  27. -dtb ${dtb_path} \
  28. -append "root=/dev/mmcblk0 rw console=tty0" \
  29. -sd rootfs.ext3 \
  30. # -nographic \
  31. # console=ttyAMA0

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号