
linux内核设计与实现
文章平均质量分 63
linux内核学习
最后一个bug
我是bug菌,一名嵌入式软硬件技术爱好者,我来csdn了~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux内存管理中匿名页与文件页
在Linux内存管理中,匿名页(Anonymous Pages)和文件页(File-backed Pages)是两类关键的内存页类型,它们的区别主要体现在数据来源、换出机制、回收策略以及使用场景上。通过理解匿名页与文件页的差异,可以更有效地优化系统内存使用,避免性能瓶颈。回收优先级 较低(依赖Swap配置) 较高(优先回收干净页)数据来源 进程动态数据,无文件关联 文件内容缓存或映射。换出目标 Swap分区/文件 无需换出(干净页可丢弃)特性 匿名页 文件页。原创 2025-04-11 00:34:52 · 975 阅读 · 0 评论 -
Linux文件系统中的Page Cache和内存管理中的Page之间的关系
当系统内存不足时,内存管理子系统(如kswapd)会回收Page Cache占用的内存页,释放给其他进程或内核使用。Page Cache是由内存管理中的物理内存页(Page)组成的。Linux文件系统中的Page Cache和内存管理中的Page之间有密切的关联,两者在底层机制上紧密结合,共同实现高效的内存和文件系统管理。文件数据在Page Cache中以内存页的形式组织,通过Radix Tree(或XArray)快速索引文件偏移量与内存页的映射关系。内存页(Page)是物理内存分配和操作的最小单位。原创 2025-04-06 19:03:19 · 572 阅读 · 0 评论 -
形象理解valgrind的memcheck
我们可以把 Memcheck 的检测过程想象成一个“内存检查员”,它会像侦探一样跟踪程序的一举一动,用两个关键工具(Valid-Value 和 Valid-Address)来揪出内存问题。// 试图打开第5个柜子(实际只有3个)→ Memcheck 报错!// 试图读取“空气”→ Memcheck 报错!下次遇到内存问题时,想象这位“内存检查员”在背后默默工作,帮你提前排除地雷 💣!// 申请了柜子,但没放东西(未初始化)原创 2025-04-05 11:58:12 · 101 阅读 · 0 评论 -
教你快速理解linux中的NUMA节点探测是干什么用的?
NUMA节点探测就是Linux开机时自动发现电脑里“哪些CPU和内存是组团工作的”,并做好标记,后续分配任务时尽量让CPU用“本地内存”,提升效率。每个区有自己的超市(内存),居民(CPU)去本区的超市买东西最快,去其他区的超市会慢一些。给每个节点贴上编号(比如Node 0、Node 1),告诉系统:“这是两个独立的小王国,尽量让它们自己管自己的事情”。像“市长”一样,检查电脑里有多少个CPU群(比如2组,每组8核)和对应的内存条,确定哪些CPU和内存离得近。如果用了节点1的内存,速度会下降。原创 2025-04-02 00:11:13 · 339 阅读 · 0 评论 -
linux内核`fixmap`和`memblock`有什么不同?
是两个不同层次的内存管理机制,分别用于不同的场景和阶段。使用阶段 启动早期(伙伴系统初始化前) 启动早期 + 内核运行期间(部分映射)为这些内存或硬件提供虚拟地址映射,使内核能够在页表未完全建立时访问关键资源。主要目的 跟踪和分配物理内存 提供固定虚拟地址映射。依赖关系 不依赖页表 依赖内核页表配置。特性 memblock fixmap。持久性 临时,最终被替代 长期存在。管理对象 物理内存 虚拟地址映射。fixmap的典型使用。负责分配物理内存,而。原创 2025-04-01 23:47:31 · 314 阅读 · 0 评论 -
Linux的异常修复机制__ex_table主要作用
Linux的异常修复机制(尤其是异常表(__ex_table))主要用于处理内核在执行过程中遇到的预期内的可恢复错误,而不是修复内核自身的代码逻辑错误或设计缺陷。它的核心目标是安全地处理用户空间与内核空间交互时可能触发的异常(如访问无效内存地址),防止这些异常直接导致内核崩溃(panic)或系统不稳定。等函数)时,用户空间传递的地址可能是无效的(如空指针、未映射的地址等)。当内核需要访问用户空间提供的内存地址(例如通过。// 内核代码尝试读取用户空间地址。原创 2025-03-30 20:15:08 · 125 阅读 · 0 评论 -
为什么不能直接建立完整的内存映射而是要经过fixmap?
在操作系统启动的早期阶段,直接建立完整的内存映射在技术上不可行或效率极低,而 Fixmap 提供了一种轻量级、静态预定义的映射机制,解决了这一矛盾。此时若尝试构建完整页表,会面临 “鸡生蛋,蛋生鸡” 问题:页表需要内存分配,但内存分配依赖页表。完整页表 动态分配 大 内存管理子系统就绪 正常运行阶段。阶段 1:引导加载程序(Bootloader)(1) 完整页表需要动态内存管理。(3) 无需依赖动态内存。阶段 3:早期初始化(阶段 4:完整内存映射。(2) 极简映射范围。阶段 2:内核入口(原创 2025-03-30 16:54:17 · 49 阅读 · 0 评论 -
嵌入式PCIe gen2接口能用gen3-4的固态ssd吗?
在 NVMe 固态硬盘(SSD)领域,PCIe Gen2 接口的 NVMe SSD 已非常罕见,因为主流市场已过渡到 PCIe Gen3/Gen4/Gen5。PCIe Gen2 x4 的理论带宽为 2 GB/s,实际顺序读写速度通常在 1.5~1.8 GB/s,远低于 Gen3/Gen4 SSD 的标称速度。PCIe 接口在物理上是通用的(M.2 2280 形态),但需主板支持 NVMe 协议。二、PCIe Gen3/Gen4 SSD 在 Gen2 接口下的兼容性。原创 2025-03-29 10:28:28 · 195 阅读 · 0 评论 -
linux两个重要的固态硬盘驱动说明
启用对 NVMe(Non-Volatile Memory Express)协议的固态硬盘的驱动支持。启用对 SCSI 接口存储设备的支持,包括传统 SCSI 硬盘、SAS(串行 SCSI)硬盘,以及某些 U.2 接口的 SSD(例如企业级 NVMe SSD 通过 SCSI 协议封装使用)。这段配置是 Linux 内核编译时的选项设置,用于控制 SCSI 设备和 NVMe 固态硬盘的驱动支持。> SCSI disk support 支持 SCSI 接口的 SSD(如 U.2)原创 2025-03-29 10:20:38 · 87 阅读 · 0 评论 -
linux的固态硬盘驱动问题
在 Linux 内核中,固态硬盘(SSD)的驱动默认是启用的,但具体支持的驱动类型取决于 SSD 的接口协议(如 NVMe、SATA、AHCI)和内核版本。> SCSI disk support 支持 SCSI 接口的 SSD(如 U.2)系列驱动 是(支持主流厂商如 Samsung、Intel)接口类型 内核驱动模块 是否默认启用。是(编译为模块,检测硬件后自动加载)临时禁用 NVMe 驱动(调试时使用)是(默认内置或编译为模块)Q: SSD 未被识别?原创 2025-03-29 10:17:21 · 168 阅读 · 0 评论 -
stm32MP2使用 root=/dev/mmcblk1p8 启动时出现 root device not found 错误
如果问题依旧,需检查硬件连接、内核驱动和分区表。对应的存储设备尚未初始化完毕,导致设备节点未创建。这些标识符不依赖设备节点顺序,更稳定可靠。:内核缺少驱动支持或硬件初始化失败。:分区存在但文件系统无法挂载。可能不是实际存在的分区。替代设备路径,并添加。原创 2025-03-24 17:38:42 · 479 阅读 · 0 评论 -
软链接在编译stm32MP2镜像中的作用
中的设备树文件或 TF-A 配置被修改,软链接会实时指向最新内容,无需手动复制文件到目标目录。如果多个项目共用同一套设备树文件,软链接可以避免重复存储文件,方便统一维护。如果源文件被删除或路径变更,软链接会失效(表现为“断链”),需重新创建。将源目录挂载到目标目录,实现类似软链接的效果,但需要管理员权限。通配符时,软链接会为每个文件单独创建链接(而非链接整个目录)。),通过软链接可以将主机上的开发资源整合到虚拟机的编译环境中。中已有同名文件,软链接会失败(需先删除冲突文件)。原创 2025-03-13 08:45:37 · 427 阅读 · 0 评论 -
形象生动讲解Linux 虚拟化 I/O
Linux 虚拟化 I/O 的本质,就是让虚拟机像直接操作硬件一样快,同时还能共享硬件资源。就像房东既能让租客独立生活,又能高效管理整栋楼的资源。用现实生活的比喻和简单例子来解释 Linux 虚拟化 I/O,就像给朋友讲故事一样。虚拟化 I/O 的作用,就是让每个租客能高效、安全地共享房东的水电系统!c. 硬件直通(SR-IOV/VFIO)—— 土豪专用。a. 全虚拟化(模拟设备)—— 最低效的方式。b. 半虚拟化(VirtIO)—— 高效合作。场景2:快递仓库(网络I/O)场景3:合租厨房(存储I/O)原创 2025-03-02 19:33:38 · 470 阅读 · 0 评论 -
为何linux所有I/O机制都无法避免在操作过程中拷贝文件描述符(fd)?
首先,我要回想一下常见的I/O机制,比如阻塞I/O、非阻塞I/O、I/O多路复用(如select、poll、epoll)、信号驱动I/O,以及异步I/O(如Linux的aio)。可能听说某些I/O模型可以减少数据拷贝,比如零拷贝技术,但这里用户关注的是文件描述符本身的拷贝,而不是数据拷贝。无论是阻塞I/O、非阻塞I/O、I/O多路复用(select/poll/epoll),还是异步I/O(AIO),所有I/O机制在执行过程中都需要通过系统调用将fd传递给内核,而这一过程必然涉及fd的拷贝。原创 2025-03-02 09:55:14 · 924 阅读 · 0 评论 -
ext4文件系统中extent机制
ext4的extent机制与其他特性如日志功能、延迟分配等相互配合,进一步提高了文件系统的性能和可靠性。延迟分配则可以根据文件的实际写入情况,更灵活地分配extent,提高磁盘空间的利用率。ext4中,extent的信息主要存储在inode和extent tree中。extent tree是一种用于组织和管理extent的树形结构,它可以快速定位文件的各个extent。在ext4中,文件的数据可以由一个或多个extent组成,每个extent代表一段连续的磁盘空间,这样可以更高效地管理文件数据的存储。原创 2025-03-01 21:40:59 · 315 阅读 · 0 评论 -
嵌入式Linux内核底层调试技术Kprobes
Kprobes 是 Linux 内核中一种动态插桩(Dynamic Instrumentation)技术,允许在不修改内核源码或重启系统的前提下,动态监控内核函数的执行。总的来说,Kprobes 是 Linux 内核动态追踪的底层基础设施,提供了极高的灵活性,但需要谨慎使用以避免系统崩溃。对于大多数场景,推荐优先使用更高层的工具(如 eBPF 或 ftrace),仅在需要深度定制时直接使用 Kprobes。ftrace 基于函数图的静态插桩,性能开销低,适合生产环境。1.3 关键数据结构。原创 2025-02-23 22:02:07 · 704 阅读 · 0 评论 -
STM32MP2 系列 RIF 资源隔离框架使用教程
RIF就像是STM32MP2系列芯片的“安全卫士”,能把芯片里不同的运行区域隔离开,保护内部内存、外部内存和内部外设不被随意访问。在芯片这个“小世界”里,不同的程序和设备就像不同的“居民”,RIF确保每个“居民”只能在自己的“地盘”活动,不能随便闯入别人的区域捣乱。原创 2025-02-17 11:37:10 · 861 阅读 · 0 评论 -
linux的/proc 和 /sys目录差异
proc 和 /sys 都是Linux系统中用于提供系统信息和进行系统配置的虚拟文件系统,但它们的原理并不完全一样,以下是具体分析:目的与功能实现原理数据更新机制。原创 2025-01-30 22:35:31 · 584 阅读 · 0 评论 -
设备节点open,write,read与sys文件show与store操作
在实际的Linux驱动开发中,通常会根据具体的设备功能和应用需求,同时使用这两种方式。例如,通过设备节点进行数据的高速传输,通过sysfs文件进行设备的参数配置和状态查询。基于设备节点的 open 、 write 、 read。基于sysfs文件的 store 和 show。原创 2025-01-30 17:26:17 · 338 阅读 · 0 评论 -
sys中目录和文件的建立以及与驱动的交互
此外,sys目录下的内容与内核中的设备模型等紧密相关。随着设备的插拔、驱动的加载卸载等操作,sys目录下的目录和文件会动态地创建、更新或消失。例如,当系统检测到新设备插入时,会在内核中创建对应的设备对象,并在sys目录的相关位置(如 /sys/devices 等)创建相应的目录和文件来展示设备信息;加载驱动模块时,也可能会在sys中创建特定的目录和文件以提供驱动相关信息。sys目录是利用Linux的sysfs特殊文件系统创建的,用于在用户态展示设备信息等内核数据。具体目录和文件的创建。原创 2025-01-30 17:24:34 · 468 阅读 · 0 评论 -
kobject、kset和ktype的关系
kobject是基础,kset用于组织相关的kobject形成层次结构,ktype则描述kobject的类型属性。kset本身也内嵌了一个kobject,通过这个内嵌的kobject,kset可以与其他kset或kobject建立层次关系,从而构建出sysfs文件系统的层级结构。总之, kobject 、 kset 和 ktype 通过结构体中的指针和成员变量相互协作,共同构建了Linux设备模型的基本框架,用于管理内核对象以及在sysfs中展示设备模型的层次结构和属性信息。kobject结构体。原创 2025-01-30 17:03:52 · 815 阅读 · 0 评论 -
Linux 6.x版本内核的proc目录组织
在/proc目录下,每个正在运行的进程都有一个以其PID命名的子目录。系统范围的文件和目录。原创 2025-01-30 09:24:01 · 338 阅读 · 0 评论 -
解读Linux 6.x版本内核的sys目录作用
Linux 6.x版本内核的sys目录是一个虚拟文件系统,用于提供对内核数据结构的访问接口,其组织架构如下:原创 2025-01-30 00:29:19 · 281 阅读 · 0 评论 -
页高速缓存与缓冲区缓存的应用差异
在现代操作系统中,页高速缓存和缓冲区缓存通常协同工作,共同提高系统的I/O性能和数据访问效率。页高速缓存的应用场景。缓冲区缓存的应用场景。原创 2025-01-25 21:36:45 · 1082 阅读 · 0 评论 -
详解磁盘IO调度算法与页高速缓存的搭配
总之,磁盘I/O调度算法和页高速缓存是相辅相成的关系,前者主要针对磁盘I/O操作的调度优化,后者主要解决内存与磁盘之间的数据缓存和访问优化问题,共同提升系统整体性能。原创 2025-01-25 18:18:09 · 260 阅读 · 0 评论 -
Linux中page、buffer_head、bio的关系
page与buffer_head。buffer_head与bio。原创 2025-01-24 22:37:30 · 434 阅读 · 0 评论 -
linux文件系统与面向记录文件系统差别
面向记录的文件系统与Linux文件系统存在多方面的差异,具体如下:数据组织形式访问方式存储管理应用场景可扩展性和灵活性。原创 2025-01-24 15:32:32 · 265 阅读 · 0 评论 -
详细介绍下linux内核的高端地址
32位系统的地址空间是4GB。其中,内核空间通常占据1GB,用户空间占3GB。但物理内存可能超过1GB,为了让内核能够访问超出1GB的物理内存,引入高端地址。在32位系统中,内核空间通常占据1GB,用户空间占3GB,这主要是基于历史原因、内存管理需求和系统安全性考虑。高端地址在现代Linux内核内存管理中扮演着重要角色,尤其在32位系统中,是内核访问大容量物理内存的关键机制。那那什么又是linux内核高端地址呢?原创 2025-01-19 22:20:53 · 569 阅读 · 0 评论 -
处理处理器的重排问题
总之,虽然重排是一个需要关注的问题,但通过合理的编程方法和工具的使用,可以在保证代码正确性的同时,减少对重排问题的过度担忧和繁琐处理。遵循良好的编程实践和规范。性能优化阶段再考虑细节。利用高级语言特性和库。原创 2025-01-13 23:57:26 · 218 阅读 · 0 评论 -
linux的大内核锁与顺序锁
顺序锁包含一个顺序计数器和一个锁。但随着内核的发展和多核处理器的普及,大内核锁的粒度较粗,会导致严重的性能瓶颈,因为它会限制多个处理器同时访问内核资源。只有获取了锁的进程才能执行临界区的代码,完成对内核资源的访问,访问结束后释放锁,以便其他进程可以获取锁并访问相应资源。在一些特定的情况下,如内核初始化阶段,或者对一些全局的、不适合使用更细粒度锁的资源进行访问时,仍然会使用大内核锁。适合于写操作相对较少、读操作频繁的场景,如内核中的一些数据结构,像网络设备的统计信息等,频繁被读取但偶尔才会被更新。原创 2025-01-13 22:24:11 · 595 阅读 · 0 评论 -
Linux 中断下半部,软中断、tasklet 和工作队列
中断下半部概述:中断处理程序分上下两部分,上半部在关闭中断下执行时间敏感、与硬件相关且不能被打断的工作;下半部在开启中断下执行,可被打断,包括软中断、tasklet 和工作队列三种,用于处理相对耗时任务,避免中断嵌套导致请求丢失。软中断(softirq)基本原理:是中断处理程序开启中断时执行部分,可被硬中断抢占。内核有软中断向量表,每种软中断对应一个 softirq_action 实例,其 action 成员为处理函数。种类与优先级:内核定义 10 种软中断,如 HI_SOFTIRQ原创 2025-01-11 17:02:35 · 380 阅读 · 0 评论 -
linux中断下半部分中早期的BH处理与软中断处理的区别
Linux中断下半部分中早期的BH处理与软中断处理有以下区别:执行方式资源管理可扩展性适用场景。原创 2025-01-11 12:42:01 · 219 阅读 · 0 评论 -
linux内核默认不支持中断嵌套
快速中断处理程序运行时会屏蔽所有其他中断,而普通中断在处理时可以允许特定类型的中断嵌套。例如,一些系统将时钟中断等关键中断配置为可以在普通中断处理期间嵌套进来,以确保系统时钟的准确性。:当Linux内核进入一个中断服务函数时,会自动屏蔽当前CPU上的中断,使得其他中断无法打断正在执行的中断服务函数。:通过配置内核编译选项,可以使能中断嵌套。例如,在编译内核时,启用“CONFIG_PREEMPT_RT”选项,该选项旨在打造一个更具实时性的内核,允许高优先级的中断打断低优先级的中断处理程序,从而实现中断嵌套。原创 2025-01-06 22:22:09 · 639 阅读 · 0 评论 -
OS的随机数生成过程中的内核熵池
内核熵池(Kernel Entropy Pool)是操作系统内核中用于收集和管理熵(随机性来源)的机制 ,在操作系统的随机数生成过程中发挥关键作用。内核熵池收集和管理熵的过程涉及多个环节。原创 2025-01-06 22:09:21 · 1155 阅读 · 0 评论 -
为什么linux内核在设置进程状态时需要设置内存屏障
保证内存操作顺序性在多处理器系统中,不同处理器可能同时对进程状态等共享内存进行操作。内存屏障可以确保在设置进程状态的操作前后,内存访问的顺序按照程序预期进行。例如,当内核设置进程状态为“就绪”,这个操作可能涉及到多个内存位置的写入(如进程控制块中的状态位、调度队列相关指针等),内存屏障能够保证这些写入操作不会被处理器以无序的方式执行。确保其他处理器看到最新状态处理器有自己的缓存,没有内存屏障时,一个处理器对进程状态的修改可能只在自己的缓存中完成,而其他处理器无法立即看到这个最新状态。内存原创 2025-01-04 15:59:15 · 231 阅读 · 0 评论