自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 initramfs及rpm/dracut操作

导致原来机器上的驱动被打包到了initramfs中,即使后续更新驱动,内核启动的时候始终加载的是initramfs中的旧驱动。之前如何解决的问题呢,将/lib/modules/'uname -r'/extra目录下的驱动手动删除掉,然后重新安装一下内核rpm包,这样新打包的initramfs就不会带有我们自己的驱动了。initramfs和根文件系统的镜像文件属于操作系统的范畴,不会在内核安装包里,那他们是怎么生成的呢?它们是在执行内核rpm包安装的时候,根据当前机器上的操作系统环境生成的!

2024-05-07 20:19:49 599

原创 GRUB常见操作

进入救援模式后,看到跟分区确实满了,然后把/var/crash下面的内核crash文件删除掉释放出了一半的空间。这个文件是生成grub.cfg文件时候的基础参考文件,我们需要修改的内核启动参数就定义在GRUB_CMDLINE_LINUX。2)后续安装新的内核版本时,新内核的启动命令行也会根据/etc/default/grub生成,使用更新后的参数。2)修改完成后,会提示输入某个按键,可以“使用修改后的命令行参数继续启动”。1)新生成的grub文件里,所有的内核启动命令行都会使用更新后的参数。

2024-05-07 11:12:01 285

原创 内核workqueue框架

并从全局unbound_pool_hash中找到一个attrs属性指定的work_pool,如果没有会新建一个,将这个worker_pool配置给pwq。实际配置给pwq的是高优先级worker_pool。workqueue驱动的底半部实现方式之一就是工作队列,作为内核的标准模块,它的使用接口也非常简单,schedule_work或者指定派生到哪个cpu的schedule_work_on。还有部分场景会使用自定义的workqueue,这种情况会直接调用queue_work和queue_work_on接口。

2024-05-04 19:41:03 1000

原创 pci设备驱动加载及workqueue基础知识

但udev的执行路径会等待probe的工作任务完成,从系统的call_trace调用栈可以看到,是hung在pci_call_probe->work_on_cpu->....的路径。系统的工作队列是记录于全局的system_wq中。workqueue_struct的结构体如下,其实poll_workqueue才是work_struct直接挂载的结构。如果是schedule_work接口,会传入WORK_CPU_UNBOUND,此时就会选择schedule_work的执行路径当前的cpu。

2024-05-04 15:33:45 623

转载 Linux下反汇编指定的函数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/wangzuxi/article/details/41322131。

2024-05-04 14:10:28 9

原创 yum下载安装包

对于不能连接外部网络的centos系统,显然yum无法使用,需要将安装包拷贝到机器上安装,但去哪里去寻找和下载安装包呢。对于连接网络的centos系统,可以直接通过yum install安装应用。如果已经安装过,可能会提示无法再次安装,则使用reinstall即可。yum工具贴心的提供了这项服务。二、yum downloads。

2024-05-04 14:00:22 236 1

原创 bpftrace -l和kprobes使用

使用kprobe测试时,会发现有些接口无法使用。比如do_execveat_common这个接口,在另一个版本接近的内核源码中可以看到,但实际注册提示找不到这个接口。有可能是因为内核源码不完全一致,也可能是因为有的接口在编译时被优化掉了?

2024-04-26 12:31:04 304

原创 内核debug工具

比如funcgraph,如果通过手动配置ftrace需要自行操作/sys/kernel/debug/tracing/目录下的tracing接口。当然还有一些更多的功能,比如文件相关/内存相关/进程相关,每个命令还可以提供多个选项。perf-tools已经是一个非常成熟通用的内核debug以及性能检测工具。基于内核自身的ftrace/ eBPF功能,帮助我们封装了多个常用的功能。brendangregg的perf- tools工具。

2024-04-25 16:50:03 127

原创 malloc和mmap的实现原理

用户free释放内存后,如果heap区域顶端有连续超过128KB的空闲内存,则调用trim系统调用执行内存紧缩(默认128KB,可通过 M_TRIM_THRESHOLD 选项调节)。当[heap]中的内存空间不够时,会调用brk系统调用,为Heap区域向上扩展内存。2)mmap的虚拟内存空间位于Memory Mapping Segement,多用于大块内存的申请释放。1)malloc/free的内存位于Heap堆空间,多用于小内存的申请释放。1、malloc和mmap分属于不同的内存区域。

2024-03-18 16:33:45 368

