Linux系统下内存申请应用的方法原理总结
1. 地址空间的管理
物理地址都是有内核管理的, node-->zone-->mem_map-->page, 所有的物理页面都在mem_map数组中的页帧对应, 然后不同的page有分为DMA,normal,highmem三个zone。
内核线性地址空间, 实际上只是低端内存才有线性地址,0---896MB部分。
内核虚拟地址, 低端内存的虚拟地址与线性地址是一样的。 高端内存只有在映射了以后才有虚拟地址
用户空间地址, tast_struct ---> mmap --> mm_struct ---> vm_area_struct
2.内存的申请或使用
物理内存的分配, 在内核中最终都要调用__alloc_pages().它是最核心的分配函数,申请大小最大不超过2的MAX_ORDER次幂,在现在好像最大定义为4MB。
线性地址, kmalloc和get_free_pages,线性地址, 对应的物理内存就是低端内存,kmalloc是基于slab的分配技术, 最大不能超过128KB。
虚拟地址, vmalloc申请, 他只是在内核中建立类似与用户空间的vm_area的一个虚拟内存空间到vmlist中, 最终的物理内存分配还是基于缺页的。
用户空间的虚拟内存, malloc之类的, 最终在内核中都是do_map()和do_brk()。实际上也只是建立了一块虚拟空间,最终的物理内存还是在缺页异常时分配的。
3. 内存的交换问题
在page结构和用户层的vm_area_struct结构中, 都包含locked和reserved标志。通过合适的途径设置这些标志, 可以是页面锁存在物理内存中, 不被交换出去。
4. 设备内存可以通过ioremap映射到内核虚拟地址空间, 也可以通过mmap方法映射到用户空间。
相关文档:
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
25.2.1 Linux内核USB驱动框架
图25-2是Linux内核从主机和设备两个角度观察USB总线结构的示意图。
从图25-2中可以看出,Linux内核USB驱动是按照主机驱动和设备驱动两套体系实现的,下面介绍两套体系的结构和特点。
1.基本结构
图25-2的左侧是主机驱动结构。主机驱动的最底层是USB主机控制器,提供了OHCI/EHCI/UHC ......
最近在做云计算,接触到一些虚拟化的技术,所以想测试一下虚拟机的性能到底如何,这里给出一个方法,利用UnixBench来为服务器做性能测试。 1: wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz
2: tar -xzvf unixbench-5.1.2.tar.gz
3: cd unixbench-5.1.2.tar.gz
4: ......
第3章 Linux基本配置
安装完操作系统后,常常需要做一些基本配置,以满足自己的需求。随着Linux桌面的日趋成熟和人性化,这种所谓的“基本配置”已经越来越少了。本章选择了入门用户最常问到的一些问题,以便读者能够尽快上手。 ......