MacOS 内核开发基础

676 阅读7分钟

一、内核相关术语名称对应解释:

  1. 微内核(Microkernel):
    • 微内核将系统分为独立的模块,每个模块负责特定功能,如内存管理、文件系统和进程管理等。
    • 用户模块和内核服务模块通常在不同的地址空间中运行,这提高了系统的隔离性和安全性。
    • 当内核中的一个服务模块崩溃时,不会影响整个系统的正常运行,增强了系统的健壮性。
    • 微内核的扩展性好,可以通过建立新的服务到用户空间中而不影响内核空间,便于移植性和扩展。
  2. 宏内核(Monolithic Kernel):
    • 宏内核将大部分系统功能直接实现在内核中,减少了进程间通信的需求。
    • 执行效率高,因为它减少了进程间通信可能导致的性能损失。
    • 由于内核包含了所有系统功能,其代码量大,可能导致可靠性问题和安全性问题。
    • 宏内核的扩展性较差,如果想要添加新功能,可能需要对内核的多个模块进行修改 总结:宏内核的用户服务和内核服务都保存在相同地址空间中,它们都由内核统一管理(相当于一个内核,统一管理所有服务,所以执行效率高,但是耦合度也高,不容易扩展);微内核的用户服务和内核服务保存在不同的地址空间中,微内核会根据功能服务划分不同的进程(这样进程服务高度模块化,互相之间不会影响,但是效率也会相应降低) 直观如下图:引用博文

截屏2024-01-31 11.29.08.png

二、 MacOS系统架构详解:

截屏2024-02-01 10.39.47.png

2.1总体介绍:MAC OS系统简单的划分就是把其操作系统分为四个层次,分别为应用层,应用框架层、核心框架层,Darwin(核心)(如上图),按照空间就可以划分为用户空间,内核空间,硬件和固件;下面分别介绍该系统架构:

以下包括上图均为个人理解,如有错误还请留言指正

用户空间:

  1. 应用层:包括用户能接触到的图形应用,如 Spotlight(系统自带搜索栏)、Aqua(Aqua是Mac电脑全新用户界面的名字,早期Mac没有)、SpringBoard(苹果iDevice的桌面) 等。
  2. 应用框架层:此层包含2部分,一部分是API接口,此部分实现其实很多都是在核心框架层实现;一部分是应用服务
    • API接口:BSDapi,Cocoa/CocoaTouch,Carbon,Java(10.7版本后已经废弃)
    • 应用服务:Quartz,OpenGL,CoreGraphics,QuickTime,CoreAudio等

API编程接口: 从上图我们看出OS X是一个分层体系。Darwin核心及核心服务层与应用层之间,苹果提供了很多重要的API接口,以方便用户调用相关系统服务,其中最重要的是Cocoa/CocoaTouch,分别用于macOS和iOS,功能基本相同,其CocoaTouch多了触控相关专用GUI元素。(后面单独介绍Cocoa/CocoaTouch)

  • BSDAPI:BSDAPI 是访问低级文件的途径,并且可用于访问部分设备。与Cocoa不同,BSD API不支持编写有图形界面的应用程序。
  • POSIX线程API:即pthreads,早期线程操作使用。
  • Carbon:目前已基本弃用,它是基于C语言的API和Cocoa功能相似,主要用于较早期系统。
  • JAVA:已经完全废弃移除。

应用服务(篇幅有限只简单介绍几个):

  • Quartz:由Quartz 2D API 和 Quartz Compositor 组成,Quartz Compositor提供图形窗口服务。Cocoa Drawing提供基于Quartz的面向对象接口,用于Cocoa应用程序
  • OpenGL:开发3D应用程序的行业标准API。iOS支持的OpenGL版本为OpenGL ES,它是OpenGL的一个子集,专门为嵌入设备而设计。
  • CoreGraphics:CoreGraphics是苹果的⼀个二维绘图框架,CoreGraphics的API是纯C语⾔的。主要用于各种绘制各种复杂图形,实现更丰富的界面。
  • QuickTime:处理多媒体的高级库。支持音频视频(包括专业格式)的录制和回放。
  • CoreAudio:支持音频回放、录制、混合和处理。

