kmalloc 详解

 使用 kmalloc() 函数时,可分配的大小为 32 x PAGE_SIZE 。大多数系统中 PAGE_SIZE 的大小为 4096,因此超过 131072 字节就不能分配内存。

 flag 参数表示指定分配内存的特性,它的值可为以下几个:

 (1) GFP_KERNEL kmalloc() 函数中使用的代表性参数,请求动态内存总是分配成功。利用该值使用 kmalloc() 函数时,若内核中的内存不足 ( 剩余内存小于 min_free_pages ),设备 驱动程序调用的进程将被停止运行, 直到动态内存可以分配。 当其他进程释放内存, 达到可分配动态内存时,才能使程序重新启动。kmalloc() 函数分配到必要的内存, 并返回相应内存的起始地址。因此,在中断服务上使用 kmalloc() 函数不能利用该 参数!

(2) GFP_ATOMIC 内核存在可分配的内存时,无条件分配内存,若没有就立即释放 NULL ,因此, 进程不会进入睡眠状态,但是便成时可能无法分配内存。

(3) GFP_DMA 用于分配连续的物理内存。设备驱动程序运行的内存空间不是物理内存而是虚拟地 址内存,从进程的角度查看分配的内存,虚拟地址空间是连续的,而实际物理空间 是不连续的。 DMA 控制器无法使用不连续的物理空间, 此时就可以使用 GFP_MDA 标志。

 

在设备驱动程序中动态开辟内存,不是用 malloc,而是 kmalloc,或者用 get_free_pages 直接申请页。释放内存用的是 kfree,或 free_pages.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值