内核
文章平均质量分 75
leoufung
Linux Kernel,Virtualization
展开
-
使用ftrace快速追踪virtio_pci_legacy_probe问题
进入目录pushd /sys/kernel/debug/tracing/设定要跟踪的函数echo virtio_pci_legacy_probe > set_graph_function查看由哪些tracer可以使用cat available_tracers打开要用的traceecho function_graph > current_tracer跟踪输入内容cat trace_pipe...原创 2022-04-08 19:04:31 · 275 阅读 · 0 评论 -
用crash在线调试内核(1)
crash linux-5.4.0/vmlinux /proc/kcore struct vring_virtqueue ffff987036195740struct vring_used 0xffff987027091000crash linux-5.4.0/vmlinux /proc/kcorestruct vring_virtqueue ffff987036194d80struct vring_avail 0xffff987027280000struct vring_used 0...原创 2021-12-14 21:11:47 · 759 阅读 · 0 评论 -
linux 设备管理模型
一、概念 二、三者的关系 三、如何注册驱动、添加设备一、概念1、bus总线是处理器和设备之间的通道。总线有多种类型,每种总线可以挂载多个设备。2、driver驱动程序是在CPU运行时,提供操作的软件接口。所有的设备必须有与之配套驱动程序才能正常工作。一个驱动程序可以驱动多个类似或者完全不同的设备。3、device设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类,如输入设备(鼠标,键盘,游戏杆等)。二、三者的关系总线上有两个重要的链表:原创 2021-12-14 13:42:59 · 295 阅读 · 0 评论 -
关于dma_alloc_coherent的用法
目录概述DMA映射建立一致性DMA映射DMA池建立流式DMA映射单页流式映射分散/聚集映射PCI双重地址周期映射 DAC简单的PCI DMA例子ISA设备DMA概述DMA的操作是需要物理地址的,但是在linux内核中使用的都是虚拟地址,如果想要用DMA对一段内存进行操作,如何得到这一段内存的物理地址和虚拟地址的映射呢?dma_alloc_coherent这个函数实现了这种机制。1、函数原型: void *dma_alloc_coherent( struct原创 2021-11-26 08:37:16 · 12963 阅读 · 1 评论 -
MLX5 VDPA 实现分析
关键流程分析原创 2021-11-16 13:55:18 · 1224 阅读 · 0 评论 -
vdpa中set_map接口iotlb参数的理解
1. 只有vhost_vdpa的情况,iotlb 才的管理会放在vdpa_device中, 也就是iotlb不为空,因为vhost_vdpa device 中有iotlb,真正的映射关系在userspace的qemu中管理,所以需要通过vhost的iotlb将映射关系下发到硬件中;除此之外,vhost还负责从VA到PA的映射转换;真个过程是 vhost_vdpa 将iotbl请求转发给了 vdpa device 触发的2. 在 virtio_vdpa 的情况下,iotlb是virtio_driver同k原创 2021-11-10 09:09:48 · 411 阅读 · 0 评论 -
[RFC,18/24] vhost-vdpa: support ASID based IOTLB API
[RFC,18/24] vhost-vdpa: support ASID based IOTLB APIMessage ID 20200924032125.18619-19-jasowang@redhat.com (mailing list archive) State New, archived Headers show Series Control VQ support in vDPA|expand Commit MessageJason WangS...转载 2021-11-06 18:00:32 · 186 阅读 · 0 评论 -
[RFC] vhost: basic device IOTLB support
[RFC] vhost: basic device IOTLB supportMessage ID 1451546025-15955-1-git-send-email-jasowang@redhat.com (mailing list archive) State New, archived Headers show Commit MessageJason WangDec. 31, 2015, 7:13 a.m. UTCThis patch tries to i.转载 2021-11-06 17:29:47 · 474 阅读 · 0 评论 -
BF2 swithdev representor 方案介绍
背景传统virtio 半虚拟化模型SRIOV 模型,需要单独离管理存在的问题:1. 无论kernel状态下还是dpdk情况下,SRIOV 口没有通过bridge直接进行管理,而是直接嵌入了eswitch2. 这种模式叫做 legacy 模式3. 需要为sr-iov增加软件的 representation 模型4. representation 模型需要无缝接入ovs, tc,可以通过已有方式对硬件进行 traffic rules 下发VF 的 represen..原创 2021-10-30 10:51:19 · 2692 阅读 · 0 评论 -
通过 auxiliary bus 管理 multifunction 设备
引言设备驱动通常存在于单个内核子系统中。然而,有时开发人员需要处理此模块之外的功能。例如,一个暴露以太网和 RDMA 功能的网络接口卡 (NIC)。只有一个硬件,但有两个驱动用于这两个功能。这些驱动程序需要在各自的子系统内工作,但它们也必须共享对相同硬件的访问方法。当前内核中没有将这些驱动程序连接在一起的标准方法,因此开发人员发明了ad-hoc方法来处理它们之间的交互。最近,Dave Ertman 发布了一个补丁集,介绍了一种称为“auxiliary bus”的新型总线,以解决这个问题。Comple翻译 2021-10-22 22:35:07 · 917 阅读 · 0 评论 -
Auxiliary Bus
Auxiliary 总线在某些子系统中,核心设备(PCI/ACPI/其他)的功能对于单个设备来说过于复杂,无法由单个某驱动程序(例如 Sound Open Firmware)管理,多个设备可能会实现共同的功能交集(例如 NIC+ RDMA),或者驱动程序可能想导出一个接口供另一个子系统驱动(例如 SIOV Physical Function export Virtual Function management)。将功能拆分为代表sub-domains功能的child- devices,可以通过 Lin.翻译 2021-10-22 21:17:18 · 1062 阅读 · 0 评论 -
virtio协议1.0 -- 网络设备
引子virtio network device 是一种虚拟以太网卡 迄今为止virtio支持的最复杂的设备(其他设备可挖掘的内容很多) 空缓冲区被提前放置在RX virtqueue中用于接收数据包,收包一个队列 发送的数据包被排队到TX virtqueue中以便按该顺序传输,发送一个队列 控制队列用于控制和高级过滤功能Device ID1Virtqueues队列分布布局 如果VIRTIO_NET_F_MQ 没有协商,N = 1 如果VIRTIO_NET_F_MQ 协商了,..原创 2021-10-12 16:22:55 · 2322 阅读 · 0 评论 -
virtio协议1.0 -- PCIe 类型的 Virtio 设备
引子virtio 可以使用不同类型的总线,这里讲解PCIe类型的virtio设备 virtio通常实现为PCIe类型 virtio可以是PCI设备也可以是PCIe设备 设备 设备暴露给客户机的接口需要符合PCI/PCIe规范 PCI 设备发现vendor id: 0x1af4 device id: 0x1040 + ${Virtio Device ID},确定具体设备类型,Legacy的是0x1000 到 0x103F 设备 PCI Vendor ID 必须是0x1AF...原创 2021-10-11 09:19:02 · 3004 阅读 · 1 评论 -
vDPA kernel fmk: vDPA bus drivers for kernel subsystem interactions
vhost-vDPA bus driverdesign of vhost-vDPA bus driversdf原创 2021-10-08 13:48:28 · 289 阅读 · 0 评论 -
virtio协议1.0 -- 设备初始和操作
设备初始化 驱动初始化步骤 Reset 设备 设置ACKNOWLEDGE 状态,通知设备:客户机设别了设备 设置DRIVER 状态,客户机找到了对应的驱动 读取设备的feature bit并写会驱动支持的feature bit 子集到设备,接收feature bit前驱动可能读取device-specific configuration 进行细粒度校验 设置FEATURES_OK,此后,驱动不能在接受更多新的feature bit 读取设备状态,确保...原创 2021-09-29 15:23:03 · 505 阅读 · 0 评论 -
driverctl 设置linux设备驱动的加载
原文地址:https://www.cnblogs.com/hugetong/p/9389557.html登录The Classic Tong's Cavetelegram: https://t.me/classic_tong GIT: https://github.com/tony-caotong[administrator][driver] driverctl 是如何在udev上层管理设备驱动的https://gitlab.com/driverctl/driverctl...原创 2021-02-26 15:07:22 · 1218 阅读 · 0 评论 -
块层介绍 第二篇: request层
原文链接:https://lwn.net/Articles/738449,本翻译稿最先发表在陈莉君老师的“Linux内核之旅”公众号。摘要: 本文翻译自Neil Brown发表在LWN上的两篇介绍块层的文章。Neil是前MD RAID的maintainer,他通过这两篇文章,提纲契领地描绘了块层的主脉络。Linux 块层向上为文件系统和块设备提交接口,使得上层能够以统一的方式访问各种类型的后端存储设备。同时,它也向下为设备驱动提供接口,让驱动层能够以一致的方式来接受请求。一些驱动如上一篇..转载 2021-02-03 11:11:20 · 770 阅读 · 0 评论 -
块设备内核参数max_segments和max_sectors_kb解析
原文地址:http://blog.chinaunix.net/uid-22954220-id-4813537.htmlinux块设备在处理io时会受到一些参数(设备的queue limits参数,以下简称limits参数)的影响,比如一个请求中允许的最大扇区数,最大segment数等。这些参数可以在/sys/block//queue/下查看,块设备在初始化时会设置默认值。这里主要分析max_segments和max_sectors_kb。1. 基本概念1.1 段的概念首先就需要了解一下什么是段转载 2021-02-03 10:53:08 · 998 阅读 · 0 评论 -
qemu: virtio 设备 VIRTIO_PCI_QUEUE_NOTIFY 寄存器处理
目录1. 问题描述2. 问题跟踪及解释1. 问题描述VIRTIO_PCI_QUEUE_NOTIFY 是前端驱动进行 KICK 的接口,前端驱动写完报文,就要通过VIRTIO_PCI_QUEUE_NOTIFY 发送 KICK 消息给qemu以便发送出来,我们以0.95为例,在QEMU中抓取对VIRTIO_PCI_QUEUE_NOTIFY 的写操作,发现只有一次VIRTIO_PCI_QUEUE_NOTIFY 的IO写操作,和预期是不符合的但从前端驱动打印来看,确实每个报文都...原创 2021-01-05 17:22:50 · 992 阅读 · 1 评论 -
qemu: 内存初始化
1. 基本数据结构原创 2020-12-29 16:24:16 · 1065 阅读 · 0 评论 -
qemu: 设备后端模拟
1. 网卡模拟参数:-netdev type=tap,id=eth0,ifname=tap30,script=no,downscript=no -device e1000,netdev=eth0,mac=12:03:04:05:06:08或-net nic,model=e1000,netdev=eth0 -netdev tap,ifname=tap30,script=no,downscript=no,id=eth02. 网卡参数解析解析完的参数放到QemuOptsList ...原创 2020-12-21 09:42:51 · 1496 阅读 · 1 评论 -
PCI:传输层概述
1. 传输层概览消息类型Memory Transactions I/O Transactions Configuration Transactions Message Transactions2. 报文格式头部包括原创 2020-12-12 19:11:59 · 309 阅读 · 0 评论 -
CentOS虚拟机调试标准模板
<domain type='kvm' id='16'> <name>t1_vm</name> <memory unit='KiB'>4097152</memory> <currentMemory unit='KiB'>4097152</currentMemory> <vcpu placement='static'>4</vcpu> <cpu mode='host-model'...原创 2020-09-21 16:27:01 · 281 阅读 · 0 评论 -
per-CPU 的一个好处
per-CPU 变量的更新可以是locklessly 的原创 2020-09-04 11:15:49 · 176 阅读 · 0 评论 -
SK_BUFF 内核打印调试
为了更方便的调试报文,需要对sk_buff的真正数据载荷进行调试输出,只需要在驱动中加入如下代码就可以调试了static void qdmalib_dump_skb(struct sk_buff *skb, struct net_device *dev){ int i = 0; if(!skb || !dev){ pr_err("%s: bad param\n",__FUNCTION__); goto out; } netdev_printk(KERN_INFO, dev...原创 2020-08-05 14:27:22 · 2381 阅读 · 1 评论 -
QDMA v2018.3 遇到的坑(持续更新)
Q1. v2018.3 内核版本C2H无法正常收取报文A1:在descq_process_completion_st_c2h()中, 只有判断到cmpl.f.desc_used 非0 时才会调用rcv_pkt 来收取报文;但是v2018.3 的QDMA 逻辑里面存在问题,并不会将desc_used置位,需要修改parse_cmpl_entry(),“cmpl->f.desc_used = 1; cmpl->len = (cmpt[0] >> S_C2H_CMPT_EN...原创 2020-07-24 11:35:29 · 2007 阅读 · 1 评论 -
系统性能工具分析套件安装包
yum install sysstat.x86_64pidstat原创 2020-07-16 14:00:35 · 189 阅读 · 0 评论 -
Linux 下统计工程的代码行数
find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.sh" | xargs cat | wc -l原创 2020-06-16 13:12:10 · 420 阅读 · 0 评论 -
QDMA 中断
QDMA Interrupt 相关内容Interrupt ModuleThe IRQ module aggregates interrupts from various sources into the PCIe® integrated block core interface. The interrupt sources are queue-based interrupts, user interrupts and error interrupts.Queue-based interr.原创 2020-06-02 14:40:14 · 1649 阅读 · 3 评论 -
bootsec加载内核system及SETUP初始执行
bootsec加载内核system及SETUP初始执行 目录 教学视频bootsec加载内核system程序及SETUP程序初始执行1. 载入SYSTEM代码2. 确认根文件系统设备号3. 跳转到 SETUP 程序5. 执行 SETUP 程序直达底部 教学视频 1. 载入SYSTEM代码 第二批代码 setup 已经载入内存, 现在要加载第三批代码 system 。 仍然使...原创 2019-02-08 16:44:56 · 544 阅读 · 0 评论 -
bootsec 加载内核 setup 代码
bootsec 加载内核 setup 代码 目录 教学视频1. 加载系统代码整体步骤2. 加载bootsec代码直达底部 教学视频 VEDIO: Linux系统启动程序bootsec加载内核setup代码 1. BOOTSEC内存规划 BIOS 已经把 bootsect 也就是引导程序载入内存了,现在它的作用就是把第二批和第三批程序陆续加载到内存中。 为了把第二批和第三批程序加载...原创 2019-02-08 10:07:07 · 369 阅读 · 0 评论 -
BIOS 加载操作系统 bootsec 代码
BIOS 加载操作系统 bootsec 代码 目录 教学视频VEDIO: BIOS 加载操作系统 启动扇区 bootsec 代码1. 加载系统代码整体步骤2. 加载bootsec代码直达底部 教学视频 1. 加载系统代码整体步骤 BIOS 将分三批逐次加载操作系统的内核代码。 第一批 由 BIOS 中断 int 0x19 把第一扇区 bootsect 的内容加载到内存;...原创 2019-02-07 23:14:10 · 1558 阅读 · 0 评论 -
Native Linux的MCE基本原理和处理函数入口(基于kernel 4.2.0+ )
在老的Intel处理器上,当硬件检测到错误后,就会对系统的每个逻辑CPU广播MCE. 这样设计是因为硬件上的缺陷,因为原来的处理器当发现了错误(如内存错误),是会随着pipeline流到任意的不可预测的CPU上去,导致系统的问题.基于这样的硬件设计问题,就产生了将MCE广播到整个系统所有CPU上去的策略,保证所有的CPU在发生错误的时候,同时陷入异常处理流程指导异常处理完成.这样的消耗其实在多so原创 2015-09-28 09:57:23 · 1743 阅读 · 0 评论 -
setup移动system程序块以及设置32位GDT,IDT
setup移动system程序块以及设置32位GDT,IDT 目录 教学视频1. 关闭中并移动SYSTEM代码2. 设置中断描述符表和全局描述符表直达底部 教学视频 setup程序移动内核代码system程序块以及设置32位GDT,IDT 1. 关闭中并移动SYSTEM代码 接下来, 操作系统要使计算机在 32 位保护模式下工作,这要做大量的重建工作, 并且持续工作到 操作系统的...原创 2019-02-09 00:31:43 · 417 阅读 · 0 评论 -
setup 程序打开 A20 实现32位寻址
setup 程序打开 A20 实现32位寻址 目录 教学视频1. 打开A20实现32位寻址2. Linux内核–A20地址线直达底部 教学视频 [Linux内核启动过程:setup程序打开A20实现32位寻址](http://toutiao.com/item/6655854296564761092/ "Linux内核启动过程:setup程序打开A20实现32位寻址") 1. 打开A...原创 2019-02-09 12:47:24 · 673 阅读 · 1 评论 -
setup程序为保护模式执行head程序做准备
setup程序为保护模式执行head程序做准备 目录 教学视频1. 编程8259A中断控制器2. 使能保护模式直达底部 教学视频 Linux内核启动:setup程序为保护模式执行head程序做准备 1. 编程8259A中断控制器 为了建立保护模式下的中断机制,setup 程序将对可编程中断控制器 8259A 进行重新编程(因为中断号和中断引脚需要重新映射)。8259A: 专门...原创 2019-02-09 15:22:39 · 291 阅读 · 0 评论 -
Linux内核启动:head程序执行过程
Linux内核启动:head程序执行过程 目录 教学视频1. 整体过程描述2. HEAD 程序设置栈寄存器3. HEAD设置IDT和GDT5. 重建GDT表和调整段寄存器6. 检测A207. 检测并开启协处理器8. main函数入栈9. 设定内核页表10. 返回执行main函数直达底部 教学视频 Linux内核启动:head程序开始执行(一)Linux内核启动:hea...原创 2019-02-10 09:31:57 · 578 阅读 · 0 评论 -
Linux内核启动:main函数设置根设备并规划内存
Linux内核启动:main函数设置根设备并规划内存 目录 教学视频1. 楔子2. 设置根设备和硬盘3. 规划物理内存直达底部 教学视频 Linux内核启动:main函数设置根设备并规划系统内存 1. 楔子 从现在开始执行 main()函数! 目的就是让用户程序能够以“进程”的方式正常运行。 能够实现这一目的的标准包括三方面的内容:用户程序能够在主机上进行运算,...原创 2019-02-12 00:22:07 · 383 阅读 · 0 评论 -
Linux内核启动:虚拟盘空间设置和内存管理结构初始化
Linux内核启动:虚拟盘空间设置和内存管理结构初始化 目录 教学视频1. 设置虚拟盘并初始化2. 初始化内存管理结构mem_map直达底部 教学视频 Linux内核启动:虚拟盘空间设置和内存管理结构初始化 1. 设置虚拟盘并初始化 接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中“虚拟盘使用标志”是否设置, 以此确定系统是否使用了虚拟盘(假设有虚拟盘...原创 2019-02-13 12:48:27 · 412 阅读 · 0 评论 -
Linux内核启动:异常和中断服务程序的挂接
Linux内核启动:异常和中断服务程序的挂接 目录 教学视频1. 初始化IDT直达底部 教学视频 视频教程 Linux内核启动:异常和中断服务程序的挂接 1. 初始化IDT 操作系统需要经常处理中断或异常。中断技术也是广泛使用的,系统调用就是利用中断技术实现的。 中断、异常都需要具体的服务程序来执行。 trap_init() 函数将中断、异常处理的服务 程序与IDT进行挂接来逐步重...原创 2019-02-13 23:29:38 · 489 阅读 · 0 评论