linux驱动的内存管理,Linux设备驱动--内存管理

MMU具有物理地址和虚拟地址转换,内存访问权限保护等功能。这使得Linux操作系统能单独为每个用户进程分配独立的内存空间并且保证用户空间不能访问内核空间的地址,为操作系统虚拟内存管理模块提供硬件基础。

Linux内存管理

在Linux操作系统中,进程的4G空间被分成两个部分----用户空间和内核空间。用户空间一般为0~3GB(即PAGE_OFFSET,在X86系统中等于0xC0000000),而剩余的3GB~4GB为内核空间。用户进程在通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。用户只有通过系统调用才能访问到内核空间。

4d50dc4e8a32e9438d7606a49d00d79c.jpg

61c5e42d2e3982e68067ba9be98a20fa.png

每个进程的用户空间都是完全独立的、互不相干的,用户进程各自有不同的页表。内核进程是由内核负责映射的,它并不会跟着用户进程改变,是固定的。内核空间的虚拟地址独立其他程序的空间。

Linux内核中的1GB的内核地址划分为物理内存映射区、虚拟内存分配区、高端页面映射区、专用页面映射区和保留区。

9b5a59680dfeb889fdfb32e97357af87.png

29ca912c03f13227128233c737cbf046.jpg

在物理区和和高端映射区之间的是虚拟内存分配区,用于vmalloc()函数,他的前部与物理区存在一个隔离带,他的后部与高端内存映射区存在一个隔离带。

内存存取

1.用户空间内存动态申请

函数为malloc,malloc( )申请的一定要free( )释放,这两个函数成对使用,否则会造成内存泄露。对于Linux内核而言,C库的malloc()函数通常通过底层的brk( )和mmap( )来实现。

2.内核空间内存动态申请

内核申请涉及到的函数主要有kmalloc( )、__get_free_page( )和vmalloc( )、kmalloc( )和__get_free_page( )(及其相关函数)申请的内存位于物理内存映射区,在物理上也是连续的,他们与真实的物理地址相差一个固定的偏移量。而vmalloc()申请的内存位于虚拟内存映射区的一块内存,这块内存在物理内存上并不一定连续,而vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。

(1)kmalloc( )

kmalloc()的第一个参数为要分配的内存块的大小,第二个参数为标志位,用于控制kmalloc()函数的行为。最常用的标志位是GFP_KERNERL,含义是在内核的虚拟空间中申请内存。kmalloc的底层依赖于__get_free_page()来实现。使用__get_free_page( )时,若暂时不能满足,则进程会睡眠。因此不能再中断上下文或者持有自旋锁的时候不能使用GFP_KERNERL标志。

在中断处理函数中,或者tasklet和定时器等非进程上下文不能阻塞时,可以使用GFP_ATOMIC标志位。用此标志申请时,若内核没有空闲,则不会等待。

使用kmalloc( )申请的内存由kfree( )释放。

(2)__get_free_page( )

此函数是Linux内核本质上的最底层用于获取空闲内存的方法。因为底层的算法以page的2的n次方来管理内存。所以最底层的实现是以页为单位。

此系列函数包含__get_zeroed_page()返回一个指向新页的指针,并且将该页清零。__get_free_page( )返回一个指向新页的指针,但是该页不清零。__get_free_pages( )该函数返回一个指向几页的指针的首地址,分配的页数为2的oder次方,并且分配的页数也不清零。oder允许的最大值为10(即1024页)或者11(2048),具体依赖于硬件平台。释放的时候采用free_page( )。如果释放的oder 和申请的oder不一致,则会造成内存混乱。

(3)vmalloc()一般只存在于软件中的较大的顺序缓冲区的分配内存,vmalloc()远大于__get_free_page()的开销为了完成vmalloc,新的页表需要被建立。因此用vmalloc完成少量内存的申请是不妥的。

vmalloc不能用在原子上下文,因为他的内部实现时调用__GFP_KERNERL标志位的kmalloc来实现的。

(4)slab与内存池

在Linux系统中用页作为单元来申请和释放内存是很容易导致浪费。另外,在操作系统中,进程会涉及到大量的重复生成、释放问题。例如:inode,task_struct 等。slab 就是使得在前后两次使用时分配在同一内存区域,或者同一类内存空间,并且保留了基本的数据结构,就可以达到提高效率。

slab的使用流程如下:

注:slab 在底层虽然依赖于__get_free_page( )来实现,但是,申请到的以页为单位的内存空间分隔成更小的内存单元来管理,这样不会造成内存的浪费。在Linux中还有内存池的使用,同样用于大量的小对象的后备缓冲技术的使用。

linux设备驱动归纳总结(五):1.在内核空间分配内存【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...

linux设备驱动归纳总结(四):1.进程管理的相关概念【转】

本文转载自;http://blog.chinaunix.net/uid-25014876-id-64866.html linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxx ...

蜕变成蝶~Linux设备驱动之CPU与内存和I/O

那是世上最远的距离 思念让我无法去呼吸 你的一动和一举 占据我心里 陪我每个孤独无尽的夜里 用我心中盛放的画笔 描绘你微笑时的绚丽 爱让人痛彻心底 我却不怀疑 你的存在是我生命的奇迹 感受你的每一次的 ...

【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存

linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

【Linux开发】linux设备驱动归纳总结(五):2.操作硬件——IO内存

linux设备驱动归纳总结(五):2.操作硬件--IO内存 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

【Linux开发】linux设备驱动归纳总结(四):1.进程管理的相关概念

linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

linux设备驱动归纳总结(七):1.时间管理与内核延时【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxx ...

【Linux开发】linux设备驱动归纳总结(七):1.时间管理与内核延时

linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

浅谈Android系统移植、Linux设备驱动

一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

随机推荐

geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

目录 前言 实现过程 总结 一.前言        上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...

java第六次作业(老师讲过后)

import java.util.*; public class Draw { private ArrayList list; public Draw() { list= new ArrayList( ...

OpenStack

[官网]http://www.openstack.org/ [视频教程1]http://blog.csdn.net/u010973404/article/details/16841229 [视频教程2 ...

mdeditor

*在线地址:* http://ghosertblog.github.io/mdeditor/ # Markdown 语法简明手册 ### 1. 使用 * 和 ** 表示斜体和粗体 示例: 这是 *斜体 ...

[译]好程序员的五声“呐喊”

通常编程情况下,会导致软件项目变坏的一些列反应 原文:The five shouts of good programmers 在任何一天,在这个世界上都有软件项目正在失败,这很常见.常见到当软件产品按 ...

如何删除JAVA集合中的元素

经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...

CentOS编译PHP过程中常见错误信息的解决方法

原文链接:http://www.linuxidc.com/Linux/2014-05/102327.htm ********************************************** ...

bzoj 2588 : Spoj 10628. Count on a tree

Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...

oracle_基本SQL语言

一:DDL数据定义语言 1:create(创建)       创建表 CREATE TABLE ( column1 DATATYPE [NOT NULL] [P ...

Java框架之Struts2(一)

在学习Struts2之前,我们要知道Java为什么要有反射机制呢?反射机制可以说是填补Java不能动态访问某一个类的空白.利用反射机制,动态的创建一个对象.动态的访问类的某个属性,而且访问哪一个属性自 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值