
内存管理
文章平均质量分 86
LuckY_chh
微信公众号:linux码头
展开
-
杂谈 linux DMA内存
这块物理块会记录在 cma_areas[cma_area_count] 中,然后 dma_contiguous_default_area 指向这块物理块。不同的mask,对应从不同的zone获取内存。2 dma_contiguous_default_area 没货了,则优先从dma zone获取page。最后将64为的物理地址对应到32位的dma地址,phys_attr_t转化位dma_attr_t。注意了,开始找的地方是从dma的边界往下(arm64_dma_phys_limit)。原创 2022-12-20 10:48:02 · 1147 阅读 · 0 评论 -
内核杂谈——vmalloc分配器的进化故事
从懵逼到不懵逼vmalloc机制在最近的内核中做了大改,很有意思。通过对比的角度来看看最近一次的进化史。对比版本5.0和5.4patch: commitID 68ad4a3304335358f95a417f2a2b0c909e5119c4 mm/vmalloc.c: keep track of free blocks for vmap allocation Patch series "improve vmap allocation", v3.5.1中提出的,5.2中合...原创 2021-07-07 15:02:22 · 573 阅读 · 0 评论 -
编写CMA驱动 遇到 error: dereferencing pointer to incomplete type
写了一个CMA驱动,make编译后:error: dereferencing pointer to incomplete type ‘struct cma’ cma->name, cma->base_pfn);意思是cma只是声明了。cma.h在目录include/linux/cma.h里,里面空有一句struct cma;对,这句只是做了声明,但并未做任何定义和初始化。那到底在哪定义的呢?很奇葩,在mm目录下还有一个cma.h,里面定义了cma结构体。...原创 2020-05-15 15:27:12 · 270 阅读 · 0 评论 -
内核杂谈——关于页表项大小的问题以及坑比的页表问题
页表项多大?首先需要抛开一级二级x级页表的概念。对于32位的地址空间,规定按4K一页来管理,可以分成2^32B / 4K = 2^20 个页。所以32位机器,页号范围是 0 ~ 2^20-1,这点毋庸置疑。现在要建造一样东西来管理这些页号,首先想到的就是数组,那数组每个元素定义多大才能保证覆盖所有的页号呢?最大页号2^20 - 1,十六进制 0xFFFFF,占了20位。所以数组元素囊括的数据要保证可使用到20位,也就是 0 ~ 0xFFFFF。好了,就按0xFFFFF来算吧,它占用多大?原创 2020-10-20 22:58:36 · 4704 阅读 · 17 评论 -
linux内存调节之CMA
概述CMA(Contiguous Memory Allocator)是连续内存分配技术,是 Linux Kernel 内存管理系统的扩展,目的在于解决视频播放 (特别对于 4K 视频) 等需要预留大量连续内存导致运行内存紧张的问题。CMA 框架的主要作用不是分配内存,而是解析和管理内存配置,以及作为在设备驱动程序和可插拔的分配器之间的中间组件。数据结构1 . struct cma 结构用于维护一块 CMA 区域struct cma {unsigned long bas...原创 2020-12-07 10:34:01 · 3737 阅读 · 0 评论 -
内核杂谈——只谈page,不谈ddr
整个系统只认识cpu总线的宽度,不认识物理内存ddr这些玩意,总线位数多大,系统就认为自己的怀抱有多大。linux内核分用户空间和内核空间。32bit中内核空间1G,用户空间3G。64bit,常用的内核空间512G,用户空间512G。虚拟地址中使用的内存管理单位为page,用struct page 描述。对物理地址实施的管理单位为页帧pfn。用户空间的运转离不开内核空间,可以说内核空间是幕后人,创建了用户空间运转的大部分条件。整个系统为什么分用户空间和内核空间?出于系统可以健壮运行,必须要做保护措施,于原创 2021-01-27 19:13:32 · 666 阅读 · 2 评论 -
内核杂谈——揭开linux内核连续物理内存CMA的面纱
之前追CMA代码的时候,写了一篇文章基于ARM32的linux内存调节之CMA。今天就从使用的角度来看看CMA和普通内存的区别。默认CONFIG_CMA尝试思考几个问题:CMA在未加入内存的时候,是否是存放在memblock.reserved region中?众所周知CMA是由伙伴系统管理的,何以见得?伙伴系统如何对这部分页做分配处理的?当CMA要被使用的时候,如何真正变成CMA?简要回顾下上一篇博文在设备树中 /reserved-memory 节点下定义一块reser...原创 2021-02-03 15:59:31 · 660 阅读 · 0 评论 -
内核杂谈——页表项存放的是物理地址还是虚拟地址?
目录1 ~ 3 级表项4级表项总结pgd_t当你不去细细读代码的话,这个问题可能会困扰着你。我们以ARM64四级页表为例,谈谈页表项里藏得是什么。1 ~ 3 级表项从__create_pgd_mapping函数开始看:static void __create_pgd_mapping(pgd_t *pgdir, phys_addr_t phys, unsigned long virt, phys_addr_t size, pgprot_t prot,原创 2021-02-06 14:49:18 · 6449 阅读 · 0 评论 -
内核杂谈——用户空间的页表
环境:ARM64,四级页表前言内核空间的页目录表的基地址为swapper_pg_dir,在内核初始化的时候,建立了swapper_pg_dir为基地址的页表,用于fixmap的永久映射区,获取早期的物理地址设备比如设备树等。而后面的线性映射的页表是临时的,在每级页表项映射完成的时候会清除这段映射,借助的地址是fixmap的临时映射区。这是通读内核启动代码时最直观接触到的。用户空间的页面获取一般是从缺页异常开始的,然后一步步建立页表项。关于页目录表的代码:#define pgd_in.原创 2021-02-12 22:32:33 · 1104 阅读 · 0 评论 -
内核杂谈——学内存管理
把下述的源码追几遍就ok了,基础算是扎实了。写的内容有限,但代码无限。页表建立页表建立存在于用户空间的地址和内核空间的地址。二者有着微妙的差别。内核空间页表建立内核空间的页全局目录表为swapper_pg_dir,只要是内核地址(如何区分?pgd_offset使用参数init_mm 和 mm来区别建立映射)就使用这个pgd,而且内核空间地址都统一使用这个pgd。一开始建立的时候肯定是空空的啥都没有,尤其在建立设备树的映射中连物理内存都摸不到。但办法总是有的,使用内核映像里的bm_pXd.原创 2021-03-01 11:34:10 · 193 阅读 · 0 评论 -
内核杂谈——操作系统对page的使用
目录page_to_physpage_address__get_free_pagemk_pteslab举例:vmalloc表项的建立前面谈过一篇只谈page不谈ddr,是站在操作系统的角度来看待物理内存。实际上page只是一个外衣,只是一段物理地址的代号,alloc_page出来的page也不可能往里写东西,因为page存在vmemmap中,和实际的线性映射区不搭。下面举例一些page的使用方法page_to_phys#define page_to_phys(p原创 2021-03-02 15:40:18 · 1884 阅读 · 0 评论