- 博客(47)
- 收藏
- 关注
原创 linux磁盘创建分区
创建完分区后,需要对分区进行格式化以便于使用。常用的文件系统有ext4、XFS等。创建新分区:在fdisk交互界面中,按n键创建新分区,然后根据提示选择分区类型(主分区或扩展分区),并指定起始和结束扇区。创建新分区:在gdisk界面中,按n创建新分区,选择代码(如Linux文件系统的代码为8300),并设定起始与结束扇区。启动fdisk工具:sudo fdisk /dev/sda(假设对/dev/sda硬盘进行分区)。设置分区类型:创建完分区后,使用t键设置分区类型,通常选择83(Linux文件系统)。
2025-04-02 10:36:28
495
原创 LINUX磁盘动态扩容
使用growpart工具扩容,2表示扩容vda2。然后使用lsblk查看,vda2已变为19.8G。刷新文件系统容量成功。查看文件系统容量更新。此时查看文件系统容量仍然没有变化。lsblk查看系统的磁盘容量。,刷新ext4文件系统容量。,刷新xfs文件系统容量。
2025-03-06 16:36:56
344
原创 centos7升级GCC
2)查看./contrib/download_prerequistites里的下载源(也在gcc的配套组件里),从其它机器上手动下载相关版本的组件后上传到本地机器。1)需要从其它机器上下载gcc后上传到本地机器。
2025-03-06 10:35:40
234
原创 网卡驱动调试问题记录
根据日志分析汇编代码,ndev_cq_resource_unit+0x4b具体的代码位置是在dma_free_coherent接口。而主机申请队列时设备返回的是global qpn,第一次驱动加载时,设备从0开始分配,那么global qpn=local qpn,不会有问题。分析出错位置,ndev_handle_tx_comp.isra.20+0x32是在打印日志,问题大概率出在一个内存指针访问。发送完成事件中,拿到在ndo_start_xmit接口里记录在tx_queue结构中的的SKB,进行释放。
2025-02-14 19:46:42
340
原创 内核打印相关问题
sys/kernel/debug/dynamic_debug/control会显示所有的dev_dbg/pr_debug打印列表。在/sys/kernel/debug/dynamic_debug/control的输出中,我们上面的操作都会体现出来。1)printk是最常见的一类(dev_dbg和pr_dbg在开启DYNAMIC_DEBUG后不会直接调用printk,而是调用printk的子函数vprintk_emit)2)/proc/kmsg接口,每次cat拿到的是增量日志;DEBUG类型不可以。
2025-02-05 16:17:17
1221
原创 centos7.6升级cmake+编译pcm工具
编译过程中遇到问题,centos7自带的cmake版本为2.8.5。但目前很多开发包都要求3.5以上。所以需要升级cmake。按照README编译即可。github下载位置。
2024-11-28 14:50:58
397
原创 coredump生成失败的问题分析
因为需要在每次生成core文件的时候,对过往的core文件进行清理,防止core文件占用磁盘空间过大引发系统级异常,所以使用了“管道+自定义处理脚本”的方式。在梳理清楚原理后,定位发现问题出现在这里,因为这个脚本每次都有被调用执行,而且$1这个文件名是正确的,是一个带有空格的线程名称的字符串。当然,同步清楚解决方式后,运维同学在此基础上,采用了先对带有空格的字符串进行处理,将其替换为“_"的方式,这样使用起来更加友好。毕竟一个名称里带有空格的文件,不管从视觉上还是文件打开的时候,都有些怪异。
2024-10-12 11:14:13
642
原创 coredump文件和kernel.core_pattern
call_usermodehelper_exec是在kernel/umh.c中定义的,会把生成core文件的操作使用queue_work调度到system_unbound_wq来执行,然后等待其执行完成后退出。产品调测过程中,进程有概率会发生crash。内核会通过管道的方式,把core文件传入这个脚本中,所以在这个脚本中一定要有cat > corefile的操作,来生成core文件。如果第一个字符是|,说明是管道的形式,用户可以通过管道的方式在一个脚本中接收数据,这个脚本中可以添加自己的处理。
2024-10-10 18:24:32
1233
1
原创 linux路由基础知识(一)
2)一个是用户态发起connec/bind,或者内核tcp接受路径回复ack的时候,会有出向output路由表的创建和查找。路由表项的增加和查询,fib_table_insert和fib_table_lookup。跟踪fib_table_insert和fib_table_lookup两个接口。在创建路由的时候,可以捕获到fib_table_insert接口的使用。1)一个是接收报文路径,会有入向input路由表的查找;正常的接受报文会触发路由表的查询。内核路由表:fib_table。
2024-07-18 18:04:50
287
原创 使用dev_dbg调试
在/sys/kernel/debug/dynamic_debug/control的输出中,我们上面的操作都会体现出来。如果函数后面是“=p”,则说明开关打开。如果是“=_”,则说明开关关闭。与printk不同的是printk会打印到串口输出,但dev_dbg不会。首先内核要使能两个配置才可以使用。一般内核都是打开的。比如我们想打开rdma设备gid管理的相关日志。
2024-06-17 19:11:32
647
原创 内核PID管理基础知识
问题背景:某业务处理性能不足,引发主机性能抖动。解决方案:结合后期的项目经验+实际测试结果来看,配置实时线程、绑核,短平快且有效果。实时线程和绑核涉及内核的调度策略,并非业务逻辑,所以内核和操作系统提供了完善的操作接口(chrt / taskset)用来配置。实际操作中遇到的一个问题是,原来的tlp线程并没有pthread_setname_np()配置线程名称,那么如何获知哪个是tlp线程呢?
2024-05-31 17:38:32
150
原创 initramfs及rpm/dracut操作
导致原来机器上的驱动被打包到了initramfs中,即使后续更新驱动,内核启动的时候始终加载的是initramfs中的旧驱动。之前如何解决的问题呢,将/lib/modules/'uname -r'/extra目录下的驱动手动删除掉,然后重新安装一下内核rpm包,这样新打包的initramfs就不会带有我们自己的驱动了。initramfs和根文件系统的镜像文件属于操作系统的范畴,不会在内核安装包里,那他们是怎么生成的呢?它们是在执行内核rpm包安装的时候,根据当前机器上的操作系统环境生成的!
2024-05-07 20:19:49
1204
原创 GRUB常见操作
进入救援模式后,看到跟分区确实满了,然后把/var/crash下面的内核crash文件删除掉释放出了一半的空间。这个文件是生成grub.cfg文件时候的基础参考文件,我们需要修改的内核启动参数就定义在GRUB_CMDLINE_LINUX。2)后续安装新的内核版本时,新内核的启动命令行也会根据/etc/default/grub生成,使用更新后的参数。2)修改完成后,会提示输入某个按键,可以“使用修改后的命令行参数继续启动”。1)新生成的grub文件里,所有的内核启动命令行都会使用更新后的参数。
2024-05-07 11:12:01
2555
原创 内核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
1215
原创 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
938
转载 Linux下反汇编指定的函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/wangzuxi/article/details/41322131。
2024-05-04 14:10:28
343
原创 yum下载安装包
对于不能连接外部网络的centos系统,显然yum无法使用,需要将安装包拷贝到机器上安装,但去哪里去寻找和下载安装包呢。对于连接网络的centos系统,可以直接通过yum install安装应用。如果已经安装过,可能会提示无法再次安装,则使用reinstall即可。yum工具贴心的提供了这项服务。二、yum downloads。
2024-05-04 14:00:22
3584
1
原创 bpftrace -l和kprobes使用
使用kprobe测试时,会发现有些接口无法使用。比如do_execveat_common这个接口,在另一个版本接近的内核源码中可以看到,但实际注册提示找不到这个接口。有可能是因为内核源码不完全一致,也可能是因为有的接口在编译时被优化掉了?
2024-04-26 12:31:04
551
原创 内核debug工具
比如funcgraph,如果通过手动配置ftrace需要自行操作/sys/kernel/debug/tracing/目录下的tracing接口。当然还有一些更多的功能,比如文件相关/内存相关/进程相关,每个命令还可以提供多个选项。perf-tools已经是一个非常成熟通用的内核debug以及性能检测工具。基于内核自身的ftrace/ eBPF功能,帮助我们封装了多个常用的功能。brendangregg的perf- tools工具。
2024-04-25 16:50:03
247
原创 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
664
原创 vscode outline窗口显示函数列表
3、配置工程头文件路径,Ctrl+Shift+p, 选择C/C++:Edit Configurateions(JSON),弹出c_pp_properties.json文件进行配置。4、如果还是不行,切换成中文显示。
2024-03-18 15:14:34
1020
原创 内核物理地址资源管理
解析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
790
原创 内核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
662
原创 /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
646
原创 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
1027
转载 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
289
原创 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
721
原创 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
686
1
原创 HEAP CHECKER工具使用记录
google的内存泄露检测工具,使用libtcmalloc.so代替默认的libc库,对malloc和free、mmap和munmap等内存申请释放的位置进行跟踪。
2023-09-19 19:09:57
332
原创 QEMU/KVM透传设备中断实现
VFIO的msix bar空间不是向用户态透传的,而是GUEST退出到KVM/QEMU里处理的。原因也比较容易理解,就是虚机里的MSIX中断需要QEMU和KVM的复杂处理,所以必须退出到主机。
2023-09-18 00:17:47
654
原创 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
173
1
原创 QEMU内存管理模型
内存管理作为核心模块,不仅重要而且复杂。本文主要是为了个人学习,理清基本框架。文章重点还是针对一些原理来分析,为什么会这样设计,实现了什么目标,这样更容易理解。所以一定要明确一点,QEMU的内存管理旨在处理VM的所有地址空间访问,这是核心的目的。
2023-04-21 18:37:13
1556
原创 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
1220
1
原创 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
1648
原创 IOMMU地址映射
本文结合vt-directed-io-spec和内核的实现,对IOMMU的地址映射机制有了基本的认识,在此记录。最开始的原因是之前看ATS时对于first-stage和second-stage的困惑,因为近几年引入了pasid模式,IOMMU的映射机制也看起来复杂了很多,所以对整个映射机制进行了梳理。
2023-01-29 19:19:12
1720
原创 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
1120
原创 IOMMU_GROUP创建流程
内核的iommu驱动在drivers/iommu下,因为虚拟化相关的设计与硬件体系架构强相关,所以iommu的驱动包含软件提取的通用框架层代码和各体系结构相关代码,包括intel/amd/arm等。
2022-12-22 18:46:52
1563
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
3227
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人