导入virtio_net符号,方便访问virtio-net模块定义的结构
mod -s virtio_net /lib/modules/6.6.0-27.0.0.31.ctl4.x86_64/kernel/drivers/net/virtio_net.ko
研究net device
找到virtnet_info架构
struct virtnet_info ff1100208d0c2a40 -o
可以看到目前的队列有16个,也就是有16个rx和16个tx
网络信息
lshw -c net -businfo
ls -l /sys/bus/pci/devices/0000\:12\:00.0/driver
找到virtqueue的初始信息
首先,找到send_queue地址,可以得到其初始化的virtqueue地址
virtqueue信息
可以看出,其callback是skb_xmit_done函数,vdev就是指的是virtio_device结构,其index为1
网卡初始化tx和rx
可以看到网卡对于tx和rx的顺序是rx、tx的顺序依次初始化的。
vring_virtqueue地址
可以看到,vring_virtqueue结构体的第一个成员为virtqueue,其地址和virtqueue一样。
vring_virtqueue_split信息
以第一个rx为例
struct vring_virtqueue 0xff110020887a3f00 | grep vq
p ((struct receive_queue*) 0xff110020a2c98000)[0].vq
struct vring_virtqueue 0xff110020887a3f00 -o
struct vring_virtqueue_split ff110020887a3f58
队列使用的不是packed ring,而是split ring,也就是最原始的split ring,地址为 ff110020887a3f58
vring信息
vring_virtqueue_split结构体中,可以看到vring,desc,avail_idx等信息。可以通过vring,看到avail、used地址,num为1024。
config信息——struct virtio_pci_device
struct virtio_pci_device 0xff1100208883a800 -o
pci_dev 地址为0xff1100208a418000
中断信息
pci_device信息
is_legacy为false,说明结构体为modern_device
virtio_pci_modern_device信息
通过modern_device可以看到config的信息,notify、common、device、isr等。
struct virtio_pci_modern_device 0xff1100208883abb0
Vendor id 、device id(命令+crash寻找)
可以看到,virtio_pci_modern_device的vendor、device为0x1、0x1bd4;
pci device vendor、device为0x1af4、0x1041
lspci -nn -s 0000:12:00.0
cat /sys/class/net/enp18s0/device/device
Common config
看不了
devices/driver
通过virtio_device找到device,
通过device可以找到device_driver,可以看到是virtio_net
通过device_driver找到virtio_driver
features
feature不对应
0x14014200C2000000
driver features
【有道云笔记】跟踪流程运行期间各个函数耗时情况
https://note.youdao.com/s/6gUEBcMD
【有道云笔记】trace-cmd跟踪进程和打印函数的调用栈
https://note.youdao.com/s/adNnucPI
【有道云笔记】trace-cmd跟踪指定命令在内核的函数调用情况--SG和DMA
https://note.youdao.com/s/4JVNmxeP
【有道云笔记】crash自动输入命令和重定向输出
https://note.youdao.com/s/LMVD4MO9
【有道云笔记】crash分析guest内核core文件-crash打印virtio_blk信息
https://note.youdao.com/s/F4yMbKnT
【有道云笔记】crash打印virtio_net设备信息
https://note.youdao.com/s/Aes1RCp1