Linux内核开发中的内存申请常用API
- Kmalloc()/Kfree()
- Vmalloc()/Vfree()
- Kzalloc()/Kfree()
- ioremap()
这几个API在Linux内核/linux驱动初级开发中用的比较多,他们虽然都是内核中的内存申请函数API,却也用在不同的情况下,有着各自使用的场景。
1. Kmalloc()与 Kfree()
特点:
分配的内存,其物理地址连续;
1. 1 Kmalloc
The function is declared in <linux/slab.h>:
void * kmalloc(size_t size, int flags)
举例:
struct dog *ptr;
ptr = kmalloc(sizeof(struct dog), GFP_KERNEL);
if (!ptr)
/* handle error ... */
返回值:
成功返回一个虚拟地址(实际返回的申请区域的Kmalloc_size>=你需要的request_size)
失败返回NULL,所有需要检查返回值
1.2 Kfree()
The other end of kmalloc() is kfree(), which is declared in <linux/slab.h>:
void kfree(const void *ptr)
举例:
char *buf;
buf = kmalloc(BUF_SIZE, GFP_ATOMIC);
if (!buf)
/* error allocting memory ! */
Later, when you no longer need the memory, do not forget to free it:
kfree(buf);
2. Vmalloc() 与 Vfree()
特点:
分配的内存,其虚拟的地址连续,但物理地址却不连续
2. 1 Vmalloc
The vmalloc() function is declared in <linux/vmalloc.h> and defined inmm/vmalloc.c.
Usage is identical to user-space's malloc():
void * vmalloc(unsigned long size)