自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

GetnextWindow的专栏

大爱开源

  • 博客(193)
  • 资源 (7)
  • 收藏
  • 关注

原创 Linux memcg lru lock提升锁性能

继续检查,这个页是否在swapcache中,如果在,返回这个页地址加虚拟地址地址在页中的偏移,如果不在,获得一个内存页, 到swap设备上读取内容填到这个页,此处产生IO, 为Major page fault. 接下了就上把这个页加到swapcache,加入 LRU, 加入page table, 关联到所属的memcg, 并且添加反向映射,然后用户就可以正常使用了。解决的根本是改变页加入lru list和memcg的次序:如下所示,先关联memcg, 然后在加入lru list.get lru_lock;

2024-09-16 22:35:44 1319

原创 Linux per memcg lru lock

原来, 内核在引入 per memcg lru lists 后,并没有使用 per memcg lru lock, 还在使用旧的全局 lru lock 来管理全部 memcg lru lists。其实这些补丁和 Hugh Dickins 的补丁毫无关联, 并且在和 Johannes 的持续讨论中,解决方案的核心:page->memcg 的线性化已经进化了几个版本了, 从 relock 到 lock_page_memcg,再到 TestClearPageLRU,和 Google 的补丁是路线上的不同。

2024-09-16 22:29:33 975

转载 Linux匿名映射

在切入逆向映射的历史之前,我们还是简单看看一些基础的概念,这主要包括两个方面:一个是逆向映射的定义,另外一个是引入逆向映射的原因。1、什么是逆向映射(reverse mapping)?在聊逆向映射之前,我们先聊聊正向映射好了,当你明白了正向映射,逆向映射的概念也就易如反掌了。所谓正向映射,就是在已知虚拟地址和物理地址(或者page number、page struct)的情况下,为地址映射建立起完整的页表的过程。例如,进程分配了一段VMA之后,并无对应的page frame(即没有分配物理地址),直

2024-09-15 22:06:19 272

原创 终于讲清楚了,Linux Cgroup机制以及其树形结构怎么创建的

了解Linux Cgroup机制的都清楚,cgroup机制最终是通过树形结构表示的,既然是树形结构,我们必须搞清楚这个树形结构是怎么创建起来的,以及在内核源码中是怎么表达这种树形结构的,我们是否非常清楚怎么遍历整个树,本文将基于Linux5.15源码分析cgroup树形结构的创建过程。假设我们有如下层级结构:app就是test1和test2的父节点,test1和test2是兄弟节点,我们按照这个例子具体展开分析。

2024-09-15 14:19:56 777

原创 [Linux Kernel Block Layer第一篇] block layer架构设计

随着SSD快速存储设备的发展,内核社区越发发现,存储的性能瓶颈从硬件存储设备转移到了内核block layer,主要因为当时的内核block layer是single hw queue的架构,导致cpu锁竞争问题严重,本文先提纲挈领的介绍内核block layer的架构演进,然后根据最新的架构研究内核源码的实现细节,直击内核block layer本质原理。

2024-09-08 08:58:12 534

原创 Linux block_device gendisk和hd_struct到底是个啥关系

根据块设备号dev,从blockdev_superblock拿到inode节点,为什么这里能拿到块设备文件(/dev/block/zram0)的inode,就是因为bdev_add时候将inode对象加入到blockdev_superblock的inode hash表中了,这里就能拿到。blkdev_get_by_dev函数返回了一个block_device,这个block_device跟前面zram块驱动blk_alloc_disk 生成的block_device有啥关系?

2024-09-07 00:18:35 806

原创 2024年Linux内核社区关于large folio和mthp的关键进展

所以唯一可行方案是THP recovery,也就是在被split的1GBTHP基础上,保留未被重新分配的页,并将已被重新分配的页的数据复制到额外的4KB页,然后将原有的1GB物理区域“物归原主”成THP。由于 mTHP 的 size 大于 4KiB 的 small folios,理论上,它更容易出现 false sharing 的情况,频繁迁移会导致内存跨 NUMA Node 来回 ping-pong,因此,在算法上,mTHP 暂时借用了 PMD-mapped 的 2-stage filter 机制。

2024-09-01 10:23:45 1200

原创 Linux TLB和cache

Linux TLB和cache。

2024-08-31 21:01:49 1100

原创 linux每个memory cgroup的lru链表是什么创建的 - 5.15内核

对Linux memory子系统有基本了解的都知道,linux内核通过LRU管理物理内存,不知道是否有思考过如下问题:LRU是全局一套,还是说每个memory cgroup拥有单独的一套LRU链表?直接揭晓答案:每个memory cgroup都会单独的LRU链表。

2024-08-29 19:46:30 684

原创 linux swap slot机制

其基本的思想是:swap slot cache从swap area中批量申请一些slots,之后内核在swap out操作申请slot时,直接从swap slot cache中获取,内核进行swap in释放slot时,也直接归还到swap slot cache中,这样比每次都向swap area逐个申请和释放要更加快速。判断的具体门限是以"SWAP_SLOTS_CACHE_SIZE"大小的倍数计,低于2倍时(相当于low watermark)就关闭swap slot cache。

2024-08-23 09:24:27 337

原创 zram机制 - zram_bvec_write为什么要调用zram_free_page

或者swap_writepage找一个空闲的slot,但是之前这个slot调用zram_slot_free_notify时,由于zram_slot_trylock失败,也没有在zram_slot_free_notify中调用zram_free_page,所以在本次写zram时,释放。有条件释放swapcache,看下面代码, 条件之一是mem_cgroup_swap_full(),也就是判定swap是否已经使用了50%,如果超过了50%,就要调用folio_free_swap进一步释放;

2024-08-22 23:22:06 372

原创 linux memory cgroup的memory.move_charge_at_immigrate含义

最开始某个进程是在cgroup A中,后面要迁移到cgroup B中,那么进程的内存计数是否要完全迁入B中,就是通过memory.move_charge_at_immigrate控制,如果目标cgroup也就是B设置了1到该字段中,那么进程的内存记账也要从cgroup A中去掉(uncharge from A),同时计算到B中(charge to B)。

2024-08-20 22:34:19 287

原创 源码视角看memory cgroup目录下创建目录以及读写节点发生了什么

【代码】源码视角看memory cgoup目录下创建目录以及读写节点发生了什么。

2024-08-17 09:52:39 108

转载 linux cgroup设计与实现机制

cgroup的全称为,中文翻译为控制组。内存CPUI/O和网络等。如下图所示,使用cgroup来限制进程组对内存的使用:在上图中,我们创建了 2 个cgroup(每个 cgroup 有 4 个进程),并且限制它们各自最多只能使用 2GB 的内存。如果使用超过 2GB 的内存,那么将会触发错误。cgroup通过把进程划分成控制组(一个控制组包含一个或多个进程),并且可以对控制组进行资源使用的控制,也就是说cgroup作用对象是控制组。cgroup提供了将进程组织成控制组的能力,然后通过使用。

2024-08-16 23:44:57 59

原创 关注GenieOS微博官方号,OS技术学起来

Sina Visitor Systemhttps://weibo.com/u/6559724328

2024-07-31 09:52:30 208

原创 linux 公平调度关键点记录

这里计算了curr任务的运行时间,二now是直接从当前cpu的cfs_rq记录的所有任务的物理运行时间,如果update_curr调用时候有curr之外的任务运行那就不正确了,可以看到对于-20和15两个进程的情况下,其虚拟运行时间是基本相同的,这正式cfs公平调度的核心,所谓的公平是指在虚拟机运行时间的层面是完全公平的。怎么计算出来-20和15两个任务的实际运行时间和虚拟运行时间呢?-20任务的realruntime = 88761/(88761+36) x 10ms = 9.996ms。

