《unix设备驱动》内存分配

简介:

这里只简单介绍一下内核中提供的一些内存管理接口,方便内核开发入门人员对内存管理有一个大致的了解,也方便自己以后复习

 

Kmalloc

 

分配的区域在物理内存中式连续的

函数原型:void * kmalloc(size_t size ,int flags)不同的标志可以以不同的方式控制kmalloc的行为

比如是内核内存的分配还是用户空间内存分配,分配过程中是否可以休眠等等

 

内核把内存分为三个区段:

可用于DMA的内存

常规内存

高端内存

 

物理内存只能按照页面进行分配

只能分配一些预定义的,固定大小的字节数组

后备高速缓存

为某些反复使用的块增加某些特俗的内存池

设备程序一般不会涉及使用后备高速缓存,除了USB和SCSI

 

可以通过


kmem_cache_t*kmem_cache_create(const char*name,size_t size,
     size_t offset,
     unsigned long flags,
     void(*constructor)(void*,kmem_cache_t*,
     unsigned long flags),
     void(*destructor)(void*,kmem_cache_t*,
     unsigned long flags));
 

分配,创建一个高速缓存对象,其中可以容纳任意数目的内存区域

 

Scull 与scullc :不同在于scull使用kmalloc scullc 使用的是高速缓存

Scullc运行速度略有提高,对内存的利用率更佳

 

内存池:是某种形式的后备高速缓存

尽力保证内存的分配不失败

试图始终保存空闲的内存,以便紧急状态下使用

可以用mempool_t *mempool_creat(……);函数创建

 

get_free_page

需要分配大的内存时


get_zeroed_page(unsigned int flags);

Returns a pointer to a new page and fills the page with zeros.


__get_free_page(unsigned int flags);


Similar to get_zeroed_page,but doesn’t clear the page.


__get_free_pages(unsigned int flags,unsigned int order);

Allocates and returns a pointer to the first byte of a memory area that is poten-

tially several(physically contiguous)pages long but doesn’t zero the area.

 

Scullp也是一个缩减的scull,不同之处在于分配内存是以页的方式

 

Vmalloc

 

物理空间不连续

虚拟地址连续

不建议使用

Kmalloc和__get_free_pages返回的也是虚拟地址,也经过MMU处理,区别在于如何执行分配的任务上Vmalloc每次需要通过对页表的适当设置来建立虚拟内存区域

 

Scullv

 

Per-CPU

建立一个per-cpu变量后系统中的每个处理器会拥有一个副本

优点:几乎不需要锁定

典型应用:网络子系统:计算数据包系统

 

获取大的缓冲区

在引导时分配是获得大量连续内存页面的唯一方法

跳过了内核的内存管理

模块不能在引导时分配内存

只有连接到内核的设备驱动程序才可以在引导时分配内存

内核被引导时可以访问所有的物理内存


#include<linux/bootmem.h>

void*alloc_bootmem(unsigned long size);

void*alloc_bootmem_low(unsigned long size);//低端内存

void*alloc_bootmem_pages(unsigned long size);//分配整页

void*alloc_bootmem_low_pages(unsigned long size);

目录
相关文章
|
Unix
Unix下c程序内存泄露检测工具
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。 Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖。
780 0
|
4月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
153 0
|
4月前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
57 2
|
1月前
|
Unix Linux 程序员
Unix:Linux的“逗趣祖师爷”与它的不凡传承
在科技长河中,Unix犹如一颗恒星,既是历史见证者也是未来的启发者。1969年,因程序员肯·汤普森想在他的PDP-7上玩“Space Travel”游戏,意外创造了Unix,以简洁优雅的代码改变了操作系统的世界。进入90年代,林纳斯·托瓦兹受Unix启发,开发了开源免费的Linux,像是Unix调皮的孙子,不仅继承其精髓还增添了开放共享的精神。Unix与Linux之间的传承,就像是智者与追蝶孩童的故事,充满了岁月的智慧与新生的活力,提醒我们科技传奇往往源于不起眼的小事。下次使用Linux时,不妨会心一笑吧!
37 0
|
1月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
35 0
|
4月前
|
Unix Shell Linux
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
70 4
|
4月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
49 1