qemu使用uboot通过网络加载 linux kernel

news/2024/7/7 20:12:59

qemu使用uboot通过网络加载 linux kernel。

参考文章:

https://www.zhaixue.cc/qemu/qemu-u-boot.html

https://zhuanlan.zhihu.com/p/547338158

 

  1 #!/bin/sh
  2  
  3  
  4 # 参考网址:
  5 # https://www.zhaixue.cc/qemu/qemu-u-boot.html
  6 # https://zhuanlan.zhihu.com/p/547338158
  7  
  8  
  9 # 1.
 10 # 修改busybox的Makefile的两个变量为:
 11 #   ARCH ?= arm
 12 #   CROSS_COMPILE ?= arm-linux-gnueabi-
 13 #
 14 cd u-boot-2022.10/
 15 vim Makefile
 16  
 17  
 18  
 19 # 2.
 20 # 编译, 如果出现错误, 安装: sudo apt install libssl-dev
 21 make vexpress_ca9x4_defconfig
 22 make -j 4
 23  
 24  
 25  
 26 # 3.
 27 # 使用qemu启动u-boot进行测试
 28 sh testiboot/test_uboot.sh
 29 #       test_uboot.sh内容
 30 #       #!/bin/sh
 31 #       # 测试u-boot
 32 #       # 上级路径
 33 #       top_path="/home/thinks2/ProgramProject/qemu_study/"
 34 #       src_path="tftpboot/u-boot"
 35 #       # 内核文件路径
 36 #       kernel_path=${top_path}${src_path}
 37 #       qemu-system-arm \
 38 #           -M vexpress-a9 \
 39 #           -m 512M \
 40 #           -kernel ${kernel_path} \
 41 #           -sd rootfs.ext3 \
 42 #           -nographic \
 43  
 44  
 45  
 46 # 4. 
 47 # 准备uImage内核, 指定加载地址, 编译uImage
 48 cd ..
 49 cd linux-4.19.269/
 50 make LOADADDR=0x60003000 uImage  -j 4
 51  
 52  
 53  
 54 # 5.
 55 # 细心的朋友发现, 目前加载u-boot的方法使用还是-kernel选项, 也就是把u-boot当做内核挂载的,
 56 # 而真实的系统启动, 不可能同时挂载两个内核启动(只能选择一个启动). 那么, 如何来模拟呢?
 57 #
 58 # u-boot实体机中, 我们常常采用tftp引导内核, 我们也可以在启动u-boot以后, 让u-boot通过tftp引导内核.
 59 # 需要做两件事情:
 60 #   1.搭建好tftp环境
 61 #   2.构建网桥, 让qemu可以访问, 从而让qemu和ubuntu之间可以通过该网桥来访问
 62  
 63 # 安装tftp和相关依赖, 设置好路径
 64 sudo apt install tftp-hpa tftpd-hpa xinetd uml-utilities bridge-utils
 65  
 66 # 设置tftp配置路径文件
 67 sudo vim /etc/default/tftpd-hpa
 68 # 将下面的内容复制近来
 69 TFTP_USERNAME="tftp"
 70 TFTP_DIRECTORY="/home/thinks2/ProgramProject/qemu_study/tftpboot" # 该路径即为tftp可以访问到的路径
 71 TFTP_ADDRESS="0.0.0.0:69"
 72 TFTP_OPTIONS="-l -c -s"
 73  
 74 # 配置完以后, 创建tftp目录, 给最高权限. 把内核, 设备树, 根文件系统,u-boot全部复制到这里
 75 cd ..
 76 mkdir tftpboot
 77 cd tftpboot
 78 cp ../u-boot-2022.10/u-boot ./
 79 cp ../linux-4.19.269/arch/arm/boot/uImage ./
 80 cp ../linux-4.19.269/arch/arm/boot/dts/vexpress-v2p-ca9.dtb ./
 81 # 重启tftp服务
 82 sudo /etc/init.d/tftpd-hpa restart
 83  
 84  
 85  
 86 # 6.
 87 # 修改网卡信息, 设置桥接
 88 ifconfig    # 查看网卡名
 89  
 90 # 修改/etc/netplan/01-network-manager-all.yaml的信息配置:
 91 sudo vim /etc/netplan/01-network-manager-all.yaml
 92 # t添加以下内容:
 93 ethernets:
 94   # 这里设置的是你还需要上网的网卡, ifconfig查看
 95   wlp0s20f3:
 96     dhcp4: yes
 97   # 这里设置的是br0桥接到的网卡
 98   enp0s31f6:
 99     dhcp4: yes
