0x00 内容简介

子贡问为仁。子曰:“工欲善其事,必先利其器。居是邦也,事其大夫之贤者,友其士之仁者。”
—《论语·卫灵公》

​ 在开始研究OSX内核以及与OSX相关知识之前,需要对OSX有一个比较全面的认识,将一些简单的概念搞清楚。

0x01 OS X 体系结构

1.1 OS X系统的整体体系结构

  • 用户体验( The User Experience layer ):为了研究内核做准备,赞不关心。
  • 应用软件开发框架(The Application Frameworks layer):Cocoa, Carbon, Java这些开发的API与运行时。
  • 核心开发框架(The Core Frameworks):图形和多媒体一类软件的开发环境。
  • Darwin:系统内核。

google了其他一些文章,分层也是基本差不多,可以参考此图:

1.2 Darwin体系结构

主要关心的其实还是Darwin这个模块,他的体系结构大致如下图所示:

这个图暂时看不懂也没关系,需要做到的知识储备有以下几点:

  • Darwin是苹果系统的一部分
  • Darwin是一种类似unix的操作系统,他的核心是XNU。
  • XNU是一种混合式内核。结合了machBSD两种内核。

1.3 XNU的简单概括

有以下4个主要的功能模块:

  • Mach微内核

  • BSD内核

  • libKern

  • I/O Kit

1.3.1 Mach微内核简介

Mach是作为传统UNIX内核的替代品出现的,因此其间的不同之处值得留意。当时的人们已渐渐感受到了早期UNIX中“一切皆文件”的抽象机制的不足,有限的扩展性使得开发者捉襟掣肘,苦不堪言。虽说贝尔实验室的Plan9在此方向上做了进一步努力,可是效果并不理想。现代操作系统需要更进一步的抽象[1]。

在XNU中主要完成以下几个功能:

  • 进程与线程的抽象
  • 虚拟内存管理
  • 任务调度
  • 进程间通信

1.3.2 BSD内核简介

BSD的实现在Mach的上层,这一层提供了一些流行的API,支持了POSIX。在XNU中主要实现了一些高级的API与模块。

  • UNIX进程模型
  • POSIX线程模型即pthread。以及相关的同步功能。
  • UNIX的用户与组管理
  • 网络栈(BSD Socket API)
  • 文件系统
  • 设备系统

1.3.3 libKern

libKern实现了一个C++的子集,为I/O kit 提供C++的实现。

1.3.4 I/O kit

I/O Kit 是XNU不同于其他传统系统的设备驱动框架。

IOKit是一个面向对象的驱动模型框架,它是早期DriverKit的一个翻版,Driver Kit是使用Objective-C写的,而IOKit是一个C++的驱动架构,它在DriverKit的基础上做了很大的改进,比如IOKit可以写在用户空间跑的驱动(虽然大多仍是跑在内核空间上的),因而驱动挂了而系统不会挂。另外IOKit考虑到了计算机发展的趋势,所以在电源管理、即插即用、动态加载上做得更好[2]。

1.4 APPs的文件结构

每一个应用程序都是这样一个大致类似的文件结构。

1.4.1 Info.plist

为了提供更好的用户体验,IOS 和 OS X的每个app或bundle都依赖于特殊的元信息(meta Information).

  • 直接向用户展示信息
  • 系统内部用来标识你的app或其支持的文档类型
  • 系统框架用来辅助app的加载

    每个application都使用Info.plist文件来存储以上的元信息,从名称上也可以判断出Info.plist就是以上提到的“属性列表”[3]。

1.4.2 Resources

就是APP需要的资源。与我们研究内容关系不大不多关注。

1.4.3 MacOS

这里存放的就是可执行文件

0x02 OS X使用的安全机制

2.1 代码签名

肤浅的理解就是确认APP是通过了苹果审核的,可以认为是没有恶意的。

摘录了一段比较详细的描述:

作为一个 iOS 开发者,在你开发使用的机器上应该已经有一个证书,一个公钥,以及一个私钥。这些是代码签名机制的核心。像 SSL 一样,代码签名也依赖于采用 X.509 标准的公开密钥加密。

在 OS X 上一个应用是否允许被开启是由 Gatekeeper 的选项决定的,你可以在系统设置的安全选项中改变选项。在 Gatekeeper 选项中选择 “受信任的开发者或者来自 Mac App Store” 会要求被打开的应用必须被证书签名,可以是 Mac App Store 开发者的应用发布证书也可以是开发者 ID 证书。这些选项是由一个系统工具 spctl 来管理的,它管理着系统的所有安全评估策略。

在 iOS 上规则是不一样的,无论是用户还是开发者都不能改变应用开启策略,你必须有一个开发者帐号或者应用发布证书才能让应用运行在 iOS 系统上[4]。

2.2 强制访问控制 (Mandatory Access Control)

FreeBSD 5.x最早引入,是OS X隔离机制(Sandboxing,沙盒机制)和iOS的entitlement机制基础。

强制访问控制(Mandatory Access Control——MAC),用于将系统中的信息分密级和类进行管理,以保证每个用户只能访问到那些被标明可以由他访问的信息的一种访问约束机制。通俗的来说,在强制访问控制下,用户(或其他主体)与文件(或其他客体)都被标记了固定的安全属性(如安全级、访问权限等),在每次访问发生时,系统检测安全属性以便确定一个用户是否有权访问该文件。

2.3 沙盒(sandbox)

沙盒是一种安全机制,为运行中的程序提供了一个隔离的环境。OS X的沙盒在启动的时候可以设置运行的程序是否可以访问网络、文件、目录等。

