
内存管理
文章平均质量分 90
papaofdoudou
我的藏经阁,用数学解释问题,用编程解决问题
展开
-
Corundum FPGA 网卡项目驱动分析
corundum是一款基于FPGA的100G以太网卡解决方案,corundum方案中的所有源码,包括verilog,linux网络驱动程序都是开源的。原创 2024-09-25 08:47:29 · 729 阅读 · 0 评论 -
NVIDIA-CUDA HPC 编程模型与内存管理初探
主存和现存在PCIE框架下可以做到互相访问,路径归纳如下:三种角色,两种存储,六种路径。1.HBM通过BAR透给了HOST,使HOST可以通过MMU给CPU访问,或者通过IOMMU给设备访问。2.相反,Host Memory并没有类似的BAR机制透给 PCIE设备端,PCIE设备端想要访问 HOST MEMORY必须经过 HOST IOMMU的映射一遍,加上PCIE端的SMMU映射,对于PCIE设备端(GPU)来说,要经过两层IOMMU翻译。所以从HOST端和GPU端看起来不太对称。原创 2021-11-12 19:37:56 · 3386 阅读 · 0 评论 -
ubuntu18.04下pass-through直通PCIe设备到qemu-kvm虚拟机实践
设备直通是一种虚拟化资源分配方式,通过将物理设备直通给虚拟机环境,达到使虚拟机可以直接访问物理设备的目的,直通功能对设备的要求不高,不需要设备支持SR-IOV PF/VF,目前市面上的显卡/网卡一般都支持直通。直通典型场景比如主机上有两块显卡,可以一块分配给主机用,另一块给虚拟机用,主板有集成显卡的可以采用将集成显卡给宿主机,PCIe的独立显卡给虚拟机用。原创 2023-05-07 10:50:18 · 3066 阅读 · 0 评论 -
LINUX系统CFS调度模型实现思考和仿真
采用绝对优先级没有记忆性,过去的运行记录不会影响当前时刻的调度决策,所以高优先级的线程有绝对优先权。而CFS调度器是有记忆性的,过去的运行记录会体现在线程整体的运行进度中,从而影响当前的调度决策。原创 2024-04-05 00:26:38 · 1173 阅读 · 0 评论 -
QEMU&KVM 虚拟机实例demo以及RISCV/x86上KVM的实现分析
KVM通过一组IOCTL向用户空间导出接口,这些接口能够用于虚拟机的创建,虚拟机内存的设置,虚拟机VCPU的创建与运行等,按照接口所使用的文件描述符不同,KVM的这组IOCTL接口可以分为三类:0./dev/kvm节点对应全局kvmfd, 通过kvmfd创建每个虚拟机对应的vmfd, 再由vmfd为每个虚拟VCPU创建一个vcpufd,vcpufd通过vmfd暴露的接口获取。KVM全局管理用kvmfd,虚拟机管理用vmfd, vcpu运行用vcpufd. 内核对应三套chrdev的fops.原创 2022-05-02 10:36:06 · 3000 阅读 · 1 评论 -
Cache架构以及X86&ARM @Linux平台cache eviction功能测试
如果TLB失中,Page Table Walk(PTW)电路不走Cache,直接从物理内存中查找页表。一个8路组相联的高速缓存的结构示意图:组中有路,路中有组,一路中的行数等于组数,一组中的行数等于路数,缓存行是最小寻址单元。原创 2023-03-11 16:06:01 · 973 阅读 · 0 评论 -
ARM嵌入式实时系统(RTOS) 中通过页表关闭DCACHE的方法
现在的嵌入式实时系统规模越来越大,很多在linux中使用的特性,例如虚拟内存管理,动态加载等功能也加入进来,进一步增加了RTOS开发的难度.在应用开发中,和cache相关的同步问题有两个,一个是flush操作,另一个是invalidate操作,有时候为了确认问题是否和cache同步有关,需要关闭dcache来验证.这里介绍一种经过验证过的通过页表项关闭DCACHE的实践。原创 2021-05-09 15:09:21 · 1127 阅读 · 1 评论 -
KSM Demo 分析
KSM是“Kernel SamePage Merging ”的缩写,中文可称为“内核同页合并 ”。它是一种节省内存的技术,从2.6.32版开始获得支持,内核需要打开CONFIG_KSM=y选项使用KSM机制。KSM允许内核在两个或多个进程(包括虚拟客户机)之间共享完全相同的内存页。KSM让内核扫描检查 正在运行中的程序 并比较它们的内存 ,如果发现它们有完全相同的内存区域或内存页 ,就将多个相同的内存合并为一个单一的内存页,并将其标识为“写时复制 ”。这样可以起到节省系统内存使用量的作用。原创 2023-12-28 23:58:09 · 992 阅读 · 0 评论 -
CCM&Cache的异同
CCM是Closely coupled memories的缩写,中文名称是紧耦合存储器,哈佛架构下,一般有两种CCM,分别是ICCM和DCCM, ICCM主要用来存储指令和数据,DCCM仅用来存储数据。一般中低端MCU没有提供多级Cache,兼之指令和数据规模较小,会配备CCM存储器,多用于高可靠,高世实时场合。而高性能AP级处理器一般提供了多级CACHE减少存储访问的Latency,不采用CCM的方式。原创 2023-12-24 19:55:34 · 2341 阅读 · 0 评论 -
ubuntu18.04编译webkitgtk
可以发现在安装倚赖的过程中安装了libavcodec-dev,所以很可能Webkitgtk利用了FFMPEG作为底层解码框架。安装,执行ninja install。格式化交换空间为交换分区格式。首先关闭所有交换空间,执行。内存不够的问题最终解决。创建一个8G的交换文件。执行启动所有交换分区。原创 2021-04-28 22:15:59 · 1835 阅读 · 2 评论 -
Linux系统交换(swap)机制实现原理以及OOM测试
综上,可以swap出去的页面包含匿名页和共享页,除此之外,不支持swap到磁盘交换分区或者swap文件。所以可以看出,对于内存回收来说,文件cache的回收和匿名页面的回收是同一个路径,没有区别,只有到具体的承载后台时候,这也是为何开始一致寻找swap处理的“特殊路径”求而不得的原因,原因就是这个特殊路径不存在,swap处理也没有什么特殊的,"特殊"的部分仅仅是swap_aops的实现,这部分一开始我就找到了。匿名页面是如何来的?原创 2021-07-20 23:27:55 · 2459 阅读 · 1 评论 -
Linux内核地址空间随机化ASLR的几种实现方法
ASLR(Address Space Layout Randomization)在2005年被引入到Linux内核kernel 2.6.12中。地址空间随机化在内核中有多种实现和表现方式,下面分别介绍。原创 2022-02-01 23:28:57 · 5302 阅读 · 0 评论 -
X86 SMAP(Supervisor Mode Access Prevention)机制引入的内核态访问用户态地址空间的问题分析
所以,内核直接访问用户态指针导致报告page fault错误的原因是直接访问用户态内存触发了SMAP保护,内核提供了配置和API接口关闭这种保护,而本文开头提到的几个宏定义能够安全将访问用户态内存的原因,也是由于在访问器件,关闭了SMAP保护。从普遍意义的角度来讲,内核态访问用户态地址空间是没有任何问题的,只是需要注意不同的架构下实现上会有微小差别,至少目前,没有看到其它架构有类似SMAP机制的实现。原创 2023-10-28 20:15:21 · 864 阅读 · 0 评论 -
64/32位Linux系统的差异(地址空间布局,系统调用)对比分析
映射地址:可以看到,对应的地址0x7fd9b8c00000是PSE页,映射了10M,是PMD级的大页映射,也就是2M页面的映射。连续影射了5个PMD大页。这些大页的分配是在mmap后,执行memset(addr, 0x5a, ...)时通过page fault流程进行分配的,对应执行hugetlb_fault的执行流程。原创 2023-05-09 22:41:27 · 2303 阅读 · 0 评论 -
Linux系统用户态根据虚拟地址获取物理地址的方式
之前做项目的时候,也会遇到过根据页表,由虚拟地址翻译物理地址的需求,一般的做法是HACK内核,在内核中加入HACK代码,思路无非就是通过页表进行转换,但是现在有了一种新的方式,这种方式下,不需要HACK内核,也不需要重新编译内核,便能够根据进程的虚拟地址,得到它的物理地址,下面展开介绍。原创 2021-08-09 20:10:01 · 4298 阅读 · 0 评论 -
一种多媒体框架中的零拷贝实现机制
BUFFER管理是多媒体框架设计实现中的核心任务,在常见的多媒体框架,比如FFMPEG,GST等中,BUFFER管理的代码实现都是复杂且代码量非常大的部分。从某种意义上说,多媒体应用的核心在于BUFFER管理,一个高效易用的BUFFER管理框架不但可以提供友好的开发模型,而且还可以最大限度的挖掘VPU的计算能力,提高多媒体应用的效率。为什么可以通过零拷贝来优化多媒体框架?原创 2022-08-13 15:40:59 · 962 阅读 · 1 评论 -
关于内存颗粒的地址映射
通常情况下,在一种硬件体系结构下,一个存储单元只有一个物理地址,但是如果系统设计时兼容了多套寻址方式,则可能存在同一个存储单元存在多个物理地址的情况,将地址类型编码到地址中,硬件会根据编码后的物理地址驱动合适的地址翻译电路寻址到正确的存储单元。原创 2023-06-29 20:43:24 · 1181 阅读 · 0 评论 -
page cache和buffer cache之间的关系以及验证
Linux系统存在两种缓存机制,分别是Page Cache和Buffer Cache, 其中Page Cache缓存文件的页以优化文件IO。Buffer Cache缓存块设备的块以优化块设备IO。原创 2021-07-25 09:45:48 · 1890 阅读 · 1 评论 -
Linux Buddy算法&系统分析
例如,LINUX内核设置的MAX_ORDER为11,最大有效取值为10.所以 pfn的低10位为0,也就是PFN必须按1<<10=1024对齐,LINUX页大小为4K,也就是说,硬件设计的时候,只要保证物理地址被映射到4M对齐的地址即可满足BUDDY算法管理的要求。找到一个Buddy头,然后被查询的PAGE在这个buddy 头cover的orer个PAGE中,则这个PAGE是FREE的,如果找不到这样的buddy头,则是已经分配出去,没有在buddy中的PAGE。原创 2023-05-16 07:37:33 · 503 阅读 · 0 评论 -
关于Linux ION和Melis3.0系统中物理地址分配的异同分析
问题描述:VPU做缩略图编码的应用中,同样一份jpeg编码库,在Linux中编码出来的缩略图没有问题,但是用Melis系统编码出来的缩略图,顶部有黑线和横杠。Melis编码效果如下图所示:Linux Tina编码出的图像却是这个样子的:Linux可能是白平衡没有做好,色调偏红,这里忽略色调问题,单纯看这个黑线和横杠的问题。解决方案:通过分析,在melis系统上关闭dcache(关闭arm dcache的方法有两种,一种是直接关闭系统控制寄存器SCTLR.M位,另一种是通过页表关闭,原创 2021-05-12 21:22:22 · 650 阅读 · 0 评论 -
利用procrank进行内存使用统计分析
2. 编译,执行make3: 使用, sudo ./procrank4.procrank确定内核分配的地址空间,修改内核测试模块,增加分配4M内存的操作。运行测试用例,然后在运行procrank.之后,加载模块,修改用例,增加对设备节点的打开访问, 重新运行用户太用例:确实打印了出来:可以看到,调用了open后,内核4M内存成功分配了出来,此时运行procrank的结果是:并没有明显变化。原创 2021-07-29 17:10:13 · 2243 阅读 · 0 评论 -
Linux系统位运算&原子操作函数以及相应CPU ISA实现
以32位数据的二进制表示为例,习惯的写法是LSB在右,MSB在左,注意BIT序和大小端的字节序没有关系。Linux和BIT操作有关的接口在定义在头文件bitops.h中,bitops.h定义有两层,通用层和架构层,对应两个bitops.h,通用层的定义在./include/linux/bitops.h中,架构层和处理器类型有关,定义在./arch/$ARCH/include/asm/bitops.h中。原创 2023-02-10 20:59:20 · 1196 阅读 · 0 评论 -
Linux内存管理Tips
1.proc文件系统中两个非常有用的节点/proc/kpagecount 描述的是struct page中 _mpagecount成员的大小./proc/kpageflags描述的是对应page的属性,注意是page->flag,不是页表pte flag.原创 2021-08-09 19:24:21 · 580 阅读 · 0 评论 -
Linux&Tina&Melis内存布局分析以及linux reserved memory机制
memoryblock.memory, memoryblock.reserved(without no-map)和 memoryblock.reserved with no-map 的关系如下:为了测试memory reserved机制,我们修改devicetree,新增加两个属性分别为without no-map和 with no-map的reserved区域。原创 2021-11-20 18:45:27 · 701 阅读 · 1 评论 -
mprotect/mlock使用demo
mlock起作用的过程分为两步,第一步,对于已经存在的VMA,将会调用mm_populate将其手动建立物理页面的映射。而对于未来分配的物理页面,则将会调用apply_mlockall_flags设置VM_LOCKED标志,设置此标志后,将来的MMAP函数将会调用__mm_populate分配页面。这样,在加入LRU的逻辑中,判断PageMlocked为真,将会把页面加入LRU_UNEVICTABLE list.所以,最终MLOCKD的效果显示在/proc/meminfo的unenvicible字段。原创 2021-10-14 12:37:29 · 272 阅读 · 0 评论 -
基于Linux sharememory的一种多进程生产者消费者工作模式实现
1.Server端(生产者端)#include <sys/msg.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/ipc.h>#include <stdio.h>#include <stdlib.h>#include "ringbuffer.h"union semun{ int val; //信号量初始值 struct semid_d原创 2021-06-14 10:09:52 · 299 阅读 · 1 评论 -
libnuma详解-A NUMA API for LINUX-Affinity Binding
CPU 0和CPU 1表示物理处理器包,而不是单个核心,并且作为内存模块的相应数量的NUMA内存节点被部署在对应的处理器的相邻的DIMM卡槽中。每个物理处理器包都有两个NUMA节点。图4说明了NUMA节点局部性的介绍(其中NUMA节点被认为是给定核心的本地节点)。在本例中,对于物理处理器CPU 0中的core 0,紧挨着该处理器socket的内存被认为是本地NUMA节点。对于core 1,它是物理处理器CPU 1的一部分,被认为是本地的NUMA节点是挂在CPU 1上的节点。原创 2022-10-25 22:14:00 · 1768 阅读 · 0 评论 -
处理器从单核到多核的演化过程&NUMA&UMA
NUMA体系结构:系统中多个内存结点和多个CPU簇,CPU访问本地内存节点的速度最快,访问远端内存结点的速度要慢一点,如下图所示,该系统有三个内存节点,其中CPU0,CPU1组成一个节点node0,他们可以通过系统总线访问本地DDR物理内存,同理,CPU2和CPU3,以及CPU4和CPU5分别构成了Node1和Node2,它们也可以通过系统总线访问本地内存,如果通过UPI或者QPI总线连接,那么CPU0可以通过这条内部总线访问远端的内存节点的物理内存。,每个核簇共享2MB的L2缓存。原创 2020-12-10 10:27:07 · 1454 阅读 · 0 评论 -
linux4.15 arm qemu @ubuntu18.04环境搭建与bootgraph启动优化
本环境对内核和BUSYBOX的版本要求并不严格,只要是同一个时期的内核和Busybox,都不会有太大问题,比如下面用的busybox-1.35.0.tar.bz2搭配linux-5.15.90.tar.xz也是可以的。原创 2022-04-26 20:44:56 · 2993 阅读 · 0 评论 -
kswapd线程的前世今生
为了避免在CPU忙碌的时候,也就是在缺页异常发生的时候,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统的空闲页面数量是否小于预定义的极限,一旦发现空闲页面数太少,就预先将若干页面换出,以减轻缺页异常发生时系统所承受的负担,当然,由于无法确切地预测页面的使用,即使这样做了也还可能出现缺页异常发生时内存依然没有足够的空闲页面。但是,预换出毕竟能减少空闲页面不够用的利率。原创 2021-08-24 19:54:22 · 510 阅读 · 1 评论 -
Linux 内核pdflush实现的变迁
内核使用pdflush线程刷新脏页到磁盘,pdflush线程是内核在初始化的时候创建的,不过,pdflush在内核中的实现并不是一直是这样的,它经历了几次变化,我们来回顾一下:1.第一次,linux-2.6.32之前的版本实现:以linux-2.6.30版本的内核为例,pdflush线程的初始化在pdflush.c文件中,完整路径是linux-stable/mm/pdflush.c。我们截取它的实现:可见,在2.6.32之前的版本中,pdflush线程是在内核启动阶段,执行init构造函数的原创 2021-07-22 20:21:25 · 799 阅读 · 1 评论 -
Linux块设备读写测试-page cache/buffer cache
一个O_DIRECT读写用例堆栈:用普通方式带有page cache(非DIRECT模式)操作文件的调用堆栈。原创 2021-07-23 23:16:57 · 998 阅读 · 1 评论 -
Linux MemFree与MemAvailable的区别
Linux查看内存使用情况,可以查看/proc/meminfo和使用free命令。root@prometheus-01:~# cat /proc/meminfo && freeMemTotal: 16433020 kBMemFree: 14714596 kBMemAvailable: 15812952 kBBuffers: 197912 kBCached: 1020632 kBSwapCached:转载 2021-09-03 16:36:38 · 3058 阅读 · 1 评论 -
嵌入式和服务器Linux系统下free -m Memory统计信息解析(VSS/RSS/PSS/USS)
由于MAP_SHARED FLAG的匿名页面,用的vm_ops是shmem_vm_ops,其PAGE FAULT中是从SHMEM分配页面的,其调用路径上的关键函数shmem_add_to_page_cache:将分配的页面增加到了NR_FILE_PAGES和NR_SHMEM上面:所以可以得到,SHARED的确实是BUFF/CACHE的一部分,不是USED的一部分,最早的说法更对。原创 2021-08-07 20:17:44 · 1490 阅读 · 0 评论 -
Cuda异步计算并行编程原理和存储管理
优化时遵守的一些原则:1.Grid一定要给足block.2.Block内一定要给足thread,目的是提高并发WARP的数目,隐藏延迟.3.Block内线程的数目一定是warpsize的整数倍.每个warp的执行上下文(execution context,如程序计数器 和 寄存器等)在warp的整个生命周期内都被保存在片上内存(on-chip memory)。因此从一个执行上下文切换到另一个执行上下文是无开销的。原创 2022-12-17 07:49:21 · 2228 阅读 · 0 评论 -
A share buffer infrastructure In Linux kernel through ION
ION是一种Linux内核中管理共享内存的机制,最初由Google开发,用于Android系统中的图形渲染和多媒体应用。the principle diagram,exporter process 输出FD,给另外两个进程作映射。原创 2022-12-13 23:38:48 · 464 阅读 · 0 评论 -
Linux系统 mmap 存储映射
括号中表示预期行为,括号外部的表示在LINUX系统中的实际行为,比如组合SHARED/EXEC的读行为,对于一个可执行的共享地址来说,没有给与PROT_READ属性,预期当然不可读,但是由于CPU执行上面的代码,必须要进行读操作,而实际的硬件架构和及并没有区分执行读和其它方式的读,所以,实际上对于这样的内存,仍然是可读的。从上图中可以看到,这段匿名区域(可能是MMAP区域,现在的MALLOC都用MMAP实现)地址是向下增长的,像栈一样,就像前面提到的第二种情况,这是在哪里控制的呢?原创 2022-04-23 12:43:23 · 1944 阅读 · 0 评论