2024-11-21
linux源码解析05–ioremap原理
本文介绍了不同处理器架构对内存访问的方式,如x86架构通过I/O端口空间访问外设,而RISC架构如ARM/PowerPC则将I/O内存空间视为普通内存的一部分。文章重点讲解了ioremap映射函数,包括其定义和使用,以及如何通过ioremap_page_range函数将物理地址映射到虚拟地址,使应用程序能够通过虚拟地址访问寄存器地址。
2024-11-21
A64指令集学习
本文档详细介绍了 Armv8-A 指令集架构,特别是 A64 指令集。A64 指令集是固定长度的 32 位指令集,用于 AArch64 执行状态。文档首先概述了指令集的基本格式、分类、助记符和条件码。接着,详细介绍了跳转指令、PC 相对寻址、系统操作指令、异常产生和返回指令、系统存储器指令、数据运算指令和 load/store 指令。最后,文档还介绍了内存屏障指令,包括 DMB、DSB 和 ISB。
2024-11-21
ARMv8内存地址翻译
**摘要**: Armv8-A 使用虚拟内存系统,通过内存管理单元 (MMU) 将虚拟地址转换为物理地址。MMU 使用存储在内存中的转换表进行地址转换,支持多个任务在各自的私有虚拟内存空间中运行。每个程序可以使用相同的虚拟内存地址空间,即使物理内存是碎片化的。MMU 还可以控制每个内存区域的访问权限、内存顺序和缓存策略。内核空间和用户空间的虚拟地址分离,内核使用固定映射,而应用程序使用可变映射。MMU 支持两种地址空间:安全地址空间和非安全地址空间。虚拟化引入了翻译的第二阶段,将虚拟地址转换为中间物理地址,再转换为最终物理地址。转换表配置包括颗粒尺寸、缓存配置、虚拟地址标记等。访问权限通过转换表条目控制,操作系统可以使用访问标志位跟踪页面的使用情况。安全性方面,NS 位和 NSTable 位控制虚拟地址是否转换为安全物理地址或非安全物理地址。翻译旁观缓冲区 (TLB) 缓存最近访问的页面翻译,提高性能。系统 MMU (SMMU) 允许设备看到与内核相同的中间物理地址空间,避免软件中昂贵的捕获需求。内存屏障指令用于确保内存操作的顺序,包括指令同步屏障 (ISB)、数据内存屏障 (DMB) 和数据同步屏障 (DSB)。
2024-11-21
ARMv8‑A 架构和处理器
ARM架构自1985年起不断发展,从早期的ARM内核逐步演进,增加了特性和功能。ARMv8-A架构是最新一代,支持32位和64位执行状态,引入了64位宽寄存器,同时保持与ARMv7软件的向后兼容性。它具备多项增强,如大物理地址、64位虚拟寻址、自动事件信号等,以及硬件加速密码学等功能。ARMv8-A架构的处理器包括Cortex-A53和Cortex-A57,分别针对中档、低功耗和高端计算需求,提供高性能和能源效率。
2024-11-21
armv8的寄存器
AArch64执行状态提供了32个64位通用寄存器,每个寄存器都有32位形式。此外,还有几个特殊寄存器,如零寄存器、栈指针、程序计数器、异常链接寄存器、程序状态保存寄存器等。处理器状态PSTATE包含多个独立访问的字段,如ALU标志、执行状态、异常级别等。系统配置通过系统寄存器进行控制,使用MSR和MRS指令进行访问。字节序控制可以通过SCTLR_ELn寄存器中的EE位进行设置。在AArch64和AArch32之间切换时,AArch64寄存器映射到AArch32寄存器集,并保留状态。NEON和浮点寄存器提供128位浮点寄存器,用于保存浮点操作数和NEON操作的标量操作数和向量操作数。
2024-11-21
为什么需要虚拟内存
本文主要探讨了操作系统中虚拟内存的概念及其重要性。虚拟内存是一种内存管理技术,它为每个进程分配一套独立的虚拟地址空间,而操作系统负责将这些虚拟地址映射到物理内存地址。这样,进程之间的内存地址相互隔离,互不干扰,有效解决了多进程环境下的内存冲突问题。此外,虚拟内存还允许进程的运行内存超过物理内存大小,因为操作系统会将不常使用的内存页面换出到硬盘上,从而释放物理内存空间。虚拟内存的管理方式主要有内存分段和内存分页,两者各有优缺点。分段机制将程序划分为不同的逻辑段,但容易出现外部内存碎片和内存交换效率低的问题;而分页机制将内存空间划分为固定大小的页,解决了外部内存碎片问题,并提高了内存交换效率。为了解决简单分页产生的页表过大的问题,引入了多级页表和TLB技术。最后,本文还介绍了Linux操作系统的内存管理方式,主要采用分页管理,同时涉及分段机制。
2024-11-20
Git入门图文教程
Git 是一款先进的分布式版本控制系统,支持代码版本控制、跨区域多人协作等功能。本文介绍了 Git 的基本概念、安装配置、使用入门、远程仓库、分支、标签管理、撤销变更等,并结合实际工作中的 Git 实践,如 Git flow、stash、cherry-pick 等进行了详细讲解。通过本文的学习,读者可以掌握 Git 的基本操作和高级功能,更好地进行团队协作和代码管理。
2024-11-20
linux源码解析07–缺页异常之架构相关部分(ARM64为例)分析
本文详细介绍了缺页异常的原理和实现过程,涵盖了从异常向量表到通用代码处理的各个环节,并对主要缺页异常类型进行了分类说明。缺页异常是操作系统虚拟内存管理的重要机制,对于进程来说时透明的。文章中还涉及了匿名映射、文件映射、swap 缺页异常、写时复制缺页异常等概念,为理解虚拟内存管理提供了基础。
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 建立虚拟地址