图片摘自这里[5]。

参考

[1].Mach — https://zh.wikipedia.org/wiki/Mach

[2].OSX系统编程环境的介绍 — http://www.tanhao.me/talk/440.html/

[3].IOS之Info.plist文件简介 — http://my.oschina.net/hmj/blog/104196

[4]代码签名探析 — http://http://objccn.io/issue-17-2/

[5]《深入解析Mac OS X & iOS操作系统》读书笔记 —http://blog.okeyang.com/blog/2015/07/24/shen-ru-jie-xi-mac-os-x-and-ioscao-zuo-xi-tong--du-shu-bi-ji/

​原文地址: http://turingh.github.io/2016/02/29/OS-X-%E5%86%85%E6%A0%B8%E7%A0%94%E7%A9%B6-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/

OS X 内核研究 准备知识相关推荐

  1. 开篇和第一章:Mac OS X内核故事之“N国语言”

    开篇声明:       1.写作动机和热情来自两方面:一是自乔帮主回归后,苹果公司经历了从濒临破产到全球市值第一的华丽转身,其产品风靡全球.我本人当了4年的苹果用户,3年的weiphoner,在坛子上 ...

  2. Spring内核研究-通过工厂注入

    Spring专门设计了对工厂模式支持,你可以使用静态工厂方法来创建一个Bean,也可以使用实例工厂的方法来创建Bean.下面分别介绍这2种方法. 静态工厂注入     定义一个Bean使用自己类上的静 ...

  3. 【知识图谱】本周文献阅读笔记(3)——周二 2023.1.10:英文)知识图谱补全研究综述 + 网络安全知识图谱研究综述 + 知识图谱嵌入模型中的损失函数 + 图神经网络应用于知识图谱推理的研究综述

    声明:仅学习使用~ 对于各文献,目前仅是泛读形式,摘出我认为重要的点,并非按照原目录进行简单罗列! 另:鉴于阅读paper数目稍多,对paper内提到的多数模型暂未细致思考分析.目的是总结整理关于KG ...

  4. 第二章:Mac OS X内核故事之三位一体:

    第二章:Mac OS X内核故事之三位一体(上)       乔帮主年轻的时候玩high了,弄出了人命,也就是他的女儿Lisa(话说这女儿果然像老爸):       尽管乔帮主一开始不愿意承认这个女儿 ...

  5. Freeswitch内核研究之sofia

    Freeswitch内核研究之sofia 呼叫流程涉及内容 1.收到A的nua_i_invite,返回407,具体如下: sofia_handle_sip_i_invite =>sofia_re ...

  6. 硬核 | 关于Linux内核的简明知识

    关注.星标公众号,直达精彩内容 来源 :头条号@Linux学习教程,冰凌块儿 01 前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是L ...

  7. 内核研究与嵌入式开发

    内与嵌的世界 初次使用博客 未来规划 带你入坑 今后会参考一些书籍和部分老师的课程,如果用到我会申明,若有侵权请及时联系本人,尽快删除本文 初次使用博客 今天是我使用博客的第一天,很激动,但不知道要说 ...

  8. rust 手动关闭子线程_从零开始写 OS (9) —— 内核线程

    上一篇 小源:从零开始写 OS (8) -- 创建页表​zhuanlan.zhihu.com 本章代码对应 commit :de86ae6e1e8bdfe3388530f82b2081fe29e40b ...

  9. linux内核研究(二)

    http://antkillerfarm.github.io/ Linux源代码编译 1)按照一般的linux教程上的说法,编译的第一步,是配置内核的编译选项.这时有几种方式可以选择:从命令行方式的m ...

最新文章

  1. Failed to fetch http://mirrors.cloud.aliyuncs.com/
  2. Spring Cloud应用开发(二:实现服务间的调用)
  3. RGPNET: 复杂环境下实时通用语义分割网络
  4. 6月20日截止,请勿错过热心肠奖学金!
  5. vue的基本项目结构
  6. 微信小程序开发---小程序框架---小程序的逻辑层---3
  7. ABI 大屏(示例布局)
  8. linux脚本猜数字游戏,101个shell脚本 猜数字游戏代码
  9. BIO、NIO、AIO,还傻傻分不清?
  10. SPSS时序全局主成分分析方法
  11. rufus制作UOS启动盘报syslinux-6.03下载错误
  12. Linux系统检测工具sysstat使用实战
  13. myqq框架 python插件
  14. php 判断是否为360浏览器,怎么判断浏览器是否是360浏览器
  15. C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
  16. 大数据教程:数据可视化(ECharts)
  17. IoC与DI工厂、单例、原型模式详解
  18. 俄罗斯套娃信封问题 转https://www.jianshu.com/p/9d9495ef4372
  19. 大龄程序员的前途在哪里?
  20. 数字杭电之抢课系统分析

热门文章

  1. 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)...
  2. 如何用极致业务基础平台做一个通用企业ERP系列之二一览表培训
  3. Webservice 或者HttpRequest请求的时候提示 “指定的注册表项不存在”错误 解决方案...
  4. A good memory allocator is everything that I need
  5. 机器学习导论(张志华):核定义
  6. UEFI+GPT安装Windows8和CentOS双系统
  7. 【随笔】从飞桨入门深度学习
  8. 330+ 个机器学习模型/库探索工具!Papers With Code 重磅推出!
  9. 获取含跨域网址的框架网页的源码
  10. 使程序不显示在任务栏上