当前位置: 首页 > Linux kernrl > 正文

Linux内核初探4

一.CPU特权级别:

现代CPU都提供了几种特权级别,每个特权级别都有各种限制。英特尔处理器区分4种特权级别,但Linux只使用两种用户状态:核心态和用户态。

从用户态到核心态的切换通过系统调用的特定转换手段完成。

虚拟和物理地址空间:将实际可用的物理内存映射到虚拟地址空间的区域,采取的方法:用页表来为物理地址分配虚拟地址。物理内存页经常称作页帧。页专指虚拟地址空间中的页。

页表:

用来将虚拟地址空间映射到物理地址空间的数据结构称为页表。对虚拟地址空间的每一页,都分配一个数组项,该数组项指向与之关联的页帧(物理内存)。实际为多级分页。一般用三级页表,Linux采用四级页表。

PGD                   PMD              PTE     OFFSET       虚拟地址

全局页表               中间页表          页表      页帧

索引进程中的一个数组   指针,指向下一级的数组   映射就此完成  

虚拟地址最后一部分称为偏移量。

此种机制的特色:对虚拟地址空间中不需要的区域,不必创建中间页目录或页表。

缺点:必须逐级访问多个数组才能访问到物理地址。

但也有相应的解决方法:

(1)      CPU中有一个专门的部分较MMU(内存管理单元)可以优化内存访问操作。

(2)      并且将最频繁访问的地址保存到称为地址转换后备缓冲器的CPU高速缓存中。

二.内存映射

         映射方法可以将任意来源的数据传输到进程的虚拟地址空间中。作为映射目标的地址空间区域可以像普通内存那样用通常的方法访问。

物理地址的分配:

         在内核分配内存时,必须记录页帧的已分配或空闲状态,以免两个进程使用同样的内存区域。将整个大的完整的页帧内存划分为更小的部分的工作则委托给用户空间中的标准库,其将来源于内核的页帧拆分为小的区域,并为进程分配内存。

另外(伙伴系统简介)

目的:快速检测内存中的连续区域。

系统中的空闲内存块总是两两分组,每组中的两个内存块称作伙伴。伙伴的分配可以是独立的。但如果两个伙伴都是空闲的,内核将其合并为一个更大的内存块,作为下一层次上某个内存块的伙伴。

在应用程序释放内存时,内核可以直接检查地址。

三.SLAB缓存

目的:将伙伴系统提供的页划分为更小的部分。为频繁使用的对象实现了一个一般性的缓存SLAB缓存。

方法与实现:

对经常使用的对象,内核定义了只包含了所需类型对象实例的缓存

对通常情况下小内存的分配,内核针对不同大小的对象定义了一组SLAB缓存。

其与伙伴系统进行交互保持

四.页面回收和页面交互

页面交换通过利用磁盘空间作为扩展内存,从而增大了可用的内存。通过缺页异常机制,这种切换操作对应用程序是透明的。

页面回收用于将内存映射被修改的内容与底层的块设备同步,为此有时也简称为数据回写。

版权声明:本文为博主原创文章,未经博主允许不得转载。

]]>

本文固定链接: http://zmrlinux.com/2015/03/27/linux%e5%86%85%e6%a0%b8%e5%88%9d%e6%8e%a24/ | Kernel & Me

该日志由 root 于2015年03月27日发表在 Linux kernrl 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Linux内核初探4 | Kernel & Me