《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开源代码奖。
788 0
|
7月前
|
缓存 网络协议 Unix
Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用
174 0
|
7月前
|
Unix Shell Linux
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
在Unix/Linux操作系统中,Shell脚本广泛用于自动化任务
71 2
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
4月前
|
Unix Linux 程序员
Unix:Linux的“逗趣祖师爷”与它的不凡传承
在科技长河中,Unix犹如一颗恒星,既是历史见证者也是未来的启发者。1969年,因程序员肯·汤普森想在他的PDP-7上玩“Space Travel”游戏,意外创造了Unix,以简洁优雅的代码改变了操作系统的世界。进入90年代,林纳斯·托瓦兹受Unix启发,开发了开源免费的Linux,像是Unix调皮的孙子,不仅继承其精髓还增添了开放共享的精神。Unix与Linux之间的传承,就像是智者与追蝶孩童的故事,充满了岁月的智慧与新生的活力,提醒我们科技传奇往往源于不起眼的小事。下次使用Linux时,不妨会心一笑吧!
55 0
|
4月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
56 0
|
7月前
|
Unix Shell Linux
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
在Linux和类Unix系统中,Shell提供了多种命令用于用户和权限管理
77 4
|
7月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
122 1