iOS

iOS 系统内核架构

简介:本文参考《Mac OS X and iOS Internals: To the Apple’s Core》 by Jonathan Levin 文章内容主要是阅读这本书的读书笔记,建议读者掌握《操作系统》,了解现代操作系统的技术特点,再阅读本文可以事半功倍。 虽然iOS系统内核使用极简的微内核架构,但内容依然十分庞大,所以会分 系统架构、进程调度、内存管理和文件系统四个部分进行阐述。

该文章来源深入浅出iOS系统内核(1)— 系统架构

iOS架构分为4层:

  • UI层: 主要有SpringBoard、Spotlight等UI交互界面
  • 应用框架层:主要有 Cocoa Touch
  • 核心框架层:主要有 OpenGL、Quartz等图形、多媒体组件
  • Darwin:操作系统核心,包括XNU内核和UNIX shell

Darwin 架构:

Darwin的内核是XNU,XNU is Not Unix。XNU是两种技术的混合体,Mach和BSD。BSD层确保了Darwin系统的UNIX特性,真正的内核是Mach,但是对外部隐藏。BSD以上属于用户态,所有的内容都可以被应用程序访问,而应用程序不能访问内核态。当需要从用户态切换到内核态的时候,需要通过mach trap实现切换。
4367959-386cd3684a795453.png

XNU 包含:

  • Mach微内核
  • BSD层
  • libkern
  • I/O Kit

Mach

Mach 是 XNU的原子核,是一个微内核轻量级操作系统,仅处理最核心的任务

  • 进程和线程抽象
  • 任务调度
  • 进程间通讯和消息传递
  • 虚拟内存管理

BSD层

BSD层简历在Mach之上,确保了Darwin符合 POSIX 。提供了更高层次的功能,包括:

  • UNIX 进程模型
  • POSIX线程模型(Pthread)及相关的同步原语
  • UNIX 用户和组
  • 网络协议栈(BSD Socket API)
  • 文件系统访问
  • 设备访问(通过/dev目录访问)

libKern

I/OKit是C++ 编写的;为了支持C++运行时并提供所需要的基类,是一个內建的自包含的C++库。
I/O Kit
这是一个在内核中的完整的自包含的执行环境,让开发者可以使用C++快速创建设备驱动程序。

iOS 的安全机制

代码签名:使用SSL验证身份,通过发布者的私钥对公钥进行签名,来验证应用程序的来源以及在传输过程中是否被篡改
隔离机制(沙盒化):不受信任的应用程序必须在一个独立的隔间中运行,隔间实际上就是一个隔离的环境,在这个环境所有的操作都会受到限制,采用“黑名单”风格方法来阻止已知的危险操作,只有在列表具有足够的限制性时才有效果
Entitlement:更为严格的沙盒,采用“白名单”的方式,只允许那些已知是安全的操作,其他所有操作都不允许,替换当前沙盒机制中采用的“黑名单”方式

iOS沙盒模型 —— 图片引用自《深入解析Mac OS X & iOS 操作系统

MAC层:强制访问控制 Mandatory Access Control 是iOS沙盒机制的基础,控制应用程序只能访问指定的数据。属于 BSD 相关特性
MAC中的关键概念是label,label指的是一个预定义的分类,如果请求访问某个对象或者操作时没有提供匹配的label,那么MAC会拒绝访问请求。

用户态和内核态

内核态/用户态转换机制

用户态和内核态的转换机制有两种类型:

  • 自愿转换:
    当应用程序要求内核服务的时候,应用程序可以进行一个调用进入内核态,通过一个预定义的硬件指令可以开始进入内核态的切换。这些内核服务称为系统调用
  • 非自愿转换:
    当发生执行异常、中断或处理器陷阱的时候,代码的执行会被挂起,并且保留发生错误时候的完整状态。控制权被转交给预定义的内核态错误处理程序或中断服务程序(interrupt service rountine,ISR)

当用户态的程序需要内核服务的时候,会发出一个系统调用,系统调用将控制权转换交给内核。实现系统调用的方法有两种:

模拟中断:SVC和SWI指令
指令:SYSENTRY 和 SYSCALL

推荐阅读

目录