2024-07-20 23:34:15 329

原创 Linux Swap机制关键点分析

参考文章:Linux Swap 从 userspace 到 kernel详解_kernel swap-CSDN博客Linux Swap 与 Zram 详解 - 泰晓科技一文聊透 Linux 缺页异常的处理—— 图解 Page Faults(下) - 简书

2024-06-30 18:17:58 431

原创 zram压缩机制看swapon系统调用

上面代码read_mapping_page是能够读取内容的关键是mapping对象,因为mapping->aops有readpage函数,但是这里mapping和mapping->aops是什么时候设置的?上面命令调用了linux的swapon系统调用启动zram0交换分区;mkswap命令向块设备文件/dev/block/zram0写入了swap_header信息。那么swapon_all命令执行了哪里的代码呢?但是这是什么代码路径设置进去的呢?

2024-06-29 22:27:54 434

原创 Linux pi futex锁优先级继承实现原理

【代码】Linux pi futex锁优先级继承实现原理。

2024-06-02 10:55:22 145

原创 Android13屏幕旋转的基本逻辑

2.设置user_rotation和GSensor哪个优先级更高,比如user_rotation = 0期待竖屏,但是打开屏幕旋转且处于横屏时,应该是横屏还是竖屏。现在我们知道,屏幕方向旋转是通过加速度传感器或者重力传感器来获取,但Sensor上报的原始数据还得通过一系列计算得到最终的旋转角度,这部分逻辑在。答案:设置用户期望的屏幕转向,0代表:Surface.ROTATION_0竖屏;3.systemui中的“自动旋转”按钮影响的是哪个数据和系统的值。答案:此时GSensor优先级更高,横屏显示,

2024-05-12 13:30:58 1170 1

原创 linux task_struct中进程调度相关的变量记录

参考文章:

2023-11-27 22:43:16 194

原创 HWUI源码剖析(二) - 终于讲清楚OpenGL渲染的MVP矩阵的来龙去脉

研究android8.1 HWUI源码的过程中,发现OpenGL是绕不过的一个知识点,不理解OpenGL的绘制基础,必然无法很好的理解Hwui基本原理,同时熟悉OpenGL之后,HWUI也是一个非常优秀的OpenGL 2D渲染的代码,本文将介绍一下OpenGL绘制图形的重要原理,为学习HWUI源码扫清障碍,本文我们将以会一直一个白色的矩形为例,结合代码实践加以说明。

2023-10-22 21:57:22 520

原创 HWUI源码剖析(一) - 渲染中RenderProxy视角看一种很有用的编程模式

实际的工程项目中,往往都是多线程编程,也就是必然有某些业务逻辑或者功能要运行在特定的线程,比如android开发中常见的IO线程,UI线程,Render线程,这样会涉及从线程A向这些工作线程通信或者函数调用的代码编程,具体实现上可以有多种多样,但是他们的核心思想其实都是一致的,Android Handler/Looper视角看UI线程的原理_nginux的博客-CSDN博客。

2023-10-15 19:45:44 314

原创 Android Handler/Looper视角看UI线程的原理

Handler/Looper机制是android系统非重要且基础的机制,即使在rtos或者linux操作系统上开发应用框架时,也经常借鉴这个机制。通过该机制机制可以让一个线程循环处理事件,事件处理逻辑即在Handler的handleMessge种。本文建议android8.1源码分析这套机制的实现原理。

2023-10-14 16:46:49 856

原创 multi-generation lru系列 - workingset的适配

Linux 内存workingset Refault Distance算法源码及源码解析-CSDN博wen一文中我们分析了workingset算法的实现原理,内核引入mglru之后workingset算法也要做相应的适配,因为mglru算法使用了PID控制反馈算法,这其中就要统计refaulted次数和eviction次数,这些数据的统计就在workingset.c中实现的,接下来我们以v6.1源码分析workingset对于mglru的适配更新。

2023-10-03 20:46:46 389