原创 vscode outline窗口显示函数列表

3、配置工程头文件路径,Ctrl+Shift+p, 选择C/C++:Edit Configurateions(JSON),弹出c_pp_properties.json文件进行配置。4、如果还是不行,切换成中文显示。

2024-03-18 15:14:34 198

原创 内核物理地址资源管理

解析rc设备树中的bus-ranges属性和ranges属性,由于rc设备树中未定义bus-ranges属性,所以使用默认的bus范围,即0~0xff。内核维护所有的地址空间使用ioport_resource和iomem_resource,一个表示IO资源,一个表示MEM资源,这两个结构体会记录所有可用的资源。QEMU里也是有address_space_mem和address_space_io两个全局的MemoryRegion,思路是类似的。所有的PCI设备也都是以一个树形结构管理的。

2024-03-15 10:52:27 370

原创 内核RSS内存占用的代码记录

kernel_clone接口会一直调用至dup_mmap接口,将父进程的页表拷贝给子进程。线程是复用主线程的mm_struct的,所以线程应该不会有copy_page_range的操作。copy_page_range接口会依次遍历每一级页表,完成拷贝。在最后一级copy_pte_range接口中的实现如下。在copy_present_pte中,更新rss计数是通过调用rss[mm_counter(page)]++;而其中的RSS到底是一个什么值,内存管理模块在哪里更新RSS的数据的。

2024-03-06 20:38:40 421

原创 /proc/$pid/目录的内核源码实现

而我们的/proc/$pid/stat里的RSS,没有包括换出的页面,所以是当前实际占用的物理内存。proc_tgid_stat又调用了do_task_stat接口,这个接口里可以与我们实际cat /proc/$pid/stat的结果相对应。get_mm_rss(mm)的实现接口如下。以/proc/$pid/stat为例,找到"stat"这一项,stat的数据就是通过proc_tgid_stat命令生成。/proc/$pid/目录作为基础的proc文件系统操作,是在fs/proc中注册的。

2024-03-06 19:00:44 387

原创 usleep(0)与sched_yield() 调度及cpu_relax()

1、cpu_relax()用于短时间的忙等待,比如每个用户持锁的时间很短,让出cpu的代价不如忙等待。它和死循环等待的区别是,cpu空转功耗会低。所以一定会陷入内核态,调用deactivate_task触发任务调度,然后进行任务切换。而任务调度是比较耗时的。结论:重量级usleep(0) > sched_yield() > cpu_relax()2、sched_yield会调用sched_yield系统调用。3、usleep(n)会调用nanosleep系统调用。所以一定会陷入内核态,触发任务切换。

2024-03-06 12:54:46 431

转载 centos 7 journal: Suppressed xxx messages from /system.slice/xxx.service 问题的处理

初看提示,似乎和Centos6 上的syslog提示有些相似之处,消息被抑制,不同的是消息来源变成了journal服务, 后面通过资料得知自rhel/centos7 后默认的syslog将逐步被systemd-journal 日志替代,在高并发的nginx服务器上,每秒成千上万条很容易被默认的配置给抑制,导致日志丢失,不完整的现象,要修改限制很简单,即修改速率限制参数,完成后重启即可,命令如下。修改 /etc/rsyslog.conf。

2024-02-26 17:21:24 59

原创 RDMA基础知识

1、MLNX5的QPC和CQC包含哪些内容,在内核代码中可以大概看到它的一部分内容,在/include/linux/mlx5/mlx5_ifc.h文件中,定义了内核关于QPC和CQC的关键命令格式数据,下发给设备侧创建QP和CQ。2、Amazon的EFA卡,QPC和CQC的内容,同样可以从下发的管理命令来查看,drivers/infiniband/hw/efa/efa_com_cmd.h。不管是VIRTIO/RDMA/NVME,所有的数据通信都离不开两部分,控制通道的基础准备工作和数据通道的高速数据通信。

2023-12-29 17:28:28 460

原创 MMAP接口实现原理

mmap接口是很常用的用户态内存映射接口,大部分时候用于映射一个文件,也可以映射一块内存。

2023-10-13 18:03:10 186

原创 QEMU热迁移脏页同步

