qemu-system和qemu-user两种模式动态模拟运行嵌入式固件方法总结
qemu-system和qemu-user两种模式动态模拟运行嵌入式固件方法总结
前言
搭建嵌入式固件的动态模拟环境的过程中遇到了许多的坑,最终终于搭建了起来,很有必要记录下遇到的问题,避免今后再踩坑。
工具
1.buildroot
以buildroot 2019.02.4版本为例,编译mips大端架构环境。
tar zxvf buildroot-2019.02.4.tar.gz
apt-get install libncurses5-dev
make menuconfig
Target options中选择架构为mips big endian:
Toolchain中选择的linux内核要尽量的低:
Save之后开始make
,编译时间很久,可以先去完成一次星际旅行。
2.qemu
apt-get install qemu qemu-user-static
3.binwalk
binwalk项目的github地址,安装过程可能会出现小问题。例如cramfsprogs这个包在官方的源中找不到,需要手动下载cramfsprogs,使用dpkg -i install package.deb
安装。
4.gdb
gdb -v
检查是否已经安装。
5.ida pro
“度娘,你有没有ida pro给我下载啊?”
qemu-system模式运行
下载
启动
qemu-system-mips -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=devttys0"
ifconfig
测试与宿主机网络连通性。
桥接网络
安装依赖:
apt-get install uml-utilties
apt-get install bridge-utils
修改interfaces文件:
1.备份:cp /etc/network/interfaces /etc/network/interfaces.backup
2.修改:vim /etc/network/interfaces
3.增加以下内容:
auto br0
iface br0 inet static #配置为静态
address 192.168.*.* #填入宿主机的静态ip
network 192.168.*.0
netmask *.*.*.*
bridge_ports *** tap0 #***代表之前的网口
4.终端:
tunctl -t tap0 -u username
为创建的tap0接口指定自己可以访问
brctl addif br0 tap0
ifconfig tap0 0.0.0.0 promisc up
5.桥接模式启动:
sudo qemu-system-mips -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=ttys0" -net nic -net tap,ifname=tap0
6.ifconfig
验证是否已经桥接。
7.将binwalk解压后的文件nc
传入虚拟机,讲bin/和lib/目录下的文件拷贝到虚拟机的根目录下,或是使用chroot改变当前根目录为嵌入式系统的目录,测试是否可以运行调试目标。
qemu-user模式运行
这里遇到的坑最多(T-T!)
1.chroot(就是你!免疫自动补全!谎报敌情!)
cp $(which qemu-mips) ./
cp $(which qemu-mips-static) ./
chroot ./ ./qemu-mips ./bin/boa
是行不通的,qemu-mips无法找到运行库。
chroot ./ ./qemu-mips-static ./bin/boa
可行。
2.gdb将进程绑定端口,ida pro远程调试
chroot ./ ./qemu-mips-static -g 1234 ./bin/boa
ida pro填写远程参数
3.远程调试
原文地址:https://www.cnblogs.com/yangmzh3/p/11411676.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用R语言对进行空间数据可视化
- R语言中基于混合数据抽样(MIDAS)回归的HAR-RV模型预测GDP增长
- R语言马尔可夫体制转换模型Markov regime switching
- Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
- python3用ARIMA模型进行时间序列预测
- R语言马尔可夫转换模型研究交通伤亡人数事故预测
- scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘
- 使用R语言进行Metroplis-in-Gibbs采样和MCMC运行分析
- R语言中的马尔科夫机制转换(Markov regime switching)模型
- R语言ARMA-EGARCH模型、集成预测算法对SPX实际波动率进行预测
- nginx快速入门
- R语言中进行期权定价的Heston模型
- 使用R语言随机波动模型SV处理时间序列中的随机波动率
- 20个ES6面试高频问题
- i++和++i傻傻分不清楚?这里给你最清楚的解答