![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内存
文章平均质量分 62
kaka__55
这个作者很懒,什么都没留下…
展开
-
对linux内核protection_map的一点理解
在mmap流程中,我们最终会走到函数mmap_region()里面完成mmap的动作,mmap_region()函数会调用vm_get_page_prot函数,将用户态传入的flag转换成权限位存放在了vma->vm_page_prot里面。还有一个重要的点,通过查看Pxxx的定义,我们可以发现所有Px1x的值,都是不带有_PAGE_RW权限的,所以所有作为私有映射的页,在发生写操作时,就会陷入缺页中断完成处理了。本文代码基于linux内核4.19.195.下面重点分析这个权限值是怎么生成的。...原创 2022-07-27 19:46:56 · 439 阅读 · 0 评论 -
slub内存分配/释放流程浅析
本文代码基于linux内核4.19.195在之前的文章中,笔者碰到了一个疑似slab内存泄漏的问题,故好好研究了一下slub内存的分配和释放机制,着重在于检查什么时候会从buddy中申请内存,什么时候会把slub内存释放给buddy,进而总结了一下,如下图...原创 2022-04-27 22:54:56 · 886 阅读 · 0 评论 -
slab的并发处理浅析
本文代码基于linux 4.19.195。最近看了不少slab(slub)相关的代码,觉得slub的并发处理做的很优雅,特此记录一下。先来看一个5.15内核的函数。static inline int heart_alloc_int(void){ int bit;again: bit = find_first_zero_bit(heart_irq_map, HEART_NUM_IRQS); if (bit >= HEART_NUM_IRQS) return -ENOSPC; i原创 2022-04-27 19:56:35 · 527 阅读 · 0 评论 -
drop_cache能drop掉hugetlbfs文件的pagecache吗?
本分分析基于linux内核4.19.195版本。我们知道,drop_cache有两个用途,第一个是清除掉page cache以释放出一些内存空间,第二个是调用shrinker的接口,这个接口会释放掉inode、dentry等文件系统相关的cache以及其他组件的一些东西。今天突然脑袋发热的问了自己一个问题:drop_cache能drop掉hugetlbfs文件的pagecache吗?按drop_cache的原理来说是没问题的,drop_cache会去遍历每个super_block下的所有inod原创 2022-03-22 22:07:54 · 763 阅读 · 0 评论 -
get_user_pages和get_user_pages_fast的区别
最近工作中经常遇见get_user_pages和get_user_pages_fast,虽然知道他们都是用来pin住一个页的,但是依然没搞明白后者是如何实现fast的,两者的区别具体在哪。刚好利用周末时间研究一下。本文的分析基于linux 4.19.195.先看看get_user_pages_fast函数的定义/** * get_user_pages_fast() - pin user pages in memory * @start: starting user address * @nr_pa原创 2022-03-20 22:42:53 · 4016 阅读 · 0 评论 -
关于hugetlbfs如何均匀的在各个numa节点上预留内存的探索
本文分析基于linux内核4.19.195.在linux的实际使用中,使用hugetlbfs进行大页内存分配是一种常用的优化方法,而且我们知道,hugetlbfs能够根据需要,将不同numa节点上的内存分配给用户态程序。hugetlbfs常见的用法是,在内核启动完成后,通过写/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages接口预留适当数量的大页,然后通过hugetlbfs获得大页。那么,为了实现“将不同numa节点上的内存分配给用户态程序”,在写原创 2022-03-12 17:45:57 · 1097 阅读 · 0 评论 -
大页与普通页在page结构体上的区别
当linux内核分配普通页或者大页时,都会对相应的page结构体做一定的初始化,初始化的内容因分配的页是大页或者普通页会有一定的区别,下面我们根据代码来看看这些区别。本文代码源于linux-4.19.195。直接由函数alloc_fresh_huge_page入手。/* * Common helper to allocate a fresh hugetlb page. All specific allocators * should use this function to get new huge原创 2021-12-17 20:54:40 · 446 阅读 · 0 评论 -
gfp_mask是0代表什么?
之前写的博客有一个遗留问题,find_get_page函数里指定了gfp_mask是0,这个0代表什么含义呢?内核的gfp.h文件里其实已经给出了答案:/* * GFP_ZONE_TABLE is a word size bitstring that is used for looking up the * zone to use given the lowest 4 bits of gfp_t. Entries are GFP_ZONES_SHIFT * bits long and there原创 2021-12-14 21:12:47 · 451 阅读 · 0 评论 -
kcompactd浅析
之所以想写这篇文章,是因为一个问题:如果我使用slab的时候向内核申请了一个不可移动页,但是此时内核没有不可移动页了,只剩下unmovable的页,那么,根据伙伴系统的设计,会从movable页里面取出来一个用于分配(见__rmqueue_fallback函数),那么,根据内存规整子系统设计的原则,可移动页是最适合做规整的,如果这个slab使用的页面被规整程序移动了,那slab系统不就乱套了吗?此外,书中好像并没有看到说不可移动页是怎么做规整的,那么,规整子系统真的移动了不可移动页吗,如果为真,那这个页是原创 2021-10-22 21:36:42 · 2676 阅读 · 0 评论 -
三个PTE标志位的含义:PTE_DIRTY,PTE_YOUNG,PTE_PRESENT
PTE_DIRTY:CPU在写操作时会设置该标志位,表示对应页面被写过,为脏页。PTE_YOUNG:CPU访问该页时会设置该标志位。在页面换出时,如果该标志位置位了,说明该页刚被访问过,页面是young的,不适合把该页换出,同时清除该标志位。PTE_PRESENT:表示页在内存中。...原创 2020-08-02 20:58:51 · 2294 阅读 · 0 评论