Memory management 虚拟连续地址和散点聚集

Memory management 虚拟连续地址和散点聚集,memory-management,linux-kernel,linux-device-driver,embedded-linux,dma,Memory Management,Linux Kernel,Linux Device Driver,Embedded Linux,Dma,我对内存寻址和分散(sg)列表有疑问,请有人帮我解决以下问题: 问题1: 如果页面大小为4096,那么让我们假设如下场景 page0---0-3096字节使用,1000字节空闲 page1---使用0-3096字节,可用1000字节 page2---0-3096字节使用,1000字节空闲 pageN---0-3096字节使用,1000字节空闲 因此,如果我请求1010的内存可能使用malloc,它会失败吗,因为页面中没有一个超过1000字节,或者它是通过从多个页面(如page0(1000字节)+

我对内存寻址和分散(sg)列表有疑问,请有人帮我解决以下问题:

问题1: 如果页面大小为4096,那么让我们假设如下场景

page0---0-3096字节使用,1000字节空闲 page1---使用0-3096字节,可用1000字节 page2---0-3096字节使用,1000字节空闲 pageN---0-3096字节使用,1000字节空闲

因此,如果我请求1010的内存可能使用malloc,它会失败吗,因为页面中没有一个超过1000字节,或者它是通过从多个页面(如page0(1000字节)+page1(10)字节)收集(累计)内存来分配内存的

问题2: 如果页面大小为4096,那么对于给定的页面,从0-4096开始的虚拟地址保证物理上是连续的

三: 如果我在散点列表中得到一个页面大小(1996年5月4日)内的数据,这是否意味着它实际上没有分散在物理内存中,因为它小于或等于(TL;dr:这取决于

linux内核中有几个内存分配接口,它们具有不同的属性

一个这样的接口是
kmalloc
,它返回物理上连续的内存(另请参见此答案:)

还有
vmalloc
,它返回可以扩展到多个非物理连续页面的虚拟连续内存

还有许多其他内存分配变体,允许您分配小块内存供自己使用,或分配代表用户进程使用的大块内存,或分配多个页面供DMA进出设备使用,或分配这些的组合

对于您的其他问题,IIUC,根据定义,单个页面中的内存始终是物理连续的。(例如,如果页面大小为4096[0x1000],您分配0x100字节,并返回一个低位0xb00的地址,则它不可能是物理连续的。)对于可能跨越页面边界的分配(即
开始地址和页面掩码!=结束地址和页面掩码)
,这取决于您使用的分配接口

分散聚集是一个通用概念,它描述了与多个物理上不连续的区域之间的I/O。这可以是内核内部的(即,
struct scatterlist
专门用于管理多部分非物理上连续的内存),也可能是指用于支持
readv
/
writev
iovec
。在后一种情况下,用户有权请求一个分散-聚集操作,该操作的一个区域从XXXXX 004开始,长度为10字节,另一个区域从YYYY 300开始,长度为20字节。XXXXX和YYYYYY可能相同,也可能不同。如果它们是相同的,那么是的,您可以确保它们位于同一物理页面内(同样,如果两种长度都不跨越页面边界)

如果
malloc
实际上指的是用户空间库函数,那么只能假设该内存在物理上是连续的,其长度不跨越页面边界(事实上,它可以随时更改--内核可以随时窃取页面,将其内容写入页面空间[“交换”分区),然后在其位置恢复不同的物理页,从分页空间读回内容,而进程不知道它)