• MMU


             高性能处理器一般会提供一个内存管理单元(MMU),该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持

            TLB:Translation Lookaside Buffer,即转换旁路缓存,TLB是MMU的核型部件,它缓存少量的虚拟地址与物理地址的转换关系,是转换表的Cache,因此也经常被称为“快表”。

            TTW:Translation Table walk,即转换表漫游,当TLB中没有缓冲对应的地址转换关系时,需要通过对内存中转换表(大多数处理器的转换表为多级页表)的访问来获得虚拟地址和物理地址的对应关系。TTW成功后。结果应写入TLB。

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

           对于包含MMU的处理器而言,Linux系统提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。

           在Linux系统中,进程的4GB内存空间被分为两个部分--用户空间与内核空间。用户空间地址一般分布为0~3GB(即PAGE OFFSET,在0x86中他等于0xC0000000),这样,剩下的3~4GB为内核空间,如下图所示。用户进程通常情况下只能访问用户空间的虚拟地 址,不能访问内核空间的虚拟地址。用户进程只有通过系统调用(代表用户进程在内核态执行)等方式才可以访问到内核空间。

          每个进程的用户空间都是完全独立的、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程该表,是固定的。内核空间地址有自己对应的页表,内核的虚拟空间独立于其他程序。Linux中1GB的内核空间又被划分为物理内存映射区、虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区这几个区域

          在用户空间动态申请内存的函数为malloc(),这个函数在各种操作系统上的使用时一致的,malloc()申请的内存的释放函数为free()。

    malloc()的内存一定要被free(),否则会造成内存泄漏。理想情况下,malloc()和free()应成对出现,即谁申请,就由谁释放。

          在Linux内核空间申请内存设计的函数主要包括kmalloc()、__get_free_pages()和vmalloc等。kmalloc()和 __get_free_pages()(及其类似函数)申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏 移,因此存在较简单的转换关系。而vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而 vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。

          void *kamlloc(size_t size, int flags);

          给kmalloc()的第一个参数是要分配的块的大小,第二个参数为分配标志,用于控制kmallockmalloc()的行为。最常用的分配标志是GFP_KERNEL,其含义是在内核空间的进程中申请内存。kmalloc()的底层依赖__get_free_pages()实 现,分配标志的前缀GFP正好是这个底层函数的缩写。使用GFP_KERNEL标志申请内存时,若暂时不能满足,则进程会睡眠等待页,即会引起阻塞,因此 不能在中断上下文或持有自旋锁的时候使用GPF_KENNEL申请内存。

         使用vmalloc()不能用在原子上下文中

         I/O端口和I/O内存:

         设备通常会提供一组寄存器来用于控制设备、读写设备和获取设备状态,即控制寄存器、数据寄存器和状态寄存器。这些寄存器可能位于I/O空间,也可能位于内存空间。当位于I/O空间时,通常被称为I/O端口,位于内存空间时,对应的内存空间被称为I/O内存。

          mmap():

          般情况下,用户空间是不可能也不应该直接访问设备的,但是,设备驱动程序中可实现mmap()函数,这个函数可使得用户空间直接访问设备的物理地 址。实际上,mmap()实现了这样的一个映射过程:它将用户空间的一段内存与设备内存管理,当用户访问用户空间的这段地址范围时,实际上会转化为对设备 的访问。

          这种能力对于显示适配器一类的设备非常有意义,如果用户空间可直接通过内存映射访问显存的话,屏幕帧的各点的像素将不再需要一个从用户空间到内核空间的复制的过程。

  • 相关阅读:
    刷题总结——蚯蚓(NOIP2016DAY2T2)
    刷题总结——愤怒的小鸟(NOIPDAY2T3)
    算法复习——高斯消元(ssoi)
    算法复习——高精度集合
    刷题总结——系列维护(ssoi)
    刷题总结——传送带(四川省选)
    算法复习——数位dp(不要62HUD2089)
    算法复习——单调队列(sliding windows,ssoi)
    刷题总结——road(ssoi)
    linux命令学习笔记(61):tree 命令
  • 原文地址:https://www.cnblogs.com/reality-soul/p/6544606.html
Copyright © 2020-2023  润新知