2024-11-20
linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理
围绕内核中的 kmalloc、vmalloc 和用户态 malloc 三种内存分配方式,从实现路径和底层机制进行对比分析。kmalloc 基于 slab 分配器,从各类 slab 缓冲区中按 size 选择合适 cache,通过 kmem_cache_alloc_trace/slab_alloc 分配物理上连续的内存,适合小块、频繁分配的场景。 vmalloc 则在 vmalloc 区域临时申请 vm_struct,计算所需页数后为其分配 struct page* 数组,再通过 alloc_pages_node 逐页(或成组)分配物理页,最后用 vmap_pages_range 建立虚拟地址
2024-11-20
linux内核源码解析04–用户进程页表创建
科学边界发表的文章详细阐述了Linux内核中进程页表的创建、缺页异常处理以及进程切换时的内存管理机制。文章首先介绍了进程创建时页表的创建过程,包括fork时复制父进程的页表、分配pgd物理页面以及拷贝页表项。其次,描述了缺页异常导致的写时复制(COW)的处理流程,包括分配新页面、复制旧页面内容以及更新页表项。最后,文章解释了进程切换时如何通过更新ASID和页表基地址来实现地址空间的切换。这些内容对于理解Linux内存管理至关重要。
2024-11-20
linux内核源码解析03–启动代码分析之主内核页表创建
Linux内核初始化过程中,会依次建立多种页表映射,以支持不同的内存访问需求。这些映射包括恒等映射、粗粒度内核镜像映射、fixmap映射、细粒度内核镜像映射、线性映射以及用户空间页表映射。文章详细解析了细粒度内核镜像映射和线性映射的创建过程,以及内核主页表的建立。此外,还介绍了伙伴系统的初始化,包括bootmem分配器的初始化、sparse内存模型初始化、zone数据结构初始化等。通过这些初始化过程,Linux内核为后续的内存管理和进程调度等操作奠定了基础。
2024-11-20
linux内核源码解析02–启动代码分析之setup_arch详解
文章深入解析了 Linux 内核初始化过程中 fixmap 映射的原理与实现,阐述了为什么在内存管理子系统尚未建立时,必须通过固定虚拟地址访问如 dtb 和 IO 设备等关键资源。通过剖析 early_fixmap_init 函数及相关数据结构,揭示了页表分级、地址计算与内核早期资源访问的详细机制,
2024-11-19
高度自定义工具OneMore开发
OneMore是一款受bsptools启发而诞生的自定义集成工具,采用pyqt6+fluent-widgets开发,具有侧边导航栏和标签页界面。目前已实现登录、设置、导航栏、标签页等基础功能,并集成了MTK和高通等多种工具的可视化操作。项目开源,期待共同开发和完善。
2024-11-18
芯片是如何工作的?
晶体管是电子元器件的核心,其原理基于PN结的单向导通性。硅的掺杂可以形成N型和P型半导体,进而构成PN结。通过外加电压,可以控制PN结的导通与截止,实现电流的控制。这一原理是CPU工作的基础。芯片制造包括晶圆制造、氧化、涂覆光刻胶、光刻、显影、蚀刻、离子注入、剥离光刻胶、金属化和抛光等多个步骤,最后进行测试和封装。CPU的计算基于晶体管构成的逻辑门电路,通过组合这些电路实现复杂的计算任务,例如1+1的运算可以通过或门、与门和异或门电路来实现。
2024-11-13
记一次频繁使用spinlock接口函数导致的无法开机问题
一台设备出现无法开机,表现为卡白米。分析发现,设备在启动过程中,因spinlock频繁获取和释放导致CPU资源被占用,无法完成正常操作。检查发现存在嵌套循环,导致CPU长时间被stick占用,无法挂载misc分区,最终引发重启。频繁使用spinlock可能引起性能开销、CPU资源浪费、死锁、优先级反转等问题。
2024-11-13
aarch64异常模型以及Linux arm64中断处理
您好,我已经阅读了您提供的文章内容,下面是对文章的100字左右摘要总结: 本文详细介绍了ARM架构中异常的概念和处理流程,涵盖了中断、中止、复位等不同类型的异常,并解释了同步与异步中断的区别。文章还深入剖析了异常处理寄存器的作用,以及AArch64异常向量表的配置和中断处理流程,最后以Linux内核中的中断处理机制为例,展示了从中断触发到最终处理函数的调用过程。
2024-11-12
[Android稳定性] 第043篇 [问题篇] Unable to handle kernel NULL pointer dereference at virtual address
在测试版本V816.0.24.8.26.UGUCNXM的稳定版挂测中,出现了大量的空指针引用错误。通过离线解析工具分析dump文件,发现问题的核心在于对NULL指针的引用。具体表现为在`mutex_lock`函数中尝试对一个来自`iocb->ki_filp->private_data`的NULL变量加锁,而这个变量是从`struct file`结构体中获取的。进一步检查发现,这与`/proc/hwinfo`节点有关,当尝试读取这个节点时,会导致手机死机。此节点是早期指纹需求所创建,目前已无实际用途,因此解决方案建议移除该节点。
2024-11-11
高通平台Logfs分区Uefilog乱码乱序问题
在UefiLog日志中,C3F2项目存在乱码和日志不全的问题。初步分析,乱码可能是由于初始化的log buffer过大,导致补0打印出来;同时怀疑数据乱序。通过调整XBL log buffer大小、动态分配XBL log buffer等方法进行验证,但问题依旧。进一步分析发现,SBL log buffer初始化过小可能是原因,调整SBL log buffer大小至6KB后,问题得到解决,日志无乱序现象。