kmalloc 相关资料总结

kmalloc是Linux内核中用于动态分配内存的函数,主要在设备驱动和内核中使用。它返回虚拟地址,分配的内存物理上连续,适用于DMA。kmalloc分配的最大内存为128KB,并且其分配的内存块大小基于体系结构,通常最小为32或64字节。函数原型为(void*) kmalloc(size_t size, int flags),其中flags参数决定了内存分配行为。内存分配时,内核基于slab机制,并且分配的内存不需要通过页表转换物理地址。" 104683321,8670171,使用Python venv搭建Flask开发环境,"['Python', 'Flask', 'web开发', '环境配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LINUX KERNEL “kmalloc”

1.     函数原型

void * kmalloc (size_t size, int flags);

存在于<linux/slab.h>中。

2.     函数简要说明

Kmalloc提供了再设备驱动程序或者内核中动态分配内存的方式,kmalloc函数返回的是虚拟地址(线性地址),分配的内存在物理上是连续的,这对于要进行DMA的设备十分                                           真实的物理地址只有一个固定的偏移,因此存在比较简单的转换关系。Kmalloc最多只能分配32*PAGE_SIZE大小的内存,一般PAGE_SIZE=4KB,也就是128KB大小的内存,这128KB的内存还要有16个字节用来页面描述结构。

3.     参数说明

2.1参数含义

size: 需要分配的内存字节数

flags: 分配内存的类型

2.2参数描述

size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。

size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。size_t的设计就是为了适应多个平台的,增加程序在不同平台上的可移植性。

 

kmalloc的flags参数决定了要分配的内存的类型,kmalloc提供了多种内存分配行为,使用flags标志,可以控制kmalloc的行为。

所有的flags都定义在 <linux/gfp.h>中。

下表给出针对不同的flags的不同含义:

flags

含义(说明,使用情况)

GFP_KERNEL

1.       最常用的flag,代表一个在内核空间运行的线程进行调用,只能在进程内核空间调用,就是说函数是代表一个进程在执行一个系统调用,如果内存不足则当前进行会进行睡眠。

2.       只能在用户进程上下文中使用,是最可靠的内存分配方式。

3.       并不是总是正确的内存分配方式,如果在进程上下文之外调用kmalloc则会出错。

4.       允许在分配内存时如果内存不足进行睡眠进行等待,因此这时分配函数必须是可以重入的。

5.       如果在处理进程上线文之外的请求,例如中断处理、tasklet以及内核时钟等,则不允许睡眠等待内存,应使用GFP_ATOMIC

GFP_ATOMIC

1.       用来从中断处理和进程上下文之外的其他代码中分配内存. 从不睡眠.

2.       能够实现分配即使是最后一个空闲页,如果最后的页都不是空闲页,则分配失败。

3.       没有GFP_KERNEL分配内存可靠,应该有良好的内存溢出处理策略。

GFP_USER

1.       用来为用户空间页来分配内存。

2.       可能睡眠。

GFP_HIGHUSER

1.       GFP_USER,如果存在高端内存则进行分配高端内存。

GFP_NOIO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值