<背景>
内存会以分页方式组织内存,而且每页大小和计算机体系结构有关系,Linux中每个页都有对应的struct page{}
与之对应。
![技术分享图片](https://note.wiz.cn/wiz-resource/0dc33ff3-e3a9-4ae7-94fd-056b02b950c7/47ab9a58-22b9-4a9c-a417-824e20c647c8/index_files/4c9c28b2-52ae-44ae-8739-8263a559ac15.jpg)
<分配连续的内存>
a:void *kmalloc(int count,int flags)函数用于从zone_normal区域返回连续内存的分配的地址。
参数分析:
count:分配内存的大小
flags:分配内存的方式
GPF_KERNEL:进程上下文用来分配内存,内存不够时会导致进程睡眠。
GPF_ATOMIC:中断上下文用来分配内存,不会导致进程睡眠,内存不足时候会返回错误。
注意:kmalloc()函数分配的内存空间会保留原来的数据,所以在内存分配成功后必须进行相应的清零操作,否则会导致意想不到的问题。
b:void *vmalloc(unsigned long count)
参数分析:
count:分配内存的大小
注意:vmalloc()常用来分配较大的内存空间,但是消耗的时间更长,并且不能再中断上下文中使用。用该函数分配的内存返回的虚拟地址是连续,但是实际的物理地址不是连续的,因此不能用来分配DM空间。