- 博客(20)
- 资源 (2)
- 收藏
- 关注
原创 Linux的系统调用
Linux应用程序通过glibc标准API(如exit())发起系统调用。编译后,exit(1)转为三条汇编:mov指令将系统调用号存入eax,参数存入ebx,int 0x80触发中断。CPU通过中断描述表找到system_call()入口,根据eax值查询系统调用表(如syscall_64.tbl),匹配对应的内核函数(如sys_read)。内核函数通过SYSCALL_DEFINE宏定义,最终执行__do_sys_xxx实现具体功能。整个过程实现了用户态到内核态的安全切换。
2025-08-29 15:58:01
131
原创 Linux内存管理 - LRU机制
本文介绍了Linux内核中的LRU(最近最少使用)内存管理机制。内核通过LRU链表将内存页分为活跃(热页)和不活跃(冷页)两类,当内存不足时由kswapd线程回收冷页。文章详细解析了LRU的数据结构实现,包括lruvec结构体、5种LRU链表、PG_referenced标志位的作用机制,以及从pagevec到folio_batch的演进过程。这些机制共同实现了高效的内存回收策略,通过批量处理folio结构优化了内存管理性能。
2025-08-29 15:54:58
405
原创 Linux的页表管理
本文摘要: Linux内存管理机制解析,重点介绍了物理帧号(PFN)与页表结构的关系。32位系统使用二级页表(PDE-PTE),64位系统使用四级页表(PGD-PUD-PMD-PTE)。文章详细阐述了页错误(Page Fault)的触发机制与处理流程,包括内核页表init_top_pgt的初始化过程。同时分析了进程切换时页表更新的机制,指出内核通过clone_pgd_range将部分内核页表(273-511项)拷贝到用户进程页表,既保证内核页表不变,又防止用户空间越界访问内核区域。最后对比了32位与64位系
2025-08-14 14:36:17
681
原创 Linux中vmalloc的实现
本文分析了Linux内核中vmalloc的实现机制。vmalloc用于在内核空间分配虚拟连续但物理不连续的内存,其核心流程包括:1)通过__get_vm_area_node在vmalloc区域查找可用虚拟地址,使用红黑树管理vmap_area结构;2)通过__vmalloc_area_node从buddy系统分配物理页,建立页表映射;3)处理缺页异常时,通过vmalloc_fault将init进程的页表项复制到当前进程。该机制通过init_mm共享内核页表,实现了进程间内核地址空间的同步。
2025-08-11 16:38:52
956
原创 kmalloc
摘要:kmalloc是Linux内核中用于分配小块连续内存(≤4K)的核心机制,底层依赖slab(小内存)或buddysystem(大内存)。其分配策略为:≤8K从slab分配(预定义kmalloc_caches管理不同尺寸的slab,如8B~8K),>8K则直接调用buddysystem(最大支持4M)。内存地址通过内核启动时已建立线性映射(PA=VA-FixedOffset)。实现上,kmalloc通过编译优化区分常量/非常量请求,最终调用___kmalloc_large_node(buddysyst
2025-08-11 16:30:33
1002
原创 Slub(Slab)
本文摘要: Linux内核SLUB内存分配器是对SLAB的改进版本,采用分层管理结构。核心数据结构包括kmem_cache(描述缓存池)、kmem_cache_cpu(CPU本地缓存)、kmem_cache_node(NUMA节点缓存)和slab(内存页管理单元)。SLUB采用两级回收机制(CPU级和Node级),通过freelist实现快速分配。当本地CPU缓存不足时,会依次检查partial链表和伙伴系统获取内存。调试特性包括红区检测和kfence工具。关键函数kmem_cache_create/all
2025-08-11 16:28:58
802
原创 Per-CPU pages
这些缓存在pcp中的页框,若释放到free_area中则可能可以与其它页框合并成order更高的内存块,从而减少系统的内存碎片。PS: 通过per_cpu_ptr(zone->per_cpu_pageset, cpu_x);得到一个指针,指向cpu_x的那个struct per_cpu_pages空间。(1)为每个zone调用setup_zone_pageset分配并初始化per_cpu_pageset。(2)初始化每个cpu的struct per_cpu_pages的每个变量, 这里是给每个变量都赋0。
2025-08-11 16:24:16
809
原创 Buddy system
Linux引入了伙伴算法(buddy system)来解决内存外碎片问题。该算法将物理内存划分为2^n大小的块,并按大小组织成不同阶(order)的链表。分配时,先查找合适阶的链表,若没有则从高阶分割出所需块;释放时,会检查相邻空闲块是否为伙伴关系,是则合并成高阶块。核心数据结构free_area数组管理各阶空闲链表,通过__rmqueue_smallest等函数实现分配,释放时通过合并减少碎片。算法还支持不同迁移类型(MIGRATE_TYPES)的内存管理,并包含fallback机制处理分配失败情况。
2025-08-11 16:19:19
917
原创 Linux内核对物理内存组织与分配
Linux物理内存管理采用分层结构:NUMA架构下引入node概念,每个node对应一个物理内存节点,由pglist_data结构表示。node进一步划分为多个zone(如DMA、NORMAL等),由zone结构描述。物理内存以page为单位管理,通过mem_map全局数组跟踪所有页框。Linux采用四种机制管理不同粒度的内存分配:伙伴系统处理大块连续内存(>32K),per-CPU页缓存优化小内存分配(≤32K),slab缓存管理小块对象(<4K),vmalloc机制提供虚拟连续的内存空间。这
2025-08-11 16:12:37
792
原创 Cache和内存一致性
本文主要探讨缓存一致性与内存一致性的区别。内存(DIMM)是物理存储设备,而缓存(CPU芯片内的L1-L3)是高速暂存区,采用分级结构。缓存一致性通过MESI协议(四种状态)确保多核CPU访问同一数据时的正确性,分为Snooping和Directory两种模式。内存一致性则涉及NUMA架构,解决多处理器访问内存的性能问题,其中cc-NUMA在NUMA基础上支持缓存一致性。文章详细对比了二者的工作原理和实现机制,帮助理解计算机系统中的这两种重要一致性概念。
2025-08-11 16:02:41
478
原创 x86/64-物理地址、虚拟地址、线性地址、逻辑地址
文章摘要:本文梳理了x86架构中的地址转换机制。总结了物理地址、虚拟地址、线性地址、逻辑地址的定义和相互转换关系。
2025-06-25 15:30:10
612
原创 一文读懂NPEM(Native PCIe Enclosure Management)
本文从PCIe协议即软件的角度和硬件实现的角度,详细介绍讨论了NPEM(Native PCIe Enclosure Management)。
2024-01-24 11:19:31
3538
4
原创 IPMI的SOL (Serial Over LAN)原理与使用
本文档介绍了在服务器上配置和使用SOL远程控制Linux和ESXi直接控制台的方法。
2024-01-08 15:29:42
9947
原创 如何使用pyvmomi在ESXi中创建虚拟机并配置其相关硬件
使用pyvmomi创建VM使用的API是createVM_Task, 具体使用说明如下:接下来我们一步一步来看怎么实现。
2023-06-19 11:22:43
443
原创 通过pyvmomi给ESXi现有VM添加一个SCSIcontroller
通过web手动添加SCSIcontroller的时候可以知道,ESXi的VM只能添加ParaVirtualSCSIController。
2022-10-11 16:21:55
422
原创 SONiC系统概要、使用及移植
文档概述文档目的本文档从多个方面介绍了SONiC及其移植、安装和使用等。旨在帮助没有接触过SONiC的工程师,快速入门、了解SONiC,并学会移植和简单的使用SONiC。文档背景SONiC 是一个为网络设备开发的开源操作系统项目。与ONL一样,SONiC需要通过ONIE环境安装系统到磁盘或者flash分区中。SONiC简介SONiC是一个基于Linux的开源的网络操作系统,运行在多个供应商的交换机和ASIC上。SONiC提供一整套的网络功能,例如BGP和RDMA,这些功能已经在一
2022-05-21 16:17:58
9721
原创 ATCA基础入门学习总结
最近刚开始学习ATCA,尝试调试写一套板卡机框管理程序,分享记录学习的过程和总结,对一些知识理解还较为浅显片面,欢迎大家指正共同学习,还有不停陆续完善此文。1.什么是ATCA ATCA,又称先进通信计算机体系架构,是PICMG开发的业内最新的开放标准之一,说简单通俗一点儿,就是为电信级平台创建了一种硬件规格(标准刀片式板卡 + 标准机箱)和软件规范(管理的通信协议...
2019-02-18 13:13:58
5072
原创 Nuttx系统添加自启动脚本(上电后自动运行程序)
步骤1 : 进到你的工程目录下我的工程目录是/home/truman/work/nb/nuttx所以输入命令cd /home/truamn/work/nb/nuttx步骤2 : 找到etc文件压缩包输入指令find -name "etc*"会得到以下路径./configs/sim/include/etc.tar.gz进到该文件夹下cd configs/s...
2019-02-18 09:37:04
460
数字图像实训报告
2017-06-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人