第二部分 申请函数 内核申请内存的函数有3个 1.alloc_pages()返回的是page的指针,故支持高端内存. 2.__get_free_pages() 返回的是线性地址,故只用于低端内存. 3.kmalloc()以字节为单位,内部也是调用了__get_free_pages(), 故也只支持低端内存.注意的是可能分配的内存比请求地多, 因为它是用的slab实现的. 分配器标志有3类:行为/区/类型修饰符. 1.行为描述符,比如__GFP_WAIT标识可以睡眠.(GFP就是get free page的缩写) 2.区描述符, __GFP_DMA标志标识仅从ZONE_DMA区中申请. __GFP_HIGHMEM标志标识从ZONE_HIGHMEM(优先)或ZONE_NORMAL中申请. 不指定标志表示从ZONE_NORMAL或ZONE_DMA中申请. 对于__GFP_HIGHMEM标志,其实只能用于alloc_pages(),因为仅它支持高端内存. 3.类型是前2个的组合. kmalloc()中使用的GFP_KERNEL,可以睡眠,只从低端内存中申请. 故只能用在进程上下文中. 而kmalloc()中使用的GFP_ATOMIC,不能睡眠,只从低端申请. 在不能睡眠时(中断/软中断/tasklet),只能用此标志. 可见kmalloc()只从低端申请. GFP_DMA标志,表示只能从ZONE_DMA中申请,用于设备驱动程序中. 附: GFP_ATOMIC的含义 The allocation is high priority and must not sleep. This is the flag to use in interrupt handlers, in bottom halves, while holding a spinlock, and in other situations where you cannot sleep GFP_KERNEL的含义 This is a normal allocation and might block. This is the flag to use in process context code when it is safe to sleep. The kernel will do whatever it has to in order to obtain the memory requested by the caller. This flag should be your first choice.