3.核心框架层:为应用层提供基础的系统服务,比如数据存储框架Core Data、安全服务Security、网络访问CFNetwork等,以及最重要的Foundation和CoreFoundation等。

内核空间:(知识点主要来自OSX与iOS内核编程一书及网络)

macOS的内核空间主要就是指Darwin,但是注意严格的说macOS的内核指的是XNU。Darwin 不只包含内核,还包括其他东西。XNU是macOS 的核心部分,它是一款结合了微内核与宏内核特性的混合内核,它包括三个部分:Mach、BSD 和I/O Kit。其中mach 是微内核,BSD可以看作是一个搭建在mach之上的一层(也可以说是包在mach外面的一层)。

  1. System utilities: 这个里面基本就指一些Unix系统工具,例如命令行工具:这些Unix 工具一些是Apple 开发,一些来自于第三方,比如FreeBSD Project、GNU Project、Apache
  2. XNU内核:XNU内核是macOS和iOS的核心,主要由3个部分组成的分层体系结构。其中最内层就是mach微内核。mach仅提供一些基础服务,如处理器管理和调度,还有IPC(inter-process communication,进程间通信),IPC是mach的核心。iOS和Mac的XNU基本没有区别。 截屏2024-02-01 14.20.13.pngXNU架构简图如上
  • mach: XNU 中的Mach 来自于OSFMK 7.3 (Open Software Foundation Mach Kernel))它负责CPU 调度、内存保护等功能。它是macOS 内核中最重要的部分XNU 中大部分代码来自于它,而且macOS 中的可执行文件也是mach-o 格式。同时它也为上层BSD,I/O Kit 提供底层服务。进程间通信(IPC)是Mach设计的核心原则。Mach中的IPC作为客户端/服务器系统实现一个任务(客户端)可以请求另一个任务(服务器)的任务。
  • BSD: BSD层位于Mach 的上面一层,实现许多核心操作系统的功能,这些功能大部分都建立在mach服务之上。在iOS和OS X中,BSD层与处理器一起运行在特权模式中,而不是作为用户任务运行,它主要调用mach的服务,因此BSD层并没有内存保护,并且运行在与mach和I/O kit相同的地址空间中。BSD层主要提供进程管理、系统调度、文件系统和网络连接等服务。
  • I/O Kit:这是开发者接触使用最多的一部分。也是XNU分层架构最靠外的一层。它是一个面向对象的框架,用于编写设备驱动程序及其他内核扩展。I/O Kit对系统硬件进行抽象,预定义了多种类型的硬件基类,让开发新的驱动程序变得容易。IOKit框架包含内核层框架- libkern该框架使用嵌入式C++(C++的子集编写而成和用户空间框架IOKit.framework,该框架基于C语言编写。I/O Kit 有3个主要概念:
    • 家族:家族表示特定设备类型的抽象。例如,IOUSBFamily负责处理所有支持USB相关设备的技术实现。
    • 驱动程序: 负责管理特定的设备或总线,一个驱动程序可以关联多个family。例如基于USB的存储设备,它就依赖IOUSBFamily和IOStorageFamily。
    • 块:块是可控制实体(如PCI或USB设备)的接口,驱动程序通过它与设备进行通信。

libkern:很重要的库,为驱动程序提供很多基类。更确切的说是为内核及内核扩展提供很多功能抽象类。除了一些标准的C++运行库,libkern还提供其他很有用的类,最基础的就是OSObject,这是IOKit每个类的基类。它很像Cocoa和Cocoa Touch 中的NSObject。OSObject 也支持引用计数,来对内存管理提供帮助。其他相关类OSDictionary、OSArray、OSString、OSInteger 这些也基本对应NS 开头对应的数据类型。

硬件和固件:

此部分内核开发基本用不上,主要是底层硬件启动和加载。了解support.apple.com/zh-cn/guide…