原创 Linux回收内存的时候遇到PageWriteback和PageDirty脏页怎么处理?

我们知道内存回收会遇到各种情况的page,比如正在回写的page(PageWriteback)和脏页(PageDirty)的page,内核会等待PageWriteback完成回写呢,还是说直接跳过正在回写的页面。这两种选择各有优劣,如果等待Writeback完成会影响内存分配性能;如果直接跳过呢可能影响内存回收的效率。PageDirty的page也面临类似的问题,所以我们来看下内核v4-14源码中是如何处理这两种情况的。

2023-10-03 09:39:30 499

原创 multi-generation lru系列 - 怎么决定回收anon还是file

Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?-CSDN博客。

2023-10-02 23:26:31 339

原创 Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?

Linux内核为了区分冷热内存,将page以链表的形式保存,主要分为5个链表,除去evictable,我们主要关注另外四个链表:active file/inactive file,active anon和inactive anon链表,可以看到这主要分为两类,file和anon page,内存紧张的时候,内核开始从inactive tail定量回收page,那么这里面就有个很重要的选择:inactive file和inactive anon lru链表的回收比例到底怎么确定?

2023-09-29 22:36:29 567

转载 LWN:多代LRU方案的未来!

当一个 page 被访问时,它们会从较老的一代 list 移动到较新的一代,当需要回收内存时,会先从最古老的一代来开始回收 page。每一代的 page 都会随着时间的推移而变得老化,当最老的一代中的 page 都被回收掉了的时候,就会创造出新的一代。自这项工作的第一次发布以来最大的变动是在 "tier" (层)的定义上,tier 这个词现在被用来细分各代 page,这反过来又可以帮助更好地决定哪些 page 需要回收(reclaim),特别是在那些需要使用大量 buffered I/O 的系统中。

2023-09-24 22:34:44 239

原创 Linux 内存workingset Refault Distance算法源码及源码解析

内核mm子系统中有一个workingset.c实现了refault distance算法,发现网络逻辑介绍该算法的文章主要是黏贴自奔跑吧内核一书中的内容,军比较雷同,讲述的角度比较难以理解,我第一看到的时候琢磨了2天才明白,本文希望从更容易理解的角度来分析何为refault distance算法,以及内核引入该算法的原因,这就要从内核回收page面临的挑战说起。本文源码:v5.9。

2023-09-24 22:26:11 832

原创 Linux qemu启动内核rootfs挂载失败VFS: Cannot open root device问题解决方案

【代码】Linux qemu启动内核rootfs挂载失败VFS: Cannot open root device问题解决方案。

2023-09-22 08:26:17 1099

原创 Linux关于memory cgroup的几个要点

进程的内存可以分很多类型,比如page cache,slab,anon memory等,到底是限制的哪些内存?如果进程A已经运行起来占用了一些内存,之后,再将A加入memory cgroup限制,原来占用的内存会统计入新的memory cgroup?memory cgroup有memory.soft_limit_in_bytes和memory.limit_in_bytes,假设进程使用内存超过这两个限制,内存回收时机和路径是怎么样的?

2023-09-17 17:59:53 1243

原创 Linux mmap读/写触发共享文件页生命周期

Linux的mm内存子系统的核心功能就要要管理各种类型的page,确保能高效分配和释放,让物理内存得以最大化使用。初识内存系统往往关注的是page的申请和管理流程,容易忽略page的释放回收流程,其实理解mm中的内存回收和释放也是最核心的机制。

2023-09-11 23:52:07 398

原创 linux的dirty page回写磁盘过程中是否允许并发写入更新page?

众所周知Linux内核write系统调用采用pagecache机制加速写入过程,避免write系统调用长时间block应用进程,用户态进程执行write调用的时候,内核只是将用户态buffer copy到内核的pagecache当中,write系统调用就返回了,完全不需要等待数据完全写入存储设备,因为存储设备是的写入可能是个耗时很长的过程。内核正在回写page到存储设备的过程中,是否允许应用层同时更新page内容?应用层更新page是否会被block?本文将从理论和内核源码两个方面彻底分析该问题。

