Posts Tagged ‘kmallo’

Linux的那些内存操作的函数 – 总揽

ioremap

From the source code, below comment is found.

* ioremap takes a PCI memory address, as specified in
* Documentation/IO-mapping.txt.

将高位物理内存映射到内核虚地址空间,这些高位内存的位置多为外设如PCI设备,或者大内存高位部分,经过ioremap后就可以访问它们。

kmalloc

kmalloc函数返回的是虚拟地址(线性地址). kmalloc特殊之处在于它分配的内存是物理上连续的, 这对于要进行DMA的设备十分重要.

kzalloc

/**
* kzalloc - allocate memory. The memory is set to zero.
* @size: how many bytes of memory are required.
* @flags: the type of memory to allocate (see kmalloc).
*/
static inline void *kzalloc(size_t size, gfp_t flags)
{
	return kmalloc(size, flags | __GFP_ZERO);
}

kzalloc实现了kmalloc并初始化为0

vmalloc

而用vmalloc分配的内存只是线性地址连续, 物理地址不一定连续, 不能直接用于DMA.

mmap

这个是用户态函数mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址,对文件的读写可以直接用指针来做而不需要read/write函数。

#include <sys/mman.h>

extern void *mmap (void *__addr, size_t __len, int __prot, int __flags, int __fd, __off_t __offset) __THROW;

该函数各参数的作用图示如下:

Advertisements
%d bloggers like this: