首页 > 系统相关 >QEMU调试Linux系统的USB协议栈

QEMU调试Linux系统的USB协议栈

时间:2022-11-20 19:36:34浏览次数:45  
标签:USB 断点 init ex qemu Linux QEMU usb


QEMU调试Linux系统的USB协议栈

通过使用QEMU调试Linux系统的USB协议栈来学习USB协议栈。

mingdu.zheng at gmail dot com

安装QEMU

sudo apt-get install qemu-system-i386

启动QEMU进入调试模式

qemu-system-i386 -kernel vmlinuz-2.6.32 -initrd initrd.img -append console=ttyS0 -nographic -S -s -monitor tcp::3333,server,nowait -device pci-ohci

-kernel vmlinuz-2.6.32:指定内核文件
-initrd initrd.img:指定引导时使用的RAM Disk,RAM Disk中集成了BusyBox,包含一些基础命令
-append console=ttyS:传递给内核的参数,将内核控制台输出重定向到串口
-nographic:无图形窗口模式,纯文本模式,不需要窗口
-S:启动虚拟机时不执行代码,当受到GDB指令时才执行
-s:为-gdb tcp::1234的缩写形式,打开GDB Server,监听端口为1234
-monitor tcp::3333,server,nowait:将monitor重定向到TCP流,创建TCP服务器,监听端口为3333
-device pci-ohci:添加OHCI主机控制器到虚拟机

连接QEMU Monitor

socat tcp:localhost:3333 stdio

在另一个终端,使用socat将qemu monitor的输出重定向到当前终端的标准输入输出。

打开GDB连接到QEMU

gdb vmlinux-2.6.32 -ex "dir linux-2.6.32" -ex "target remote :1234" -ex "b usb_init" -ex "b ohci_hcd_mod_init" -ex "b ehci_hcd_init" -ex "b usb_stor_init" -ex "b storage_probe" -ex "c"

-ex “dir /home/firm/linux/linux-2.6.32/”:GDB启动后执行dir命令,指定源代码查找路径
-ex “target remote :1234”:接着执行target命令,连接到QEMU的GDB Server
-ex “b usb_init”:接着执行b命令,设置断点,usb_init为USB核心层的初始化入口函数
-ex “b ohci_hcd_mod_init”:继续设置断点,ohci_hcd_mod_init为OHCI主机控制器的初始化入口函数
-ex “b ehci_hcd_init”:继续设置断点,ehci_hcd_init为EHCI主机控制器的初始化入口函数
-ex “b usb_stor_init”:继续设置断点,usb_stor_init为Mass Storage类设备驱动的初始化入口函数
-ex “b storage_probe”:继续设置断点,storage_probe为Mass Storage类设备驱动的探测函数
-ex “c”:执行c命令,虚拟机开始启动
断点应按需设置

创建磁盘映像文件

dd if=/dev/zero of=usbdisk.img bs=512 count=102400
mkfs.ext2 usbdisk.img

通过QEMU Monitor插入优盘

(qemu) drive_add 0 id=my_usb_disk,if=none,file=usbdisk.img
OK
(qemu) device_add usb-storage,id=my_usb_disk,drive=my_usb_disk

drive_add创建一个虚拟的磁盘驱动器,usbdisk.img为磁盘映像文件
device_add添加优盘设备到虚拟机,使用上一步创建的磁盘驱动器

通过QEMU Monitor移除优盘

(qemu) device_del my_usb_disk


标签:USB,断点,init,ex,qemu,Linux,QEMU,usb
From: https://blog.51cto.com/zoomdy/5871667

相关文章

  • Linux中如何开启一个定时任务
    Linux的定时任务是基于cron驱动做到的安装Ubantu系统下安装crontab正常情况下需要先执行:apt-getupgrade进行升级安装:apt-getinstallcron启动:servicecronstar......
  • linux 多线程 c++2
    为了在用线程分离的时候保证即使主线程退出了,子线程还能正常运行,可以使用pthread_exit(NULL)去退出主线程,这样地址空间还能正常存在线程分离是为了保证主线程不会被堵塞,还能......
  • Linux的文件系统分层结构(FSH):Filesystem Hierarchy Standard
    Linux的文件系统分层结构:Lunux文件系统常用的目录如下:根目录(/):根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、......
  • 嵌入式linux日常使用的网络工具分享
    前言作为嵌入式linux开发中我们经常会调试网络,这个时候需要一些网络工具辅助我们的工作,有一些是命令工具有些是GUI工具,这些生产力工具如何使用呢,今天做一个小分享(本篇文章......
  • Linux下安装Java运行环境
    1.下载java8的包,并上传到服务器/usr/local目录下wget命令是一个从网络上下载文件的自由工具,它支持http协议,https协议和ftp协议。因此我们可以通过wget命令来下载JDK。wge......
  • (转)Linux crontab命令详解
    原文:https://www.cnblogs.com/ftl1012/p/crontab.htmlcrontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本 -->相当于闹钟       日志文件: ll/var/lo......
  • 图文详解在VMware Workstation 16 PRO虚拟机上安装Ubuntu 22.04.5 linux系统
    一、下载Ubuntulinux系统镜像机构下载地址官网地址https://cn.ubuntu.com/download南京大学https://mirrors.nju.edu.cn/ubuntu-releases/20.04.5/山东......
  • Linux工作中最常用命令整理
    ls命令ls-a:显示所有文件夹,包含隐藏的.和..ls-l:显示文件的详细信息,包含文件形态,权限,所属,大小,其实就是平常用的llll-h:用易读的方式列出所有的文件信息cd......
  • WSL linux reset password
    Kali: cd C:\Users\user\AppData\Local\Microsoft\WindowsAppspowershell.exekaliconfig--default-userrootpasswdbobexitkaliconfig--default-userbobR......
  • 常用Linux命令-学习
    常用Linux命令文件目录类命令命令格式命令名称-选项参数命令浏览目录命令ls命令英文原意:list功能描述:显示目录文件pwd命令英文原意:printworkingdirector......