 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    armv8的寄存器
AArch64执行状态提供了32个64位通用寄存器,每个寄存器都有32位形式。此外,还有几个特殊寄存器,如零寄存器、栈指针、程序计数器、异常链接寄存器、程序状态保存寄存器等。处理器状态PSTATE包含多个独立访问的字段,如ALU标志、执行状态、异常级别等。系统配置通过系统寄存器进行控制,使用MSR和MRS指令进行访问。字节序控制可以通过SCTLR_ELn寄存器中的EE位进行设置。在AArch64和AArch32之间切换时,AArch64寄存器映射到AArch32寄存器集,并保留状态。NEON和浮点寄存器提供128位浮点寄存器,用于保存浮点操作数和NEON操作的标量操作数和向量操作数。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    为什么需要虚拟内存
本文主要探讨了操作系统中虚拟内存的概念及其重要性。虚拟内存是一种内存管理技术,它为每个进程分配一套独立的虚拟地址空间,而操作系统负责将这些虚拟地址映射到物理内存地址。这样,进程之间的内存地址相互隔离,互不干扰,有效解决了多进程环境下的内存冲突问题。此外,虚拟内存还允许进程的运行内存超过物理内存大小,因为操作系统会将不常使用的内存页面换出到硬盘上,从而释放物理内存空间。虚拟内存的管理方式主要有内存分段和内存分页,两者各有优缺点。分段机制将程序划分为不同的逻辑段,但容易出现外部内存碎片和内存交换效率低的问题;而分页机制将内存空间划分为固定大小的页,解决了外部内存碎片问题,并提高了内存交换效率。为了解决简单分页产生的页表过大的问题,引入了多级页表和TLB技术。最后,本文还介绍了Linux操作系统的内存管理方式,主要采用分页管理,同时涉及分段机制。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    Git入门图文教程
Git 是一款先进的分布式版本控制系统,支持代码版本控制、跨区域多人协作等功能。本文介绍了 Git 的基本概念、安装配置、使用入门、远程仓库、分支、标签管理、撤销变更等,并结合实际工作中的 Git 实践,如 Git flow、stash、cherry-pick 等进行了详细讲解。通过本文的学习,读者可以掌握 Git 的基本操作和高级功能,更好地进行团队协作和代码管理。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux源码解析07–缺页异常之架构相关部分(ARM64为例)分析
本文详细介绍了缺页异常的原理和实现过程,涵盖了从异常向量表到通用代码处理的各个环节,并对主要缺页异常类型进行了分类说明。缺页异常是操作系统虚拟内存管理的重要机制,对于进程来说时透明的。文章中还涉及了匿名映射、文件映射、swap 缺页异常、写时复制缺页异常等概念,为理解虚拟内存管理提供了基础。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux源码解析06–常用内存分配函数kmalloc、vmalloc、malloc和mmap实现原理
您好!这是一份关于内存分配函数的总结,涵盖了 kmalloc、vmalloc、malloc 和 mmap 函数。 **1. kmalloc 函数** - 基于 slab 分配器实现,分配的内存物理上连续。 - 分配流程: - 检查大小是否超过 KMALLOC_MAX_CACHE_SIZE,若超过,调用 kmalloc_large。 - 计算使用的 slab 缓冲区索引。 - 调用 kmem_cache_alloc_trace 从 slab 分配内存。 **2. vmalloc 函数** - 临时在 vmalloc 内存区申请 vma,并分配物理页面,建立映射。 - 适合分配较大内存,物理内存不一定连续。 **3. malloc 函数** - C 库实现,维护缓存,内存不足时通过系统调用 brk 向内核申请。 - 分配流程: - 从 C 库缓存分配或通过 brk 系统调用向内核申请。 - 若设置 VM_LOCKED 标志,立即分配物理页面并建立映射;否则,延迟分配。 - 访问未映射的虚拟空间时触发缺页异常,分配物理页面并建立映射。 **4. mmap 函数** - 用于用户程序分配内存、读写大文件、链接动态库、多进程内存共享等。 - 映射类型: - 私有匿名映射:fd=-1, flags=MAP_ANONYMOUS|MAP_PRIVATE - 共享匿名映射:fd=-1, flags=MAP_ANONYMOUS|MAP_SHARED - 私有文件映射:flags=MAP_PRIVATE - 共享文件映射:flags=MAP_SHARED - 分配流程: - 创建 vma 结构体。 - 根据文件关联性和映射区域属性,调用相应的映射函数。 - 建立虚拟地址到物理地址的映射。 - 默认情况下,mmap 只建立 vma,未分配物理页面,访问时触发缺页异常。 **总结** - kmalloc 和 vmalloc 适合分配内存,malloc 和 mmap 适合分配虚拟地址空间。 - 访问未映射的虚拟空间时,会触发缺页异常,内核会分配物理页面并建立映射。 - mmap 的重复映射和文件打开过多会导致性能问题。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux内核源码解析04–用户进程页表创建
科学边界发表的文章详细阐述了Linux内核中进程页表的创建、缺页异常处理以及进程切换时的内存管理机制。文章首先介绍了进程创建时页表的创建过程,包括fork时复制父进程的页表、分配pgd物理页面以及拷贝页表项。其次,描述了缺页异常导致的写时复制(COW)的处理流程,包括分配新页面、复制旧页面内容以及更新页表项。最后,文章解释了进程切换时如何通过更新ASID和页表基地址来实现地址空间的切换。这些内容对于理解Linux内存管理至关重要。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux内核源码解析03–启动代码分析之主内核页表创建
Linux内核初始化过程中,会依次建立多种页表映射,以支持不同的内存访问需求。这些映射包括恒等映射、粗粒度内核镜像映射、fixmap映射、细粒度内核镜像映射、线性映射以及用户空间页表映射。文章详细解析了细粒度内核镜像映射和线性映射的创建过程,以及内核主页表的建立。此外,还介绍了伙伴系统的初始化,包括bootmem分配器的初始化、sparse内存模型初始化、zone数据结构初始化等。通过这些初始化过程,Linux内核为后续的内存管理和进程调度等操作奠定了基础。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    linux内核源码解析02–启动代码分析之setup_arch详解
Linux内核在初始化过程中,通过建立页表映射,使得内核可以访问物理内存。在完成了恒等映射和粗粒度内核页表映射之后,为了能够访问bootloader传入的dtb和IO设备,Linux引入了fixmap映射。fixmap将一段固定虚拟地址映射到dtb和想要访问的IO设备地址,为后续的内存管理和设备驱动程序的初始化奠定了基础。 fixmap映射的基虚拟地址和大小由宏`FIXADDR_SIZE`和`FIXADDR_START`表示。`early_fixmap_init`函数负责初始化fixmap映射,它通过填充页表项,将fixmap区域的虚拟地址与dtb和IO设备的物理地址建立映射关系。 在初始化fixmap映射之后,Linux内核通过`ioremap`函数将IO设备的物理地址映射到内核空间的虚拟地址,使得内核可以访问IO设备。`early_ioremap_init`函数负责初始化ioremap映射,它通过计算虚拟地址和物理地址的偏移量,建立映射关系。 此外,Linux内核还通过`fixmap_remap_fdt`函数将dtb的物理地址映射到内核空间的虚拟地址,使得内核可以访问dtb中的内存信息和板级信息。`memblock_reserve`函数将dtb所占用的内存区域添加到memblock管理的reserve模块中,避免后续内存分配时使用到这部分内存。 最后,Linux内核通过`early_init_dt_scan`函数扫描和解析dtb,将内存布局信息填入memblock系统,并通过`arm64_memblock_init`函数整理内存区域,将一些特殊区域添加到memblock内存管理模块中。这些步骤为后续的内存管理和设备驱动程序的初始化提供了重要的基础。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    高度自定义工具OneMore开发
OneMore是一款受bsptools启发而诞生的自定义集成工具,采用pyqt6+fluent-widgets开发,具有侧边导航栏和标签页界面。目前已实现登录、设置、导航栏、标签页等基础功能,并集成了MTK和高通等多种工具的可视化操作。项目开源,期待共同开发和完善。
 11月前
        
        
            
                评论
        
        
        11月前
        
        
            
                评论
            
            
        
        
        
    芯片是如何工作的?
晶体管是电子元器件的核心,其原理基于PN结的单向导通性。硅的掺杂可以形成N型和P型半导体,进而构成PN结。通过外加电压,可以控制PN结的导通与截止,实现电流的控制。这一原理是CPU工作的基础。芯片制造包括晶圆制造、氧化、涂覆光刻胶、光刻、显影、蚀刻、离子注入、剥离光刻胶、金属化和抛光等多个步骤,最后进行测试和封装。CPU的计算基于晶体管构成的逻辑门电路,通过组合这些电路实现复杂的计算任务,例如1+1的运算可以通过或门、与门和异或门电路来实现。
 
    