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