将KVMSlot->dirty_bmap同步到全局ram_list.dirty_memory[DIRTY_MEMORY_MIGRATION]中时,调用cpu_physical_memory_set_dirty_lebitmap(),代码如下。用这种方式,其实完全避开了GPA,我们的脏页都是通过RAM视图的地址来拷贝的。一个在ram_list.dirty_memory[DIRTY_MEMORY_MIGRATION]中,会将所有KVMSlot中的dirty_bmap同步到一个完整的dirty_memory中;

2023-10-04 19:29:04 256 1

原创 HEAP CHECKER工具使用记录

google的内存泄露检测工具,使用libtcmalloc.so代替默认的libc库,对malloc和free、mmap和munmap等内存申请释放的位置进行跟踪。

2023-09-19 19:09:57 177

原创 QEMU/KVM透传设备中断实现

VFIO的msix bar空间不是向用户态透传的,而是GUEST退出到KVM/QEMU里处理的。原因也比较容易理解,就是虚机里的MSIX中断需要QEMU和KVM的复杂处理,所以必须退出到主机。

2023-09-18 00:17:47 249

原创 QList的结构

如果作为head指针,则使用QTAIL里的一个指针tqh_first字段,用来记录第一个数据。如果作为有效数据,则包含两个指针,tql_next用来指向下一个数据(void *),tql_prev用来指向上一个QTAIL里的QTailQLink字段(struct QTailQLink*)。相应的QTAIL接口都是用宏定义命名的,有多组不同的接口,QTAILQ_INSERT_HEAD, QTAIL_INSERT_TAIL, QTAIL_INSERT_AFTER, QTAIL_INSERT_BEFORE.

2023-08-29 18:00:17 101 1

原创 QEMU内存管理模型

内存管理作为核心模块,不仅重要而且复杂。本文主要是为了个人学习,理清基本框架。文章重点还是针对一些原理来分析,为什么会这样设计,实现了什么目标,这样更容易理解。所以一定要明确一点,QEMU的内存管理旨在处理VM的所有地址空间访问,这是核心的目的。

2023-04-21 18:37:13 947

原创 ethtool查询virtio网卡异常的问题

用户反馈,虚机内使用ethtool查询网卡信息,显示如下:而以前显示并没有这个奇怪的字符串,n/a就是正常显示为0的。因为虚机的网卡是VFIO透传我们的VF网卡,所以怀疑可能是VF工作有一些异常。首先从我们自身的设计和VFIO的工作原理来看,PF和VF应该不会在队列个数上有什么差异。所以综合分析推测,跟工作环境有关系(内核版本、ethtool版本),所以向客户要了相应的信息,Centos8.4及centos发布的4.18内核。ethtoool --version查看版本号是5.8。

2023-04-05 20:58:52 758

原创 QEMU pcie config空间访问机制

而pci_host_conf/data_le_ops的定义是在hw/pci/pci-host.c里,对于0xCF8端口的处理,因为是地址选通,所以只需要在write的时候记录、read的时候返回记录的值即可。而pci_host_config_write/read_common接口,在前256Bconfig空间的模拟中,也同样是会调用这个接口,所以后续的处理都是一样的。这是真实的硬件设计,而对于QEMU+KVM的虚机场景,显然是要基于硬件实现和虚拟化的需求设计虚机访问config空间的完整流程。

2023-03-22 15:25:40 891

原创 IOMMU地址映射

本文结合vt-directed-io-spec和内核的实现,对IOMMU的地址映射机制有了基本的认识,在此记录。最开始的原因是之前看ATS时对于first-stage和second-stage的困惑,因为近几年引入了pasid模式,IOMMU的映射机制也看起来复杂了很多,所以对整个映射机制进行了梳理。

2023-01-29 19:19:12 999

原创 ATS capability

ATS capability的格式很简单,只有两个寄存器,cap和ctrl。

2023-01-12 21:21:21 166

原创 Vt-d Device-TLB原理和实现

Device-TLB的出现是为了减轻DMA访问地址映射单元(intel命名VT-d,amd命名iommu,后面习惯于称呼iommu)的压力。我们简单想一下IOMMU和MMU的区别,IOMMU负责设备访问映射,MMU负责CPU访问映射。MMU为CPU上运行的每个软件实体(进程)维护一份页表,起到进程间地址隔离的作用;IOMMU为每个设备提供一份页表,起到设备间地址隔离的作用。

2022-12-23 21:14:40 729

原创 IOMMU_GROUP创建流程

内核的iommu驱动在drivers/iommu下,因为虚拟化相关的设计与硬件体系架构强相关,所以iommu的驱动包含软件提取的通用框架层代码和各体系结构相关代码,包括intel/amd/arm等。

2022-12-22 18:46:52 890 1

原创 QOM(QEMU)设备管理机制概述

QEMU的对象管理是很重要的一个部分,linux中一切皆文件,作为整个虚拟机的后端,qemu中虚拟的一切实体皆Object,不管是CPU、设备还是KVM的使用都离不开QOM框架(Qemu Object Module)。本文对QOM设备管理机制做简单清晰的介绍,然后以VIRTIO设备举例说明,方便更好的理解。一、关键数据结构QOM采用了C++里面向对象的命令方式,每一类对象会实例化一个Class,类的成员是这类对象通用的内容,比如一些统一的操作接口(方法)、VIRTIO设备的PCI VENDOR/

2022-05-07 18:43:41 2748

原创 VIRTIO后端框架QEMU与VHOST分析

virtio设备的前端是guest的内核驱动,后端是qemu中的virtio模块。virtio分为控制通道和数据通道,控制通道用于协商创建数据通道,数据通道为真正的

2022-02-23 19:39:43 3903

原创 VIRTIO0.95与1.1控制面协议简析

virtio最初的设计目的就是在guest和host之间建立一个通道,达到更高效的数据传输。传统的模拟io的方式,guest可以不感知,称为全虚拟化,但是guest每次向设备写入数据都需要做一次VM-exit,效率极低;virtio称为半虚拟化的方式,guest是会感知的,因为他需要专门的内核驱动(前端VIRTIO驱动),而不是原本的网卡驱动。在guest侧,virtio模拟的设备显示出来是virtio-net/virtio-blk这样的设备类型。所以本质上,VIRTIO就是一种协议,目的就是令

2022-01-14 17:55:21 3109

原创 VIRTIO-BLK设备SERIAL ID

一、需求从云的管理面来看,对每个设备的管理都要有一个id来作为唯一标识,这个id会通过管理面下发给每个终端,后续使用该id对终端的设备进行管理。比如net设备的端口号,block设备的by-id。当前的需求,云管控面向DPU卡的管理面发起创建block设备的请求,同时传入block设备的管理ID,要求主机侧实际看到的block设备在/dev/disk/by-id下绑定下发的管理ID。云管理面下发ID:主机侧显示ID:二、实现这个ID如何提供给主机的?在控制面的bloc

2022-01-10 14:58:30 1230

原创 VIRTIO协议——split queue与packed queue

一、概述virtio的数据通道主体是virt queue,在virtio1.0及之前的版本,virtio协议只支持split queue,packed queue是virtio1.1引入的。virtqueue的主体是一块VM和VMM之间的共享内存,客户机通过这片内存向host发送和接收数据,这片内存在内核中的数据结构称为vring。packed queue与split queue相比,精简了vring的结构,将原来的avail ring和used ring合并为一个ring,通过提升软件的处理算法达

2021-12-27 17:33:36 3015 3

原创 Mellanox网卡驱动——representor框架学习

背景:DPU多是参考mellanox网卡软硬件框架。对于ovs快速转发路径硬化的场景,网络报文进入进入FPGA的网口,如果流表匹配,直接通过快速路径送到主机。如果不能匹配,则需要soc上的ovs慢速路径创建新的流表项,然后下发给FPGA。云场景下,一般都是虚拟机和容器的场景,网卡会开启VF,每个VF都可以作为一个网卡设备使用。mellanox的网卡针对这种场景使用了representor的概念。在soc上为每个representor口虚拟出了一个representor,每个representor都对应一

2021-12-06 19:02:21 4113

原创 DPDK内存管理——mempool和mbuf的理解

DPDK针对高性能pcie设备,设计了专门的mempool内存管理模型,具体的数据结构形式是rte_mempool和rte_mbuf。在mempool的实现中,每个elem称为mbuf,驱动从mempool中申请每个mbuf使用。每个mempool在创建的时候指定了mbuf的个数和大小,每个mbuf大小是一样的,所以mempool占用多少空间在申请的时候就是确定的,这种模式不同于heap的动态扩展。在mempool申请的空间里,所有的mbuf依次排列,具体的内存拓扑及软件组织形式见下图。一、m.

2021-11-15 18:25:52 6145

原创 DPDK内存管理——iova地址模式(虚拟/ 物理 地址)

1、rte_eal_init()2、rte

2021-11-13 15:59:20 5334 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除