- 博客(286)
- 收藏
- 关注
转载 Linux锁机制:可抢占RCU原理
也就是说,rdp所持有的gp编号可能仍是老的。通常对临界区的保护会使用锁,而锁的实现通常会用到共享内存,用到共享内存那么就会存在对共享资源的访问竞争,核与核之前还会有数据一致性的问题,由于这两点的存在,系统会在性能上付出一定的代价,在大型系统上性能的regression会表现的更加明显,所以锁的可扩展性通常不会太好。关于RCU,我对它的理解是它将对数据块的保护转化成了对指向数据块的指针的保护,极大的简化了对被保护资源的保护的难易程度,而对指针的保护则通过封装原子操作和各种屏障就可以确保,这样就用不到锁了。
2025-04-09 21:12:09
3
转载 剖析Linux调度器源码解读之《运行流程分析》
其实根据我的前面博文《linux调度器源码分析基础》所说,进程调度的发生时机之一就是发生在中断返回时,这里是在汇编代码中实现的,而我们知道这里我们是时钟中断执行上述的这些操作的,当执行完这些后,从时钟中断返回去的时候,会调用到汇编函数ret_from_sys_call,在这个函数中会先检查调度标志被置位,如果被置位,则跳转至schedule(),而schedule()最后调用到__schedule()这个函数进行处理。这里普通进程调度类的task_tick()是task_tick_fair()函数。
2025-04-08 11:50:16
6
转载 剖析Linux内核源码解读之《调度器源码分析》
这个调度类具体有什么用呢,实际上在内核中不同的调度算法它们的操作都不相同,为了方便修改、替换调度算法,使用了调度类,每个调度算法只需要实现自己的调度类就可以了,CFS算法有它的调度类,SCHED_FIFO也有它自己的调度类,当一个进程创建时,用什么调度算法就将其 task_struct->sched_class 指向其相应的调度类,调度器每次调度处理时,就通过当前进程的调度类函数进程操作,大大提高了可移植性和易修改性。对于根的红黑树而言,一个进程组就相当于一个调度实体,一个进程也相当于一个调度实体。
2025-04-08 11:45:04
5
原创 Box86源码剖析(三)
转自https://blog.youkuaiyun.com/qq_37596943/article/details/109494178?ops_request_misc=%257B%2522request%255Fid%2522%253A%25227efa2cba92170f374ed650fdb7008b45%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=7efa2cba92170f374ed6
2025-03-28 15:58:43
583
转载 Box86源码剖析(二)
Run()的主要操作其实就是模拟 X86可执行程序的机器码解码过程,然后找到对应的操作用代码来模拟实现,这样在真正主机上编译完成后就会去真正执行当前环境下的对应操作了。AllocElfMemory(my_context, elf_header, 1) 根据 elf_header 中的信息去申请需要的内存区大小,用于后面存放对于的数据。) 导入需要的库内容,前面的操作刚刚完成将需要的库信息导入到 my_context 中,这里就找到对应的文件读取导入。(速度有些缓慢,中间遇到部分不懂的地方也需要搞清楚的。
2025-03-28 15:47:15
11
原创 Box86源码剖析(一)
Box86源码剖析Box86 介绍源码导读box86 源码解析(main入口开始) 和 读取当前执行参数并输出打印信息读取可执行文件ELF文件解析相关的结构体节区(section)程序(program)CalcLoadAddr(elf_header)GitHub 上流传的类似于 QEMU 的架构模拟器,并且是专用于模拟 x86 架构的模拟软件 Box86 开源代码,具体网址:github链接通过 Box86 能够在非x86 Linux(例如ARM)上运行 x86 Linux 程序(
2025-03-28 15:42:45
905
转载 浅析linux 内核 高精度定时器(hrtimer)实现机制(二)
转:https://zhuanlan.zhihu.com/p/5445131453.5 定时器的迁移 switch_hrtimer_base前面提到过了,在正式激活一个高分辨率定时器的时候,有可能对其进行迁移,这个动作是在switch_hrtimer_base函数中完成的:该函数首先会调用 get_target_base 函数,试着挑选出一个新的 hrtimer_cpu_base 结构体变量:在分析(低分辨率)定时器层的时候也有定时器迁移的概念,也是用叫做get_target_base的函数选择新
2025-03-21 18:11:56
24
转载 浅析linux 内核 高精度定时器(hrtimer)实现机制(一)
每个 hrtimer_cpu_base 结构体中有一个 hrtimer_clock_base 类型的数组变量 clock_base,目前数组元素是8个,分别用来存放8种到期时间类型的高分辨率定时器。如果不需要迁移,则返回的 hrtimer_clock_base 结构体和调用参数是一样的,否则会返回一个新的要迁移到的 hrtimer_clock_base 结构体。随着系统的运行,高分辨率定时器不停地被创建和销毁,新的高分辨率定时器按顺序被插入到红黑树中,树的最左边的节点就是最快到期的定时器。
2025-03-21 17:47:07
38
转载 一文读懂linux内核softlockup原理
转:https://zhuanlan.zhihu.com/p/25525573115softlockup是指linux系统某个cpu长时间关闭抢占,通常是内核中的某个线程或进程在关键路径上长时间占用 CPU 而不释放,导致系统无法正常调度其他任务。它的后果可能包括系统性能下降、服务中断,甚至系统完全无响应。有softlockup,就有hardlockup,它是指系统某个cpu长时间关闭中断,是更严重的问题。本文主要讨论前者。
2025-03-21 10:46:10
21
转载 Linux内核为什么会发生soft lockup?
1ms间隔的时钟中断对于服务器而言是悲哀的,1ms的时间无法容纳太多的timer,也不允许每个timer中有哪怕稍微的合理耗时,1ms一次中断很容易触发run_timers在软中断上下文中被执行,但很遗憾,这就是事实。如果系统中的listener特别多,在收到SYN扫描攻击时,特别容易陷入soft lockup的深渊!我们知道,虽然loop thread是一个死循环,但是它看起来正如一个普通用户态进程一样,在执行i++循环的时候,其实是可以被其它task抢占掉的,这是最基本的进程调度的常识。
2025-03-21 10:42:59
42
原创 如何使程序崩溃并生成 Core Dump
Core Dump 文件是程序在运行时崩溃时,操作系统将程序在内存中的状态(包括代码、数据、堆栈等)保存到磁盘上的一个文件。下面我将详细介绍如何在 Linux 系统中使程序崩溃并生成 Core Dump 文件。这个命令将 Core Dump 文件生成在 /path/to/coredump/ 目录下,文件名为 core.[程序名].[进程ID].[时间戳]。gdb /path/to/your/program /path/to/coredump/core.[程序名].[进程ID].[时间戳]
2025-02-06 19:59:40
347
转载 dynamic_debug和pr_debug()
因此 pr_debug() 选取的是 dynamic_pr_debug().下面判断 struct _ddebug.key.dd_key_false 为真才进行真正的打印,又叠加了打印的工作量 ######。除了能输出 pr_debug()/dev_dbg() 函数中定义的输出外,还能输出一些额外信息,例如函数名、行号、模块名字和线程ID等。pr_debug()最终是通过printk(KERN_DEBUG)实现的,注意命令行打印等级,可用dmesg -n 8。一般只有userdebug版本才使能动态打印。
2025-01-13 12:59:01
73
转载 systemd-analyze命令:Linux系统启动分析
systemd-analyze security [unit] 是一个用于分析和调试 systemd 系统管理器的命令,它特别关注于服务的安全性和沙箱设置。这里,/path/to/graph.dot 是你之前创建的 dot 文件,/path/to/graph.png 是你希望保存生成的 PNG 图片的路径。CapabilityBoundingSet=~CAP_SYS_ADMIN - 服务具有管理员权限,这是一个非常高的权限级别,可能会带来严重的安全风险。
2025-01-07 15:27:16
105
转载 【PCIe】reset机制
设备寄存器分为静态寄存器(不可改变的)和动态寄存器(可改变的)。在PCIe设备中,一些特殊的寄存器通常使用Vaux供电,比如sticky register(ROS, RWS, RW1CS),此时即使PCIe的Vcc被移除,这些于电源管理相关的逻辑状态和这些特殊寄存器的内容也不会发生变化。PCIE device的reset,会按照不同的层次,程度从浅到深(flr < hot < warm < cold),不断升级,哪个层次的reset执行成功就直接返回,不需要执行更深层次的reset。
2024-12-03 10:35:35
498
转载 linux irq 自动探测
第三次,正向遍历,如果发现irq对应的desc上的istate的IRQS_AUTODETECT存在,但是它的IRQS_WAITING被清除了,那么说明运行到这里,发生了莫名其妙的中断,这个中断当然不是我们将要探测的中断,毕竟我们都还没触发它产生中断,于是就清除掉IRQS_AUTODETECT并禁用它的中断。如果没有中断发生,就返回0。下面分析下具体清除IRQS_WAITING的地方,以以前的中断处理为例,毕竟现在的中断控制器都会定义自己控制器的中断处理,各式各样,这里面的思想是一样的。
2024-11-20 14:49:53
60
原创 acrn 串口驱动
当使用legacy串口时(0x3f8),irq = 4 写死在guest中arch/x86/include/asm/serial.h的SERIAL_PORT_DFN。如果guest收不到中断,8250驱动无法检测到irq,8250驱动则将设备irq置0;因为RTVM下无法deliver中断,所以无法注入vuart中断给guest。acrn对串口驱动做了全模拟,具体分析文档之后写。先说说为什么RTVM guest可以使用串口,之后启timer走poll。
2024-11-20 11:46:39
201
转载 Linux下查看ACPI表的设备信息
其中就有ACPI和设备数两类,一般UEFI的BIOS引导都用ACPI表来描述信息,如果uboot,那多半就是设备树,启动后都可以在这个目录查找到。
2024-11-18 16:49:34
161
转载 APIC timer 和 TSC
举例来说,假设系统当前处于这种状态:当前正在运行的任务会在 1234 纳秒后被抢占,一个正在睡眠的任务会在 333 纳秒后被唤醒,还有一个 alarm 信号会在 44444 纳秒后发射,如此可以将 timer 的 count 设置为 333 纳秒(最早到期的 delay),当 timer IRQ 触发时,OS 会知晓距离当前任务被抢占还有 901 纳秒,距离 alarm 信号的发射还有 441111 纳秒,故而将 count 设置为 901 纳秒后再触发下一次 timer IRQ。对于系列 [06H]]、
2024-11-15 11:29:26
159
转载 深入了解iommu系列四:interrupt remapping 工作机制解析
接着遍历这个设备msi_list当中的所有的msi_desc,在调用__irq_domain_alloc_irqs 为其分配irq之前先调用pci_msi_domain_set_desc->pci_msi_domain_calc_hwirq 为每个msi_desc分配一个全局唯一的初始ID即hwirq(关于它的作用我们后面再说),接着我们来看一下__irq_domain_alloc_irqs的核心逻辑。答案就是在request_irq的时候去分配的,同时会再次调用每个domain的activate函数。
2024-11-11 10:38:29
205
转载 深入了解iommu系列三:interrupt remapping 底层硬件工作原理和驱动初始化解析
interrupt remapping of iommu的引入主要是为了解决虚拟化场景直通设备的中断投递问题,由于iommu的最重要的功能是dma处理,因此在interrupt remapping enable的情况下,系统当中所有以message signal 的形式来触发的中断都是需要iommu来处理的。所以只要是iommu打开的场景下,相关设备的msi or msix中断一定是走中断remapping的(即使你的设备并不是直通给vm的),无形中降低了中断的处理效率。为什么要remapping呢?
2024-11-11 10:29:32
324
转载 深入了解iommu系列二:iommu 工作原理解析之dma remapping
vfio_iommu是在container初始化的时候创建的,它也是per vm的;关于vfio_domain数量我们需要分析一下上面的代码片段,从实现来看如果新创建的domain的ops和prot(属性IOMMU_CACHE, IOMMU_READ, IOMMU_WRITE)跟已经存在的domain相同则直接把这个iommu_group直接attach到已存在的domain上,也就是说多个iommu_group或者说vfio_group对应一个vfio_domain。
2024-11-11 10:25:25
270
转载 深入了解iommu系列一:iommu硬件架构和驱动初始化
然后再把每个iommu下面挂着的设备跟si_domain关联起来,具体做法是说先找到这个设备所属的iommu在驱动层的表现就是找到所属的struct intel_iommu结构体,然后通过这个设备所在的bus号找到其在root_table的位置,再通过devfn创建相对应的context_entry,然后把si_dmain的pgd设置为contex_entry的基址,具体见iommu_prepare_static_identity_mapping(hw_pass_through)函数。
2024-11-11 10:17:44
924
转载 Scalable-IOV简介
关于问题1,descriptor中必须支持“PASID”字段,由于不同的PCI设备自己的descriptor格式都不尽相同,为了解决这个问题,ENQCMD/ENQCMDS使用固定64字节大小的descriptor(一下叫enq desc),enq desc的前4字节格式固定,存放PASID(可由硬件直接修改/覆盖),其它字段由支持SWQ的设备自己定义,因此一般设备内部必须有一个解析enq desc的硬件解码单元。如果硬件的descriptor中,有PASID字段,那么此时的PASID字段应该被硬件忽略。
2024-11-05 17:28:06
140
转载 x86: MTRR/PAT
PAT(Page Attribute Table) 是在线性地址空间中对映射的物理内存的一种缓存策略的描述,物理内存中的一个物理页框采用什么样的缓存策略,是由两方面决定的,一个是在物理地址空间进行描述的MTRR,一个是线性空间的PAT。Type:系统内存的默认CACHE类型,对于没有被MTRR覆盖到的内存段,就使用默认的CACHE类型;它们是一组组的MSR寄存器对(目前最多有96组),用来指定特定的系统内存段的类型。需要BIOS来完成MTRR,且在多处理器的系统中,各个处理器的设置必须是一致的。
2024-10-26 15:50:39
87
原创 x86 调频
以上命令通过将对应pCPU的最大最小performance level设置为相同的值,来达到固定pCPU频率的目的。注意以上参数皆为16进制。对于P-core,performance level和频率的对应关系为frequency=level/1.27。ACRN:>wrmsr -p6 0x774 0x00001919 # bit 0:7设置最小level,bit 8:15设置最大level。对于E-core,performance level和频率的对应关系为frequency=level。
2024-10-23 20:33:36
230
1
转载 转 Linux mount 命令
转自:https://www.cnblogs.com/sparkdev/p/9045563.html一个绑定挂载就是相关目录树的另外一个视图。典型情况下,挂载会为存储设备创建树状的视图。而绑定挂载则是把一个现有的目录树复制到另外一个挂载点下。通过绑定挂载得到的目录和文件与原始的目录和文件是一样的,无论从挂载目录还是原始目录执行的变更操作都会立即反映在另外一端。简单的说就是可以将任何一个挂载点、普通目录或者文件挂载到其它的地方。
2024-10-12 10:47:07
124
转载 x86 PCID
转:https://happyseeker.github.io/kernel/2018/05/04/pti-and-pcid.html。
2024-08-20 17:02:21
276
转载 linux下信号跟踪:jprobe_signal
问题描述:在linux环境下,有时候进程会异常退出,这个时候可以用strace 跟踪进程的运行情况。如果是进程内部错误,则strace日志可以看到进程的异常错误点。此时要找到“杀手”进程,就需要跟踪信号量,找出是谁发送了信号量给目标进程。/*jprobe_signal.c, 基于jprobe,注册钩子函数,在信号发送的地方,根据需要,打印发送信号的进程,发送的信号量,信号接收的目标进程。
2024-07-10 21:19:20
74
转载 Linux内核基础篇——神奇的系统请求键SysRq
按住SysRq复合键, 再输入第三个命令键, 可以执行相应的系统调试命令。如果内核都配置好了, 系统应该己经转换了内核的符号地址。系统请求键SysRq主要用来辅助调试和拯救系统,在系统宕机或者运行不正常的时候,通过系统请求键SysRq可以查询当前进程执行的状态,从而判断出错的进程和函数。Linux内核提供了一些与用户空间的通信机制,例如procfs接口和sysfs接口,大部分的这些接口都可以作为获取内核信息的手段。SysRq键是复合键【Alt+ SysRq】,大多数键盘的SysRq和PrtSc键是复用的。
2024-06-28 16:09:20
435
转载 PSTORE ramoops 在Linux x86_64 与 arm64上使用
接着需要将选择的物理地址段设置为保留地址,在 arch/x86/kernel/setup.c 中的 setup_arch() 函数中稍微前一些的位置中调用 memblock_reserve() 来声明保留内存;参考了 arch/x86/kernel/setup.c 中 reserve_crashkernel() 函数的实现,其保留内存的方式,其便是通过调用memblock_phys_alloc_range() 函数来实现的;在arm上,三种参数的配置方式都支持,只有设置指定预留内存的方式与x86有差异;
2024-06-28 16:07:14
164
转载 Linux内存管理:大页内存原理
当池中的页面不够时,则会通过系统分配大页填充池子,当池中的页面盈余(盈余的概念见我下面对surplus_huge_pages的注释)时,则会从池子中释放一部分的空闲页面。降低TLB miss的概率:拿普通的4KB页面和2MB的大页相比,都是使用一条页表项,能cover的内存大小却差了511倍,所以更多的使用大页能大大减少系统中页表项的数量,再加上TLB cache大小固定且有限,再再加上程序访问的地址的局部性原理,TLB miss的概率就下来了。若多于5个则释放多余的大页(前提是未被使用)。
2024-06-28 15:58:50
677
转载 浅谈 ELF 格式解析
符号属于运行时的概念,不同于段、节区是加载、链接时的概念(严格意义上来说,段是加载时,节区是链接时),所以符号项中没必要记录其加载域的地址。app.c、compiler.h、__elf.h,以及 parser.c 的部分函数 在 方案1 和 方案2 中是通用的,为不影响行文的连贯性,这部分代码直接贴在第 6 章。至于更多细节的学习,推荐《程序员的自我修炼》一书,结合 linker & loader 实现的源码阅读(推荐 TencentOS tiny 的 elfloader 组件)。
2024-06-28 10:35:46
72
转载 GRUB基础 — Multiboot规范
GRUB在之后不断扩展以满足新的需求和场景,但很快,开发者发现GRUB遵循的Multiboot规范存在一些致命的缺陷导致对某些新功能的支持非常困难,并且设计导致的bug也不断增多,因此在2002年,Yoshinori K. Okuji开始重写GRUB的核心代码并将其重命名为GRUB2,原来的GRUB被重命名为GRUB Legacy,GRUB2遵循了Multiboot2规范。每个操作系统(OS)在设计时都会考虑对boot loader的支持,OS的安装通常也涉及boot loader的预安装。
2024-06-17 21:13:55
102
原创 Linux忘记密码的解决方法
sudo pwconv //同步/etc/passwd和/etc/shadow两个文件。2、进入内核修改信息界面,找到Linux这一行,在这一行的末尾加上 init=/bin/sh。(3)来命令,给passwd文件加权限,chmod 777 /etc/passwd。(1)解决办法是,用df查看根分区,如果满的话,删除不要的文件。二,是/etc/passwd 和/etc/shadow不同步。ll /etc/passwd //查看文件权限。
2024-06-11 16:19:52
532
转载 x64架构下Linux系统函数调用
call指令会将当前指令寄存器中的内容(即这条call指令下一条指令的地址,也就是函数执行完的返回地址)入栈,然后跳到函数对应的地址开始执行。ret指令用于从子函数中返回,ret指令会先弹出当前栈顶的数据,这个数据就是先前调用这个函数的call指令压入的“下一条指令的地址”,然后跳转到这个地址执行。ret指令用于从子函数中返回,ret指令会先弹出当前栈顶的数据,这个数据就是先前调用这个函数的call指令压入的“下一条指令的地址”,然后跳转到这个地址执行。pop指令将数据出栈并写入寄存器。
2024-06-07 15:58:44
243
转载 PCIe中断之MSI和MSI-X的区别(详细)总结附图文快速掌握
本文主要介绍MSI和MSI的基本概念和差异,通过图文的方式方便读者快速掌握,最后章节也简单介绍了INTx的基本概念。MSI(Message Signaled Interrupts)是一种通过在内存中写入信息来产生中断的方式,其中内存地址由设备驱动程序和硬件设备协商确定。MSI与传统的中断线不同,它不需要单独的中断线,而是通过PCI总线进行通信。
2024-05-28 21:05:52
2051
转载 如何提交patch 到内核
按照邮件的指示,修改patch直到本地测试通过,然后,再次提交patch, 添加Report-by的签名,自动化测试通过后,模块的负责人会进行签名(Singed-off-by:)。3:patch其实没有很明确的状态,也有可能几个星期后,直接就合入了,如果长期(2个月左右吧)没有回应的话,可以更新代码,重新提交patch看看,有可能被别人修正了,也有可能遗漏了。4:尽量一个功能一个patch,如:修正了某个问题,有新的优化方案,那就需要2个patch: 一个先修正问题,一个是新的优化方案。
2024-05-28 10:45:31
93
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人