![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
linux内核分析
文章平均质量分 82
5.6.18版本 分析内核源码
为了维护世界和平_
好好学习,天天向上
展开
-
linux kernel 物理内存概述 (八)bootmem引导内存分配
memblock_alloc 负责分配内存,把主要工作委托给函数 memblock_alloc_range_nid。memblock_add: 添加新的内存块区域到 memblock.memory 中。memblock_remove: 删除内存块 区域。,每个内存节点有一个bootmem_data实例。memblock 分配器对外提供的接口如下。memblock_alloc: 分配内存。memblock_free: 释放内存。原创 2024-03-08 23:08:25 · 482 阅读 · 0 评论 -
linux kernel物理内存概述(七)
使用比页小的内存,内核的处理方式使用fork 内核需要使用task_struct专属的slab对象池分配task_struct对象为进程创建虚拟内存空间是,内核使用mm_struct专属的slab对象池分配mm_struct对象。向高速缓存page cache查找对应的文件缓存页时,内核需要使用struct page专属的slab对象池分配使用open打开文件时,内核需要使用struct file 专属的slab对象池分配 struct file对象socket对象。原创 2024-03-08 22:38:25 · 1048 阅读 · 0 评论 -
linux kernel物理内存概述(六)
伙伴必须是大小相同并且在物理上连续的两个或者多个页。原创 2024-03-05 20:33:21 · 474 阅读 · 0 评论 -
linux kernel物理内存概述(五)
物理内存分配步骤1、初始化,参数初始化2、内存充足,快速分配3、内存压力大,慢速分配4、内存紧张,内存规整,原创 2024-03-05 20:05:43 · 1155 阅读 · 0 评论 -
linux kernel物理内存概述(四)
first_zoneslist() 以GFP_KERNEL为例,gfp_zone(GFP_KERNEL)返回1,即highest_zoneidx=1,第一个zone是ZONE_NORMAL,其zone_idx=1 for_each_zonelist_nodemask() 会遍历ZONE_NORMAL和ZONE_DMA32。每个内存节点在内核中抽象成一个zone,zone划分为多个区域,如ZONE_DMA,ZONE_DMA32,ZONE_NORMAL等。alloc_pages函数分析 ...原创 2024-03-05 07:00:00 · 343 阅读 · 0 评论 -
linux kernel物理内存概述(一)
编程接触内存使用malloc C函数库申请,此函数申请的是虚拟内存,要了解虚拟内存,需要了解MMU,页表、物理内存、物理页面、映射关系、按需分配、缺页中断、写时复制等;当了解MMU时,除了要了解MMU工作原理外,还需要了解Linux内核如何建立页表映射,用户空间页表的建立和内核空间页表的建立,以及内核是如何查询页表和修改页表当了解物理内存和物理页面时,接触数据结构pglist_data,zone,page,这三个数据结构描述了系统中物理内存的组织架构。原创 2024-03-04 20:08:58 · 757 阅读 · 0 评论 -
linux kernel物理内存概述(三)
free_low_memory_core_eearly函数,通过for_each_free_mem_range遍历所有内存块,找出内存块的起始地址和结束地址。内核中计算线性映射的物理地址和虚拟地址的转换关系 线性映射的物理地址 = vaddr - PAGE_OFFSET + PHYS_OFFSET。CONFIG_ARM64_VA_BITS设置48,那么PAGE_OFFSET的值为0xFFFF 8000 0000 0000。在内核启动时,DDR大小,内存起始地址和内核空间内存布局,以及映射关系。原创 2024-03-04 20:49:07 · 909 阅读 · 0 评论 -
linux kernel物理内存概述(二)
dts文件的解析 start_kernel->setup_arch->setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_memory。在内核使用之前,需要初始化内核页表,paging_init 函数完成,主要做两次映射,map_kernel与map_mem。对页表的初始化完成后,内核可以对内存进行管理,内核采样zone管理区来管理。都是建立物理地址到内核虚拟地址的线性映射,但映射的地址不一样。原创 2024-03-04 20:44:30 · 1411 阅读 · 0 评论 -
linux每处理器内存分配
分配图的初始状态,第一项存放第一个小块的偏移0,空闲,第二项存放单元的结束标记,偏移单元长度pcpu_unit_size,最低位被设置;最小单元长度 min_unit_size = size_sum,并且不允许小于宏PCPU_MIN_UNIT_SIZE 值是32KB。分配长度 alloc_size = min_unit_size向上对齐到原子长度的整数倍,原子长度是页长度;,放在每个小块的偏移和分配状态,使用最低位表示小块的分配状态;块的状态,每个单元中偏移0,长度32字节的小块被分配出去;原创 2023-09-28 08:20:49 · 1323 阅读 · 0 评论 -
linux缓存-利用缓存提高性能的编程技巧
4、以两个下划线开头的宏__cacheline_aligned_in_smp: 在对称多处理器系统中等价于宏__cacheline_aligned, 在单处理器系统中是空的宏。2、以四个下划线开头的宏____cacheline_aligned_in_smp:在对称处理器系统中等价于宏____cacheline_aligned,在单处理器中是空的宏。以两个下划线开头的宏_cacheline_aligned: 对齐到一级缓存行的长度,并且把变。原创 2023-09-28 07:44:00 · 1003 阅读 · 0 评论 -
linux内核中CMA内存分配
当设备驱动需要使用的时候,把已经分配的页迁移到其他地方,形成物理连续的大内存块。CONFIG_CMA_SIZE_SEL_PERCENTAGE 表示指定物理内存容量的百分比,默认使用指定兆字节数的方式;当设备驱动程序需要使用CMA区域的时候,如果CMA区域的物理页已经被页分配器分配出去,需要把物理页迁移到其他地方。全局CMA区域是由所有设备共享的,设备私有CMA区域由指定的一个或多个设备驱动使用。当设备驱动程序不使用CMA区域的时候,内核的其他模块可以借用CMA区域的物理页,原创 2023-09-28 07:39:40 · 2092 阅读 · 0 评论 -
物理内存分配
4)低端内存区域水线= min_free_pages * zone->managed_pages/lowmem_pages 即把min_free_pages按比例分配到每个低端内存区域;根据物理内存功能不同,将 NUMA 节点内的物理内存划分为:ZONE_DMA,ZONE_DMA32,ZONE_NORMAL,ZONE_HIGHMEM 这几个物理内存区域。ALLOC_HIGH gfp_t掩码设置__GFP_HIGH时才有作用,表示当前内存分配请求是高优先级的,不允许失败,可以从紧急预留内存中分配。原创 2023-09-18 21:31:49 · 1758 阅读 · 0 评论 -
地址空间标识符ASID
处理器给进程分配ASID时,如果ASID分配完了,那么把全局ASID加1,重新从1开始分配ASID,针对每个处理器,使用该处理器的reserved_asids保存该处理器正在执行的进程的ASID,并且把该处理器的active_asids设置0。1、如果进程的ASID与全局ASID版本号相同,那么调用函数atomic64_xchg 把当前处理器的active_asid设置成进程的ASID,并且返回active_asids的旧值。进程数量超过255,两个ASID可能相同,内核引入版本号,解决。原创 2023-09-18 21:35:05 · 1118 阅读 · 0 评论 -
linux内存概念理解
1)不连续页分配器提供了分配内存的接口vmalloc和释放内存的接口vfree.在内存碎片化的时候,申请连续物理页的成功率很低,可以申请不连续的物理页,映射到连续的虚拟页。4、固定映射区域的范围[FIXADDR_START,FIXADDR_TOP),长度是FIXADDR_SIZE,结束地址是FIXADDR_TOP = (PCI_IO_START-2MB)7、KASAN (动态的内存错误检查工具)影子区域的起始地址是内核虚拟地址空间的起始地址,长度是内核虚拟地址的1/8。通常把文件映射的物理页称为文件页。原创 2023-09-12 12:53:16 · 766 阅读 · 0 评论 -
linux内核源码分析之物理内存
当剩余内存在WMARK_MIN,WMARK_LOW时,说明内存有压力,但能满足进程此时的内存分配要求,当给进程分配好后,会唤醒kswapd进程开始回收内存,直到剩余内存在WMARK_HIGI之上。GFP_HIGHUSER 给用户空间分配高端内存,因为在用户虚拟内存空间中,都是通过页表来访问非直接映射的高端内存区域,所有用户空间一般使用的是高端内存区域ZONE_HIGHMEM。WMARK_MIN(页最小阈值), WMARK_LOW (页低阈值),WMARK_HIGH(页高阈值)。原创 2023-09-11 21:52:46 · 1718 阅读 · 0 评论 -
linux内核源码分析之虚拟内存
linux内核虚拟内存一览原创 2023-09-11 21:39:02 · 2011 阅读 · 0 评论 -
查询与进程调度(CFS)相关信息
进程的nice值,优先级,调度策略,vruntime等信息。在proc目录下,以下是查询147号进程的调度信息。先执行 echo 1 > /proc/sys/kernel/sched_schedstats。调度相关的统计 需要配置CONFIG_SCHEDSTATS。再次查看,多出来好多statistics信息。原创 2023-03-06 22:16:15 · 619 阅读 · 1 评论 -
linux内核调度问题分析
假如内核只有3个线程,线程0创建线程1和线程2.当系统时钟到来时,时钟中断处理函数会检查是否有进程需要调度。当有进程需要调度时,调度器会选择线程1或者线程2。start_kernel运行在线程0里,线程0创建线程1和线程2。函数调用关系start_kernel()->kernel_debug()->do_fork 创建新线程,并把新线程添加到调度器的就绪队列中。线程0创建线程1和线程2后,进入while线程,线程0不会退出,等待被调度出去。1、产生时钟中断。处理器采用定时器来周期性地执行。原创 2023-03-06 21:37:37 · 2307 阅读 · 0 评论 -
在shell中执行一条可执行程序(./a.out) 系统执行的过程
shell 运行test程序,调用fork()系统调用函数来创建一个新进程;分析在命令行下使用./test程序。程序在用户态和内核台中运行的流程。调用exec系统调用函数来装载test程序。do_fork ->新进程。原创 2023-02-27 09:24:55 · 948 阅读 · 0 评论 -
linux内核—启动程序
在shell中执行./a.out程序的时候,内核是如何执行的?//父进程else if(ret == 0)//子进程execve()else//失败shell进程首先创建子进程,然后子进程装载程序a.out。原创 2023-02-21 10:56:37 · 1306 阅读 · 3 评论 -
linux内核—进程调度(核心)
如果当前进程属于空闲调度类或公平调度类,并且所有可运行的进程属于公平调度类,那么直接调用公平调度类的pick_next_task方法。如果公平调度类没有选择下一个进程,那么从空闲调度类选择下一个进程。一般情况,从优先级最高的调度类开始,调用调度类的pick_next_task方法来选择下一个进程,如果选中了下一个进程,就调度这个进程。1)停机调度类:pick_next_task_stop,如果运行队列中的成员stop指向某个线程,那么这个进程在运行队列中,那么返回成员stop指向的进程,否则反馈空指针。原创 2023-02-20 10:01:18 · 2166 阅读 · 0 评论 -
linux内核—进程调度时机
Arm64中断处理入口的函数el1_irq 中断处理程序处理完成后,如果进程的抢占计数器是0,并且设置了重新调度的标志,那么调用函数el1_preempt,函数调用preempt_schedule_irq以执行抢占调度。如果不设置,不会抢占,现象是,如果一个进程在内核模式下运行很长时间,将会导致交互进程等到很长时间,响应慢。当时钟中断处理程序准备把处理器还给被打断的进程时,如果被打断的进程在用户模式下运行,就检查有没有需要设置重新调度标志,如果设置了,调用schedule函数调度其他进程。原创 2023-02-20 09:58:54 · 1325 阅读 · 0 评论 -
linux 内存恒等映射
页全局目录(Page Global Directory,PGD)页上级目录(Page Upper Directory,PUD)页中间目录 (Page Middle Directory,PMD)页表 (Page Table,PT)PGD的偏移量 39页表的大小和页表项数量PGDIR_SHIFT 表示PGD页表在虚拟地址中的起始偏移量PGDIR_SIZE 表示一个PGD页表项所能映射的区域大小PGDIR_MASK 用来屏蔽虚拟地址中PUD索引,PMD索引以及PT索引字段的位。原创 2023-01-12 10:14:33 · 1296 阅读 · 1 评论 -
linux init进程创建
task_union数据结构存储在内核栈的底部。原创 2023-01-09 10:01:02 · 841 阅读 · 0 评论 -
linux内核调度浅析
linux进程调度相关的知识再重新梳理一遍。抽取主要数据结构中的主要成员,以最简单的方式实现进程调度。原创 2023-01-08 21:38:21 · 3525 阅读 · 0 评论 -
linux内核中断
芯片的中断控制器(PIC/GIC)有掩码寄存器,操作系统能够通过编程屏蔽或阻塞硬件中断。tasklet_hi_schedule()相比tasklet_schedule()有更高的软中断优先级。内核线程与用户模式线程非常相似,它在进程上下文中独立运行,并有自己的任务结构,能够被调度。默认情况下,在中断函数处理时,所有的本地CPU的中断是被屏蔽的。中断上半部处理比较快的程序,如执行纯粹小的需求,中断处于关闭状态;使用线程中断处理是现代的一种方式,使用下半部机制是传统的方法。如何判定选择硬中断还是线程中断?原创 2022-12-24 21:33:02 · 2139 阅读 · 0 评论 -
Linux内核中mutex,spinlock的使用
并发性的,在CPU1线程B获取锁B,同时想获取锁A,导致AB-BA死锁。锁的粒度:在大项目中,使用太少的锁是个问题。锁A发生在中断上下文中:如果中断发生,中断处理函数尝试获取锁A,导致死锁。因此,在中断上下文中获取的锁必须始终在禁用中断的情况下使用。mutex lock 是睡眠锁,在等待锁时将睡眠,再锁被释放后,内核唤醒等待的进程运行;此外,不可中断状态的睡眠更多一些,必须无限期阻塞等待,任务不能打断阻塞的等待。在人机交互应用程序中,一般的经验,通常应该将进程置于可中断的睡眠状态。原创 2022-09-29 16:23:48 · 3052 阅读 · 0 评论 -
Linux内核变量中per-CPU的使用
lock-free技术:per-CPU与lock-free数据结构RCU。get_cpu_var()会引用preempt_disable(),禁止内核竞争。或者per_cpu(var,cpu) 如遍历每个CPU核的pcpa的变量。//源码文件arch/x86/kernel/process_64.c。put_cpu_var()会引用preempt_enable()两个线程使用共享变量,使用per-CPU,最后各自的输出是正确的。有两种申请方式:动态申请和静态申请。增加per-CPU的变量。原创 2022-09-27 10:50:36 · 1695 阅读 · 0 评论 -
Linux内核中Lockdep死锁检测
死锁的检测以及使用锁存在的问题。通过两个实例分析循环锁和AB-BA锁异常的检测。原创 2022-09-27 10:35:07 · 2882 阅读 · 0 评论 -
Linux内核中KCSAN 数据竞争检测
共享可写数据,并行执行时需要用锁来保护,或用lock-free。原创 2022-09-22 13:47:56 · 1963 阅读 · 0 评论 -
Linux内核中oops 错误解析以及问题定位
文档最后有完整的oops输出文件,此处将输出分成多个小块进行分析。原创 2022-09-21 10:20:46 · 6862 阅读 · 0 评论 -
Linux内核中使用内存检测
在内核中提供了内存检测的工具slub与kasan,在开发时可以将检测的功能打开。原创 2022-09-20 09:08:35 · 2539 阅读 · 0 评论 -
eBPF理解 (四)
bpftrace用在快速排除和定位系统上,简单的脚本开发并执行;BCC用在复杂的eBPF开发,使用最广泛;libbpf从内核中抽离出来的标准库,不在需要每台机器安装LLVM和内核头文件。原创 2022-08-27 12:31:07 · 1582 阅读 · 0 评论 -
eBPF理解(三)
使用例子第一条如:用户态 setsockopt(sock,SOL_SOCKET,SO_ATTACH_BPF,...)绑定BPF到具体的socket上。在网络驱动程序刚收到数据包时触发,无需通过网络协议栈,可用来实现高性能网络处理方案,常用于DDos防御,防火墙,4层负载均衡等场景。类型:BPF_PROG_TYPE_SCHED_CLS 和 BPF_PROG_TYPE_SCHED_ACT。这些类型的BPF程序都可以通过BPF系统调用的BPF_PROG_ATTACH进行挂载。用于过滤,观测或重定向套接字网络包。原创 2022-08-20 17:50:57 · 3011 阅读 · 0 评论 -
eBPF理解(二)
eBPF运行时在内核中有五个模块组成。原创 2022-08-20 15:38:06 · 2583 阅读 · 0 评论 -
eBPF理解 (一)
eBPF 是从 BPF (Berkeley Packet Filter) 技术扩展而来的eBPF 系统启动后就一直运行在那里,它需要事件触发后才会执行。借助kprobe和uprobe,eBPF 程序几乎可以在内核和应用的任意位置进行插桩。eBPF 的诞生成为内核的一个顶级子系统最典型的就是 iovisor 带来的 BCC、bpftrace 等工具。图片来源BPF开发过程过程使用C语言开发eBPF程序借助LLVM把eBPF程序编译成BPF字节码通过bpf系统调用,把BPF字节码提交给内核。原创 2022-08-20 12:33:36 · 3600 阅读 · 0 评论 -
linux性能分析之内存篇
目录一、常用命令二、内存一般分析思路三、内存优化思路1、vmstat vmstat报告有关进程、内存、分页、块IO、陷阱、磁盘和cpu活动的信息。2、sar 这条命令非常强大,全面的分析系统性能 包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存的使用情况、进行活动以及IPC有关的活动等参数,3、pidstatThe pidstat command is used for monitoring individual tasks currently being mana原创 2022-08-08 21:27:02 · 2480 阅读 · 0 评论 -
内存中的swap机制
内存资源紧张时,linux会通过Swap,把不常用的匿名页换出到磁盘,访问时再从磁盘换入到内存;系统定期回收的阈值通过/proc/sys/vm/min_free_kbytes 调整;页回收的倾向通过 /proc/sys/vm/wappiness 调整;监控策略sar,/proc/zoneinfo查看。参考链接。......原创 2022-08-08 14:36:52 · 7025 阅读 · 2 评论 -
内存中的buffer与cache
目录buffer与cache1、free命令2、proc系统中参数说明试验一 文件与磁盘的写入1、文件写入2、磁盘写入试验二 :文件和磁盘的读1、文件读取2、读磁盘 总结从命令行中查看内存中的buffer与cache,并跟踪理解其含义free命令输出的结果有总内存,已用内存,空闲内存,缓存,可用内存。缓存是buffer与cache的总和。从字面意思上理解,buffer是缓冲区,cache是缓存,都是内存中的临时存储区,两者的区别是什么呢?在free的使用说明中有以下说明buffer 是内核缓冲区原创 2022-08-06 21:17:37 · 1911 阅读 · 0 评论 -
linux内存页回收
目录一、页回收概述二、物理页根据是否有存储设备支持分为两类2.1 回收策略2.2 回收原则2.3 回收的方法2.4 页的活动程度判断2.5 反向映射三、发起回收3.1 异步回收3.2 直接回收四、页交换1)磁盘作为交换分区2)文件作为交换分区 申请分配页的时候,页分配器首先尝试使用低水位线分配页。如果分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器将会直接回收页。1)交换支持的页(原创 2022-08-01 22:05:55 · 1220 阅读 · 0 评论