Linux
文章平均质量分 75
papaofdoudou
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
内核与用户态虚拟地址-物理地址翻译方法指南
摘要 本文探讨内核与用户态虚拟地址翻译的差异(§1-§11内核部分,§12-§20用户部分)。内核地址通过init_mm页表使用__pa/slow_virt_to_phys转换,而用户地址需通过进程mm使用GUP机制。重点分析x86_64内核地址的六大区段(direct-map、kernel-image、vmalloc等),每类地址需采用专用转换函数(如__pa_symbol、vmalloc_to_pfn)。特别说明slow_virt_to_phys作为通用方案可遍历init_mm页表转换所有内核地址(§4原创 2026-08-13 13:39:52 · 209 阅读 · 0 评论 -
Rust for Linux 内核开发指南
抽象层先行原则明文,叶子代码不许直接,必须等子系统提供 safe 抽象。所以 Rust 能写哪儿,取决于长到哪儿——这是个自下而上、逐子系统的过程,不是"Rust 一上来就能写一切"。核心代码不适合安全封装:调度器/MM/RCU 的正确性靠 C 指针运算、READ_ONCEWRITE_ONCE、隐式内存序、复用等"不安全"技巧维持;强行包成 Rust safe API 要么不可能 sound,要么性能/可读性倒退。Rust 的安全收益集中在新叶子代码的"类型/所有权/空指针/双重释放"类 UB。原创 2026-07-25 15:21:52 · 423 阅读 · 0 评论 -
基于 ptrace 的进程克隆工具
这篇文章介绍了一个基于ptrace系统调用的Linux进程克隆工具proc_copy。该工具能够将一个进程的完整状态(包括寄存器、内存映射、执行上下文等)复制到多个目标进程,实现类似"分身术"的效果。文章生动地将其比作"种老公"的童话,并详细解析了实现原理:通过捕获源进程状态、重建目标进程地址空间、注入远程系统调用等技术,将目标进程完全转化为源进程的克隆体。这种技术可应用于调试、进程热备份、负载均衡等多种场景。文章提供了完整的C语言实现代码,展示了如何通过ptrace原创 2026-06-20 10:52:32 · 237 阅读 · 0 评论 -
从傅里叶变换角度看世界:周期、宇宙,操作系统与 while(1)
《一支画笔,两种世界》通过黑胶唱片的比喻,生动阐释了傅里叶变换的核心思想。文章将数学概念转化为直观的物理实验:当画笔振动频率与唱片转速匹配时,墨迹重心偏移揭示隐藏频率。这一原理不仅适用于声音分析,更延伸到宇宙运行和计算机系统的周期性本质。作者指出,看似混乱的世界实则是多重周期运动的叠加,而傅里叶变换正是解码这种"隐藏秩序"的钥匙。从原子振动到星系运转,从程序循环到宇宙脉动,周期律以不同尺度贯穿始终,改变着我们认知世界的方式。原创 2026-05-10 12:15:55 · 429 阅读 · 0 评论 -
SRCU-LINUX内核中的可睡眠RCU
摘要:SRCU是RCU的增强版本,允许在读侧临界区中睡眠。经典RCU为防止内存耗尽严格禁止睡眠,因其宽限期机制依赖所有读者及时退出。SRCU的诞生源于2006年内核开发中的实际需求,通过创新设计解决了传统RCU的限制,在Linux 2.6.10版本被引入内核。这种演进体现了从性能优先到兼顾功能性的转变,展示了同步原语如何应对复杂场景的挑战。原创 2026-04-18 22:00:01 · 644 阅读 · 0 评论 -
AMD-V 嵌套分页白皮书翻译
摘要 本文探讨了x86虚拟化环境中的分页性能优化问题。传统软件虚拟化技术(如影子分页)通过维护客户机页表的影子副本来实现地址转换,但会产生显著的性能开销(可达总虚拟化开销的75%)。AMD提出的硬件辅助解决方案"嵌套分页"(NPT)通过在处理器层面直接支持二级地址转换,有效降低了虚拟化开销。该技术利用专门的页表遍历器和TLB缓存机制,显著减少了内存访问次数和虚拟机监控器介入频率,同时降低了内存消耗。测试表明,嵌套分页可使虚拟化性能接近原生系统水平,特别是在处理大内存工作负载时优势明显。这原创 2026-04-16 21:08:16 · 475 阅读 · 0 评论 -
CPU多任务实现之匙-深入页表基址寄存器
摘要:CR3寄存器是x86架构中管理虚拟内存的关键组件,它存储着当前进程页表的物理基地址,使每个程序都能拥有独立的虚拟地址空间。CPU通过CR3进行四级页表遍历,将虚拟地址转换为物理地址。操作系统利用CR3实现进程隔离,在上下文切换时更新CR3值即可切换内存视图。TLB缓存加速地址转换,但进程切换时必须刷新TLB以确保安全。这个精巧的内存管理机制是现代多任务操作系统的基础。原创 2026-04-14 22:15:23 · 351 阅读 · 0 评论 -
Linux内核的魔法-RCU解密
本文介绍了Linux内核中的RCU(Read-Copy-Update)同步技术。RCU通过"读-复制-更新"三步实现对共享数据的安全修改:读取原数据,复制并修改副本,最后原子性地切换指针指向新数据。其核心创新在于延迟销毁机制,将更新分解为移除和回收两个阶段。RCU通过"宽限期"和"静止状态"概念解决关键难题:如何确定何时可以安全回收旧数据。宽限期会等待所有CPU都进入静止状态(如上下文切换、空闲等),确保所有可能访问旧数据的读者都已退出,此时才安全原创 2026-04-13 21:43:59 · 513 阅读 · 0 评论 -
Linux内核的边界在哪里?
本文深入探讨了Linux系统中用户进程的起源与内核/用户空间的界限问题。文章指出Linux内核在启动完成后会创建第一个用户进程(PID为1的init进程),该进程作为所有用户进程的始祖,通过进程树繁衍出整个用户空间。内核与用户空间的关键区别在于:内核运行在特权模式直接管理硬件,而用户程序运行在受限模式通过系统调用请求内核服务。文章强调Linux发行版的独特性源于用户空间程序的不同配置,而非内核本身,揭示了"Linux是内核而非完整操作系统"这一说法的实质内涵。原创 2026-03-25 21:15:59 · 731 阅读 · 0 评论 -
Intel vGPU技术GVT-g与kvmgt实现分析和实践
本文介绍了Intel GVT-g图形虚拟化技术及其KVMGT实现,重点演示了在不启用IOMMU情况下通过MPT技术实现核显共享。实验在支持GVT-g的Intel Graphics 620平台上进行,通过配置内核参数、加载kvmgt模块并创建vGPU设备,成功让虚拟机和物理机同时使用核显。研究发现,MPT技术通过MDEV中介层实现虚拟GPU访问,不需要IOMMU支持,但开启IOMMU能提供更好的安全性。文章详细记录了环境搭建过程,并分析了MPT与设备直通(PT)的关键区别,为GPU虚拟化实践提供了参考。原创 2026-03-16 21:13:05 · 579 阅读 · 0 评论 -
QEMU和KVMTOOL在GPA(IOVA)和HVA映射方面的异同
本文分析了QEMU虚拟化环境中GPA与HVA的映射关系。与KVMTOOL中简单的线性映射不同,QEMU中存在多个线性偏移因子,不同GPA区域可映射到不同的HVA区域。通过VFIO透传日志分析发现,4G HVA被分成两个2G部分分别映射,且前2G和后2G使用不同的偏移计算公式。研究指出,这种分段映射导致不同内存区域的偏移量可能不同,虽然线性映射是自然实现方式,但QEMU/KVM实际通过计算不同内存槽的偏移来完成地址转换。该分析揭示了虚拟化环境下地址映射的复杂性。原创 2026-03-15 19:54:45 · 279 阅读 · 0 评论 -
Linux内核任务调度时机总结
直接调用schedule():主动让出CPU设置TIF_NEED_RESCHED标志:延迟调度,在合适的时机检查该标志并调用schedule()核心调度函数(位于/**/调度类型触发机制调用路径配置依赖主动调度schedule()直接调用阻塞、等待、yield无条件调度内核长循环中非抢占内核用户抢占返回用户空间无内核抢占中断返回抢占中断返回内核态时钟中断调度无唤醒调度无优先级变更无返回用户空间时: 系统调用返回、异常返回、中断返回用户态preempt_enable()时。原创 2026-02-22 15:31:32 · 712 阅读 · 0 评论 -
映射与人生
文章摘要:本文通过计算机系统架构类比人类认知过程,提出"人生进程"概念,认为外部事物需通过"映射"机制进入个人体验才具有意义。核心同构包括:用户地址空间对应个人生活领域,内核空间象征潜意识基础,内存映射类比知识吸收,页表如同记忆系统,共享内存反映共同经验。文章强调主动选择认知映射、维护心理边界(内存保护)、整合碎片化经验(碎片整理)的重要性,指出元认知能力如同系统内核,其稳定性决定人生质量。最终揭示我们既是体验接收者,也是自身认知架构的主动设计者。原创 2025-11-13 07:55:38 · 736 阅读 · 0 评论 -
BSP和Driver的区别
BSP( Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。在OS上的driver一般都是可动态加载的,当然嵌入OS里头直接编进去也就行了,对于一个最小的可运行OS核心来说,BSP是必不可少的,但driver不是。2)Driver,也就是我们常说的驱动,它和你的子设备是密切相关的,相同设备在相同软件平台下驱动基本是可以通用的,和板子的关系不是很大的。原创 2020-11-02 11:57:16 · 10614 阅读 · 0 评论 -
RXE RDMA测试学习环境搭建
RXE的RDMA实现很早就开源在内核主线,想要深入理解RDMA工作原理结合测试用例分析内核代码实现。原创 2024-09-29 23:27:34 · 1408 阅读 · 0 评论 -
Corundum FPGA 网卡项目驱动分析
其实普通网卡也是由N个SQ,N个RQ组成,散列管理,但是RDMA网卡作了进一步抽象,提取一个SQ,一个RQ,包装成QP,这样就有N个QP了,从这N个QP中拿出一个或者多个QP出来,负责以太网包的处理,就是利用RDMA机制实现普通网卡功能的RDMA网卡。原创 2024-09-25 08:47:29 · 2573 阅读 · 0 评论 -
基于MDEV的PCI设备虚拟化DEMO实现
mdev受控直通体现了架构设计中的控制平面和数据平面分离的思想,平面可以理解为动作发生的地方,也就是让控制信号和数据流动发生在不同的地方,通过mdev设备虚拟化,让访问配置空间,MMIO寄存器这种低带宽配置面操作走trap-and-emulation路径,这是控制路径,而让设备存储访问(比如网络内存,GPU数据存储)以IOMMU DMA MAP的方式直通进行,控制和数据两个方向正交,彼此可以独立变化互不影响,同时兼顾了划分灵活性和访问性能。原创 2024-06-29 19:06:48 · 1038 阅读 · 0 评论 -
llama3-70B几个问题答疑
问题几个关于宇宙的问题,答案挺有意思的,很有启发性,记录一下:问题1:既然相对论认为时间是相对的,为何却说宇宙寿命有137亿年?问题2:对于黑洞来说,大爆炸是不是刚刚发生不久的事情?问题3:对于光来说,大爆炸是刚刚发生的事情么?普通PC的USB控制器都是通过PCIE扩展的么?为什么服务器系统广泛通过PCIe接口扩展功能,而非使用内部总线?原创 2024-06-16 10:09:21 · 663 阅读 · 0 评论 -
linux系统几种固定的睡眠(休眠,调度,同步)模式
既然有休眠流程有固定的模式,就可以通过宏定义将这些模式定义出来,通过一个宏接口调用去实现,内和中已经将这些固定的休眠模式定义为wait_event_xxx宏家族,调用这些宏,可以一步到位,实现上述的宏逻辑:注意到condition条件检查被放在了设置任务state状态和进行实际休眠CMD中间,这是一种通用模式,和BARRIER的使用有关,在自己书写休眠过程时必须遵守。原创 2022-10-08 22:38:47 · 943 阅读 · 0 评论 -
LINUX系统CFS调度模型实现思考和仿真
采用绝对优先级没有记忆性,过去的运行记录不会影响当前时刻的调度决策,所以高优先级的线程有绝对优先权。而CFS调度器是有记忆性的,过去的运行记录会体现在线程整体的运行进度中,从而影响当前的调度决策。原创 2024-04-05 00:26:38 · 1483 阅读 · 0 评论 -
LINUX系统如何从多核CPU中隔离核心处理专用用户任务?
需要说明的是,上述隔离cpu的方法仅仅对用户空间的进程有效,对内核的进程无效,所以即便用户态不创建绑定隔离CPU的dedicate 进程,被隔离的cpu也并不是完全空闲的,它可能会执行内核态的一些人物,当前CPU节点上的文件交换操作。原创 2024-03-14 08:28:14 · 1841 阅读 · 0 评论 -
Linux用户态进程可以在持有内核锁的情况下返回用户态么?
检测写一个测试模块,在内核中定义一把互斥锁并获取,然后返回到用户态,观察内核是否报告异常,代码逻辑如下:测试发现,内核并没有报任何的WARNING,似乎说明用户态线程是可以在持有内核锁的情况下返回用户态的,先别急着下结论,我们打开内核的LOCKDEP功能重新编译内核在跑一下看看。原创 2024-03-12 21:59:11 · 238 阅读 · 0 评论 -
mprotect/mlock使用demos
mlock起作用的过程分为两步,第一步,对于已经存在的VMA,将会调用mm_populate将其手动建立物理页面的映射。而对于未来分配的物理页面,则将会调用apply_mlockall_flags设置VM_LOCKED标志,设置此标志后,将来的MMAP函数将会调用__mm_populate分配页面。这样,在加入LRU的逻辑中,判断PageMlocked为真,将会把页面加入LRU_UNEVICTABLE list.所以,最终MLOCKD的效果显示在/proc/meminfo的unenvicible字段。原创 2021-10-14 12:37:29 · 507 阅读 · 0 评论 -
理解PCIE设备透传
1.透传场景下,设备内存映射给VCPU,不会通过DMAR映射给设备自身,设备内存本身就在设备上,设备可以直接访问(通过设备内部的IOMMU),不需要映射给DMAR。资源内存映射给DMAR的情况一般是三方外设通过自身IOMMU DOMAIN(自身设备绑定)访问其他设备上的存储资源。2.透传的设备访问主存仅仅需要一次映射,由DMAR完成IOVA到HPA的翻译。原创 2024-01-19 23:33:40 · 1945 阅读 · 0 评论 -
KVM虚拟机迁移原理与实践
热迁移环境需要满足的几个必要条件:1.热迁移之前,虚拟机安装文件必须要在源主机和目标主机都可以访问的位置上,并且具有相同的访问路径。实现方式可以是通过独立的NFS共享服务,或者是离线拷贝虚拟机镜像文件到目标主机相同的路径下。2.源主机和目标主机必须可以互相访问(SSH,TCP等协议)。3.迁移过程中经常会出现迁移进度条回滚的现象,这可能就是由迁移算法和逻辑决定的,回滚的目的是迁移上把进度条迁移过程中产生的脏页。原创 2023-11-11 23:48:31 · 2277 阅读 · 0 评论 -
CCM(TCM,QMEM,SPM)与Cache的异同
CCM是Closely coupled memories的缩写,中文名称是紧耦合存储器,哈佛架构下,一般有两种CCM,分别是ICCM和DCCM, ICCM主要用来存储指令和数据,DCCM仅用来存储数据。一般中低端MCU没有提供多级Cache,兼之指令和数据规模较小,会配备CCM存储器,多用于高可靠,高世实时场合。而高性能AP级处理器一般提供了多级CACHE减少存储访问的Latency,不采用CCM的方式。原创 2023-12-24 19:55:34 · 3912 阅读 · 0 评论 -
计算机体系结构的一些总结
广义上来说,按照不同层次的授权等级,可把芯片IP分类为指令集、IP核、芯片架构等。如果说指令集是一本“字典”,那么IP核提供了“段落”的写作方式,芯片架构则可被视作是“整篇文章的提纲”。芯片IP企业作为芯片设计企业的上游供应商,通常以授权的方式,向后者收取专利费用。而芯片设计企业通过购买不同层级的IP授权,可以设计出不同自研程度的芯片产品。原创 2021-02-05 14:02:53 · 1732 阅读 · 0 评论 -
关于操作系统设计的基本原理和设计原则
操作系统设计的精妙之处就在于,在底层硬件之上创造了新的抽象, 对于系统初始化来说, 它呈现了执行流到线程转化这一概念,该概念远远比它的实现细节更加重要,处理器以“取指-执行”为周期开始串行执行指令,而初始化代码将自身转化为一个并发处理系统, 这里的关键之处在于,初始化代码并不是创建一个独立的并发系统,然后跳转到新的系统。原创 2020-03-09 16:17:33 · 8342 阅读 · 1 评论 -
文件共享传输的几种方式
Linux系统下可以通过open/create/socket/socketpair/pipe等系统调用创建文件描述符fds.之后可以基于创建的文件描述符进行IO操作,操作完毕之后执行close(fd)关闭文件描述符。原创 2023-12-05 14:57:32 · 1210 阅读 · 0 评论 -
Linux内核对象引用计数和生命周期管理
int value;int pad;if(!data)2.如果对对象的引用不是临时的(pointer is not temporary),特别是对象会以指针引用的形式传递到异步上下文(另一个被处理器调度的独立线程),必须在传递这个指针引用之前,增加对对象的引用计数。调用kref_get增加引用计数前,如果上下文已经持有了一个引用计数,则kref_get过程不需要锁保护。原创 2023-11-20 22:29:59 · 1328 阅读 · 0 评论 -
X86 SMAP(Supervisor Mode Access Prevention)机制引入的内核态访问用户态地址空间的问题分析
本文分析了Linux内核访问用户态地址空间时可能遇到的问题及解决方案。在x86架构下,由于SMAP/SMEP保护机制的存在,内核直接访问用户态地址会触发权限违例异常。内核通过copy_from_user等宏指令配合STAC/CLAC指令临时关闭SMAP保护,或通过修复表机制处理缺页异常。文章详细探讨了异常处理流程,包括修复表的作用和实现方式,以及内核如何区分用户态和内核态的非法地址访问。测试结果表明,开启SMAP时需要调用专用API访问用户空间,而关闭SMAP后可直接访问。文章还比较了不同架构下的实现差异,原创 2023-10-28 20:15:21 · 1411 阅读 · 0 评论 -
OpenGL Mesa库在ubuntu22.04上的编译
安装后,不需要重新启动系统,glxinfo|grep OpenGL将会发现系统的MESA驱动已经被更换。重启后使用的仍然是新编译的MESA驱动。原创 2023-09-19 23:04:47 · 1267 阅读 · 0 评论 -
非对称加密系统和LINUX实践
更具体地说,如果一个非对称加密算法被正确设计并且密钥的长度足够长,那么在有限的时间内,从公钥计算出相应的私钥几乎是不可能的,除非有量子计算机等未来的技术出现,可以破解这些数学问题。这意味着在加密和解密之间使用相同的密钥,这个密钥必须保密共享,只有密钥的持有者才能解密数据。总之,非对称加密提供了一种强大的安全机制,可以实现数据的保密性、完整性和身份验证,而不需要在通信方之间共享相同的密钥。这用于确保数据的完整性和真实性。因此,非对称加密系统的安全性依赖于多个因素,包括算法的安全性、密钥的管理和物理安全性等。原创 2023-09-10 20:30:55 · 574 阅读 · 1 评论 -
Linux监测进程打开文件
分析问题过程中,追踪进程打开的文件可以在许多不同情况下有用,体现在以下几个方面:故障排除和调试: 当程序出现问题、崩溃或异常行为时,追踪进程打开的文件可以帮助找出问题的根本原因。这有助于快速定位错误,尤其是在访问文件时发生的错误。性能分析和优化: 了解进程打开了哪些文件可以帮助分析程序的性能问题。如果程序频繁打开和关闭文件,可能会导致性能下降。通过追踪文件操作,可以识别性能瓶颈,从而采取相应的优化措施。权限和安全审计: 在安全方面,追踪进程打开的文件可以帮助监控和审计系统上的文件访问。原创 2023-08-31 22:55:27 · 958 阅读 · 0 评论 -
搭建Synopsys 数字IC IDE开发化境
6)这先点击 自定义硬件,内存我修改为4GB,处理器数量为2,核心为2。然后记得添加centos镜像,设置好点击关闭,回到上个页面,点击完成。5)磁盘空间我设置为50G,空间没有具体的要求,最好多留一些,方便后面安装更多的软件;4)我这里虚拟机取名为zlcao-eda,将安装路径修改到D盘,这里空间大,下一步;之后使用VMTOOLS完善系统,点击安装TOOLS,前面图中有显示,桌面刷出虚拟盘;8)我这里选择中文,默认选择英文也可以,看个人吧,然后点击继续;1)点击 创建新的虚拟机,默认勾选典型,下一步;原创 2023-08-12 23:56:48 · 1058 阅读 · 0 评论 -
基于原子操作的无睡眠锁实现
原子操作是全芯片系统级工程,原子操作的路径可能需要经过多个IP环节,每个环节都需要支持原子操作的硬件基础设施,缺失任何一个环节将无法做到原子操作。比如,GPU设备如果需要原子访问HOST Memory,中间会经过GPU本身的L2->AXI总线->NOC->PCIe->Host Memory等环节,中间每个环节都需要支持原子操作,如果某个环节不支持,比如PCIE不支持发送原子访问包,则无法用HOST 内存实现原子操作。原创 2022-10-03 11:50:23 · 758 阅读 · 0 评论 -
dma-fence简析以及使用demo
dma fence是Linux中用于不同内核模块DMA同步操作的原语,常用于GPU Rending,display buffer等之间的同步,使用DMA FENCE可以减少在用户态的等待,让数据的同步在内核中进行,它是内核中一种比较常用的同步机制,本身的实现和使用并不复杂,其只有两种状态signaled和unsignaled。可能正是因为其本身的精简,在融入其他概念中时,在不同的环境下,赋予了dma-fence不同的含义。所以通常需要根据dma-fence的具体使用的情况来理解其含义。原创 2023-06-13 22:39:19 · 3457 阅读 · 2 评论 -
关于处理器静态&动态内存屏障的原理和应用
barrier();r1 = y;barrier();r2 = x;编译为汇编指令.textrun1:.LFB0:ret.LFE0:run2:.LFB1:ret.LFE1:同样是movl指令,却代表这读和写两个意思,这一点和RISC处理器定义不太一样,无论是ARM,MIPS还是RISCV,读和写分别是两条不同的指令,ARM是ldr/str,MIPS是ld/sw,RISCV则和MIPS是同样的定义。原创 2022-11-01 23:18:10 · 826 阅读 · 2 评论 -
dhrystone和coremark测试比较
关于dhrystone测试,请参考博客比较coremark环境搭建。原创 2022-10-01 20:58:57 · 2555 阅读 · 1 评论 -
一种细粒度资源锁的内核模块实现
本实现参考内核模块中的lock_page/unlock_page以及wait_bit实现,以LOCK PAGE为例,struct page数据结构中的成员flags定义了一个标志位PG_locked,内核通常利用PG_locked来设置一个页锁,lock_page函数用于申请页锁,如果页锁被其他进程占用了,那么进程会睡眠等待。原创 2023-07-02 18:57:55 · 423 阅读 · 0 评论
分享