Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335240
  • 博文数量: 106
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-10 08:32
文章分类

全部博文(106)

文章存档

2016年(11)

2015年(93)

2013年(2)

分类: LINUX

2015-08-19 19:29:47

    应用层的程序需要任何时刻都能以应用程序自己设定的地址访问数据,并且应用程序应该只能知道自己的地址。利于MMU,Linux内核需要对所以应用层任务的寻地址空间进行管理,这部分就形成了virtual子系统层中的virtual  memory。当然对虚拟地址空间的管理不只是管理地址,同时还要管理相应空间中存放数据及数据的属性,不同性质的数据在地址空间中不应该有交叉和重叠。虚拟地址地址空间是和task相关联的,并且其中的数据是有分别的,没看虚拟空间中存放的数据都有不同的属性和操作方式。
    物理内存究竟如何管理是要考虑粒度的:如果粒度过大,就会有粒度内部浪费的问题;如果过小,就会消耗更多的资源来进行管理。权衡下来,硬件的体系结构通常犟嘴掉的内存管理单元定义成页(page),把页大小(即:粒度)的设置留给系统软件来完成。可以由系统软件根据管理的物理地址空间以及内存的大小来进行设置。arm就可以设置4KB或者64KB不同的页大小。当然,仅仅是通过页管理是不能满足所有模块对呢次使用的需求,这就需要在页的管理之上将数据进行结构的和粒度的管理,这在Linux内核逻辑层中形成了slab内存管理。为内核其他模块提供管理内存的结构。slab分为:kmem_cache(提供了结构化的内存管理)和kmalloc(提供了细粒度的内存管理)两种方式。
    arm下的mmu实现过程中的各级页表也都存放在内存中,一级页表的地址存放在系统寄存器中,对进程的切换同意需要切换页表。对应cpu来说,只要有页表mmu,就能通过虚拟地址完成时间物理地址的具体操作,cpu本身并不需要对虚拟空间进行管理。虚拟空间管理则是完全针对虚拟地址进行的。并且由于虚拟地址和task是关联的,所以,实际上,虚拟空间管理在Linux内核中就是对所以用户进程虚拟空间的管理。
阅读(813) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~