2023-09-10 07:59:17 562

原创 Linux page migration源码分析

Linux 内核page migration设计文档_nginux的博客-CSDN博客前文介绍了page migration迁移的设计思路,且内核文档介绍得知,总计需要20个steps完成迁移过程,本文目标是以源码视角对应到这20个step上面,加深对于页面迁移的理解。内核源码版本:Linux-5.9。下面再贴一下内核描述的20个step:__unmap_and_move函数//page:需要迁移的page//newPage: 迁移的目标page。

2023-08-27 10:41:38 446

原创 Linux 内核page migration设计文档

page migration设计之初是在numa system的各个node之间迁移physical pages,意味着进程页面的虚拟地址不会变化,物理地址发生改变,migration的目的将page迁移到临近的cpu上降低内存访问延迟。

2023-08-26 20:44:10 502

转载 自旋锁 spin_lock、 spin_lock_irq 以及 spin_lock_irqsave 的区别

能够停留下来认真读这篇文章的人大部分都已经了解了什么是自旋锁,至少知道自旋锁就是不停的询问资源有没有准备好的一把锁,这个从概念上很容易理解,当然他的内在也是很容易实现。

2023-08-23 11:10:53 876

原创 Linux源码剖析struct page结构体flags成员

/跟page reclaim的二次机会法有关//page缓存内存和磁盘数据一致//代表是脏页PG_dirty,//page在lru链表中PG_lru,//page在active lru链表中PG_active,//IO错误PG_error,//page是对应的是slab内存PG_slab,PG_arch_1,//不能换出//正在回写//马上开始回收,回收前设置//匿名页和shmem page设置该条件//被mlock了#endifPG_young,PG_idle,

2023-08-13 23:26:21 406

原创 Linux源码剖析匿名共享内存shmem原理

进程间共享匿名内存有两种重要的方式,其一是mmap设置MAP_SHARED | PRIVATE创建的虚拟地址区域,这片区域fork执行之后,由父子进程共享。其二是主动调用shmget/shmat相关接口。此外android操作系统的ashmem匿名共享内存也是基于linux内核的shmem实现。本文我们将从源码角度剖析内核shmem的设计和实现原理。

2023-08-13 17:18:43 1578 1

原创 Linux mmap系统调用视角看缺页中断

实际开发过程中经常使用或者看到mmap函数,具体细节可以man mmap查看相关细节。这个系统调用是个多面手,应用空间申请内存(比如glibc库申请大内存使用的是mmap),还是读写大文件,链接动态库,多进程间共享内存都可以看到mmap的身影,要想真正的理解这个系统一方面是从这几种使用场景的需求上理解mmap,更重要的必须基于内核源码,深入剖析其每个参数具体对应的内核实现。内存拷贝次数以mmap映射文件场景来讲,mmap读写文件与read/write的相比少一次内存拷贝。

2023-08-07 22:16:35 672

Makefile工程

模拟安卓编译系统的工程示例,相信看来这个就能够理解安卓编译系统设计的精髓

2015-08-30

jd-gui windows

非常小巧方便的java反编译工具

2015-08-18

反编译结果

framework.jar中反编译出来的XXX.class文件,对于理解framework.jar很有帮助

2015-08-18

dex2jar反编译工具

dex2jar是一款很小巧的反编译工具,可以讲.dex反编译成.class

2015-08-18

HAL层模块代码

Android增加HAL模块对应的文件,相信读者看后就可以自己为安卓系统定制HAL模块

2015-08-18

Android HAL模块源文件

Android增加HAL模块对应的文件,相信读者看后就可以自己为安卓系统定制HAL模块

2015-08-18

就与CUI的聊天小程序

CUI聊天程序,想玩玩网络编程的可以看看喔

2010-11-30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除