100 bridges:
101   #这里设置的是br0网桥        
102   br0:
103     dhcp4: yes
104     interfaces:
105       # 声明br0网桥接入的网卡是wlp0s20f3
106       - wlp0s20f3
107  
108 # 输入sudo netplan apply使其生效, 再输入ifconfig查看网卡信息
109 sudo netplan apply
110 ifconfig
111  
112  
113  
114 # 7.
115 # 修改/etc/qemu-ifdown信息配置
116 sudo vim /etc/qemu-ifdown
117 # 添加以下内容:
118 echo sudo brctl delif br0 $1
119 sudo brctl delif br0 $1
120  
121 echo sudo tunctl -d $1
122 sudo tunctl -d $1
123  
124 echo brctl show
125 brctl show
126  
127  
128  
129 # 8.
130 # 修改/etc/qemu-ifup信息配置
131 sudo vim /etc/qemu-ifup
132 # 添加以下内容:
133 echo sudo tunctl -u $(id -un) -t $1
134 sudo tunctl -u $(id -un) -t $1
135  
136 echo sudo ifconfig $1 0.0.0.0 promisc up
137 sudo ifconfig $1 0.0.0.0 promisc up
138  
139 echo sudo brctl addif br0 $1
140 sudo brctl addif br0 $1
141  
142 echo brctl show
143 brctl show
144  
145 # 这里设置的是网桥br0的地址
146 sudo ifconfig br0 192.168.2.13
147  
148  
149  
150 # 9.
151 # 修改test_uboot.sh, 添加:
152 #   -nic tap,ifname=tap0 \
153 #   -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
154 vim test_uboot.sh
155 # 输入启动指令, 需要以sudo方式启动test_uboot.sh再启动
156 sudo sh test_uboot.sh
157 #       test_uboot.sh内容:
158 #       #!/bin/sh
159 #       # 测试u-boot
160 #       # 上级路径
161 #       top_path="/home/thinks2/ProgramProject/qemu_study/"
162 #       src_path="tftpboot/u-boot"
163 #       # 内核文件路径
164 #       kernel_path=${top_path}${src_path}
165 #       qemu-system-arm \
166 #           -M vexpress-a9 \
167 #           -m 512M \
168 #           -kernel ${kernel_path} \
169 #           -nic tap,ifname=tap0 \
170 #           -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
171 #           -sd rootfs.ext3 \
172 #           -nographic \
173  
174  
175  
176 # 10.
177 # 此时敲击enter键, 进入u-boot交互模式, 输入以下内容:
178  
179 # 设置u-boot这边的地址(和br0同一网段即可)
180 setenv ipaddr   192.168.2.15
181 # 设置服务器地址(br0网桥的地址)
182 setenv serverip 192.168.2.13
183  
184 # 从tftpboot下载uImage
185 tftpboot 0x60003000 uImage
186 # 从tftpboot下载设备树
187 tftpboot 0x60500000 vexpress-v2p-ca9.dtb
188  
189 # 设置根文件系统挂载位置、权限、控制台设备
190 setenv bootargs "root=/dev/mmcblk0 rw console=ttyAMA0"
191  
192 # 设置启动地址
193 bootm 0x60003000 - 0x60500000
194  

最终的qemu的加载运行脚本test_uboot.sh:

 1 #!/bin/sh
 2 
 3 
 4 # 测试u-boot
 5 
 6 # 上级路径
 7 top_path="/home/thinks2/ProgramProject/qemu_study/"
 8 src_path="tftpboot/u-boot"
 9 
10 # 内核文件路径
11 kernel_path=${top_path}${src_path}
12 
13 qemu-system-arm \
14     -M vexpress-a9 \
15     -m 512M \
16     -kernel ${kernel_path} \
17     -nic tap,ifname=tap0 \
18     -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
19     -sd rootfs.ext3 \
20     -nographic \

 


http://lihuaxi.xjx100.cn/news/603920.html

相关文章

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩,配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据,就免不了搜索,而搜索离不…

flowable工作流架构分析

flowable工作流目录概述需求:设计思路实现思路分析1.复杂的状态的或者状态的维度增加的状的条件极为复杂2.工作流3.BPMN2.0协议4.协议的元素5.互斥网关包容性网关(Inclusive Gateway)参考资料和推荐阅读Survive by day and develop by night.…

《棒球名人堂》:棒球殿堂·MLB棒球创造营

棒球名人堂 棒球名人堂的全称是:国家棒球名人堂和博物馆(National Baseball Hall of Fame and Museum)是在1933年6月12日,由一个以裁缝机公司(Singer Sewing Machine)的资金成立的克拉克基金会(Clark Foundation)所设立。 中文名称棒球名人堂外文名称National Base…

JavaSE学习day2_01, 数据类型

1. 数据类型 1.1 Java中数据类型的分类,重点 基本数据类型 引用数据类型 1.2 基本数据类型的四类八种 整数类型:byte、short、int、long 浮点类型:float、double 字符类型:char 布尔类型:boolean,只有两个取值,true和false…

学校里很少提及但很实用的C语言开发基础知识

目录0. 前言1. 开发环境1.1 IDE1.2 代码文本编辑器1.3 编译器1.3.1 GCC1.4 调试器2. C语言2.1 位域2.2 指示器2.2.1 数组指示器2.2.2 结构体指示器2.2.3 结构体 数组2.3 变长数组2.4 预处理指令2.4.1 #运算符2.4.2 ##运算符2.4.3 可变参数宏2.5 泛型选择2.6 内建函数2.7 其他特…

Global Illumination_SDF Generate Visualize Shadow

Signed Distance Field(有向距离场),简称SDF,这其实是图形学中非常常用的数学概念。数学上来说,是定义在空间中的一个标量场,标量值为空间一点到曲面的距离。曲面外的点为正值,曲面上的点为0,曲面内的点为负…

下一个更大的元素

#include<iostream> #include<vector> #include<stack> #include<unordered_map> using namespace std;// 下一个更大元素// 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。 // 请你找出 nums1 中每个元素在 nums2 中的下…

【实现QQ登录界面 Objective-C语言】

一、实现QQ登录界面 1.实现这样的QQ登录界面 1.实现这样的QQ登录界面 2.首先,分析一下,这个界面里,都有哪些控件 是不是两个Label,两个TextField文本框,1个Button吧 3.先拖1个Label上来 再拖1个TextField文本框上来,在这个Label右边, 然后选中这两个控件, 按住o…