ios内存管理(七):物理内存与虚拟内存

  编写程序时,对内存的维护非常重要,所有的程序都依赖于其操作的内存,可以说快速高效的程序和糟糕出错的程序之间的差距可能主要就在于是否进行正确的内存管理。

  类似于其他主流操作系统,ios上也提供了两种类型的内存分配:一种是基于栈的内存分配,另一种是基于堆的内存分配。基于栈的内存分配通常由编译器处理,因为栈中填充的通常都是程序的自动变量;而动态内存分配一般都在堆上进行。

  在最开始的几节还提到过,对于每一个进程来说,其独自享有一个私有的地址空间,这个地址空间可以通过LC_SEGMENT命令填充可执行文件以及各种库的代码。整个地址空间分为保护段、代码段、dyld段、数据段等。不同进程的内存地址空间相互独立,互不影响。

  顺便相关的还有ASLR技术:地址空间布局随机化。进程在自己的私有的虚拟地址空间中启动,按照传统的方式,进程每一次启动都采用固定的可预见的方式。然后这也意味着某个给定程序再某个给定架构上的进程初始虚拟内存镜像都是基本一致的。更加严重的问题是,即使是在进程正常运行的生命周期中,大部分内存分配的操作都是按照同样的方式进行的,因此使得内存中的地址分布具有非常强的可预测性。这就给黑客提供了很大的施展空间。黑客可以可靠的判断要重写那些指针,判断注入代码应该在内存的什么位置,从而通过缓存区溢出等技术,重写内存中的函数指针,将程序的执行路径转到自己的代码。ASLR是一种避免类似攻击的有效保护。进程每一次启动时,地址空间都会被简单地随机化:进行整体的地址偏移,而不是搅乱。通过内核将整个进程的内存空间“平移”某个随机数,进程的基本内存布局如程序文本、数据、库等相对位置仍然是一样的,但其具体的地址都不同了,可以比较有效的阻挡黑客对地址的猜测。

  上面提到的堆和栈、地址空间和ASLR等技术,背后都隐含着一个概念:虚拟内存。基本所有的现代操作系统都有虚拟内存的概念,相对的就有物理内存的概念。物理内存就是实打实的存放数据的硬件,虚拟内存是在物理内存上的一层与具体硬件无关的抽象。显而易见,用户态不可能也不应该和物理内存层打交道。

  Mach的虚拟内存子系统可以说和其要管理的虚拟内存一样复杂和充满了各种细节,下面简单介绍一下物理内存层和虚拟内存层这两个层次。

  尽管我们写程序时不关注物理内存层,但任何内存地址最终还是要翻译为物理地址。机器的RAM实际上是虚拟内存中开的窗口,允许程序访问虚拟内存中有限的而且通常是不连续的区域。对Mach来说,物理内存层最重要的一个概念为pmap。pmap从设计上对物理内存提供了一个统一的接口,屏蔽了架构相关的区别,这对于支持像X86架构或者ARM架构非常重要。pmap在逻辑上由两个子层构成:一是机器无关层,提供了一组基本上和机器无关的API。这些API只要求机器支持基本的虚拟内存分页概念。二是机器相关层,将pmap绑定到一个具体的实现,处理底层架构的各种细节。这一层主要是各种和硬件相关的宏定义,如页表项宏、位掩码、寄存器等等。从面向对象的角度看,机器无关层类似pmap提供的接口,而机器相关层则是pmap的实现。只要接口不变,那么上层逻辑可以完全不用考虑具体的实现细节。因此,pmap的实现细节对于其上层的系统来说是透明的,这样可以最大化实现可移植性,缺点就是损失一部分性能。

  虚拟内存层完全以一种机器无关的方式来管理内存,这一层有几种关键的抽象:一是vm_map,表示任务地址空间的一个或多个虚拟内存区域。每一个区域都由一个独立的条目vm_map_entry表示,这些条目由一个双向链表vm_map_links维护。二是 vm_map_entry,这是关键的数据结构,每一个该结构都表示了虚拟内存中的一块连续的区域,每一个这样的区域都可以通过指定的访问保护权限进行保护。任务之间可以共享区域。它通常指向一个vm_object,也可以指向一个嵌套的vm_map,即子映射。三是vm_object,用于将vm_map_entry和实际支撑的内存关联起来。这个数据结构包含一个vm_page的链表,还包含一个用于访问正确分页器的Mach端口,通过这个分页器进行页面的获取或清理操作。四是 vm_page,真正表示完整的或部分的vm_object,并含有各种页状态。这些数据结构加上其状态管理,再加上换页算法,基本就是虚拟内存系统的主要内容。这些实现非常复杂,没法在这里展开了。

  总之,我们平常所说的各种内存概念基本都是在用户态的针对虚拟内存层的。操作系统帮我们屏蔽了复杂的硬件实现。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容

  • 操作系统对内存的管理 没有内存抽象的年代 在早些的操作系统中,并没有引入内存抽象的概念。程序直接访问和操作的都是物...
    Mr槑阅读 16,662评论 3 24
  • 本文参考《Mac OS X and iOS Internals: To the Apple’s Core》 by ...
    darcy87阅读 4,813评论 0 10
  • 从开始察觉老公不正常的时候,我对他每天的行为格外注意!他每天去哪里我会一直追问,一直给他打电话,就算他是跟朋友在一...
    郑家菇凉阅读 378评论 0 0