gzyueqian
13352868059

Linux培训机构揭秘Linux内存管理的世界

更新时间: 2019-04-16 16:33:34来源: 粤嵌教育浏览量:5407

       Linux是一个自由传播和免费试用的Unix操作系统。Linux可以运行UNIX工具软件、网络协议和应用程序,Linux是以灵活性和高效性著称的。因为它独特的设计结构,所以它是可以在昂贵和平价的网站上运行。那么Linux的内存管理是怎么样的呢?现在Linux培训机构就给大家讲讲。

  Linux高端内存的划分:

  内核直接映射空间 PAGE_OFFSET~VMALLOC_START,kmalloc和__get_free_page()分配的是这里的页面。二者是借助slab分配器,直接分配物理页再转换为逻辑地址(物理地址连续)。适合分配小段内存。此区域 包含了内核镜像、物理页框表mem_map等资源。

  内核动态映射空间 VMALLOC_START~VMALLOC_END,被vmalloc用到,可表示的空间大。

  内核映射空间 PKMAP_BASE ~ FIXADDR_START,kmap

  内核临时映射空间 FIXADDR_START~FIXADDR_TOP,kmap_atomic

  当我们需要order(1)的空闲页面块时,则执行以下步骤:

  1、初始空闲链表为:

    order(0): 5, 10

  order(1): 8 [8,9]

  order(2): 12 [12,13,14,15]

  order(3):


  2、从上面空闲链表中,我们可以看出,order(1)链表上,有一个空闲的页面块,把它分配给用户,并从该链表中删除。

  3、当我们再需要一个order(1)的块时,同样我们从order(1)空闲链表上开始扫描。

  4、若在order(1)上没有空闲页面块,那么我们就到更高的级别(order)上找,order(2)。

  5、此时(order(1)上没有空闲页面块)有一个空闲页面块,该块是从页面12开始。该页面块被分割成两个稍微小一些order(1)的页面块,[12,13]和[14,15]。[14,15]页面块加到order(1)空闲链表中,同时[12,13]页面块返回给用户。

  6、终空闲链表为:

  order(0): 5, 10

  order(1): 14 [14,15]

  order(2):

  order(3):

  因为内存映射先要获得被映射的物理地址,然后才能将其映射到要求的用户虚拟地址上。我们已经看到内核物理内存映射区域中的地址可以被内核函数virt_to_phys转换成实际的物理内存地址,但对于vmalloc分配的内核虚拟地址无法直接转化成物理地址,所以我们必须对这部分虚拟内存格外“照顾”——先将其转化成内核物理内存映射区域中的地址,然后在用virt_to_phys变为物理地址。

  转化工作需要进行如下步骤:

  找到vmalloc虚拟内存对应的页表,并寻找到对应的页表项。

  获取页表项对应的页面指针

  通过页面得到对应的内核物理内存映射区域地址。

  Linux内存管理的知识今天Linux培训机构就和大家讲解这么多了,想要学习Linux的更多知识,可以来我们粤嵌科技来咨询。

免费预约试听课